[C++, CPP 教學 教程 教材 Tutorial] 運算子(Operator)
YehYeh\'s Notepad yehyeh@gmail.com 

[C++, CPP] 運算子(Operator)

運算子(Operator)

  • 運算式(Expression)運算子(Operator)運算元(Operand)組合而成
    • 一元運算子:需要1個運算元的運算子
    • 二元運算子:需要2個運算元的運算子
    運算式=運算元+運算子
  • 運算子的結合性(Associativity)
    • 左結合性(Left to Right):由左運算至右
      • //如果先計算5*3=15,再計算15/2,由左計算至右,就叫左結合性
        5*3/2  ⇒  (5*3)/2  ⇒  15/2 = 7.5
        
    • 右結合性(Right to Left):由右運算至左
      • //如果先計算3/2=1.5,再計算5*1.5,由右計算至左,就叫右結合性
        5*3/2 ⇒ 5*(3/2)  ⇒  5*1.5 = 7.5
        
    • 大部份的運算元都是左結合性,除了只有一元運算子複合運算子指派運算子
      • ++、--、~、!、sizeof、*=、/=、+=、=
        
  • 算數運算子:「 +、-、*、/、%」
    • C++中的算數運算子都是具左結合性的二元運算子
    • +:加法
    • -:減法
    • *:乘法
    • /:運算子皆為整數時會執行整數除法,自動去掉餘數,如果有一個以上的運算元為浮點數時,結果就會保留小數部份,如果將結果指派到整數變數時,則會被隱式轉型自動轉為整數
      • float a = 10;
        int b = 3, c = 0;
        c = a/b;              // 隱式轉型成整數
        cout << a/b << endl;  // 顯示3.33333
        cout << c;            // 3
        
    • %:模數(Modulus),取餘數,只能用在整數
      • int a = 10, b = 3;
        cout << a % b;      // 10/3 = 3...1 ⇒ 顯示1
        
  • 算術運算的優先權
    1. 小括號( )
    2. 運算子優先權(EX: 先乘除,後加減)
    3. 由左到右計算,即左結合性
  • 指派運算子(Assignment Operator):「 = 」
    • =是指派運算子,可以將值指派給變數
    • 右結合性
    • int num = 5;          //將5指派給int型態的變數num
      int num2 = num1 = 5;  //將5先指派給num1,再將num1指派給num2
      
  • C++除法的運算子皆為整數時是整數除法且具左結合性,所以計算結果和一般四則運算不同
    • 5 * 3 / 2 = 7
      5 * ( 3 / 2 ) = 5
      5 / 2 * 3 = 6
      
  • 相等運算子(Equality Operator):「==
    • 比較2個運算元是否相等
    • cout << (5 == 3);   //false ⇒ 顯示0
      
  • 關係運算子(Relational Operator):「 <、<=、>、>=、==、!=
    • 比較兩運算元的值,字元的話會以ASCII碼做比較,會傳回結果true(1)或是false(0)
    • 在C++中=用來指派,而==用來做關係比較,不可混用
    • bool  a = 3 < 5;      // a=true
      bool  a = 5 < 3+4;    // a = true,先做3+4=7,再做5<7的比較
      bool  a = 'A' < 'B';  // a=true,A的ASCII碼65小於B的ASCII碼66
      
     
    運算子 說明範例
    ==相等a == b
    !=不相等a != b
    >大於a > b
    <小於a < b
    >=大於等於a >= b
    <=小於等於a <= b
  • 遞增、遞減運算子:「 ++--
    • ++將運算元的值加一
    • --將運算元的值減一
    • 前置(Prefix):運算子若在運算元右邊,則在執行敘述前執行
    • 後置(Postfix):運算子若在運算元左邊,則在執行完敘述後執行
      • int  num = 5;
        
        //先執行印出a的動作,再執行a++
        cout << a++; //執行前a=5,印出5,執行後a=6
        
        //先執行a++的動作,再執行印出a
        cout << ++a; //執行前a=6,印出7,執行後a=7
        
    • 一個敘述中,不應多次改變一個變數的值,會依不同的編譯器產生不同的結果 不易閱讀且可能產生非預期結果
      • 一個敘述中,不應對一個變數加上多次前置的運算子
      • 一個敘述中,不可對一個變數同時加上前置的運算子,和指派運算子
        • int  num = 5;
          num = ++num * 3 + --num * 3;
          
        • 不同編譯器,產生的結果可能有4種:
          1. 編譯錯誤
          2. 用num=5執行++num和--num num=30
          3. 用num=5執行++num,再用num=6執行--num num=33
          4. 用num=5執行--num,再用num=4執行++num num=27
  • 真值表:下面是四個基本邏輯運算的真值表
    真值表
    • 真值表查法: EX: 0 AND 1 = 0
      0 and 1 真值表查法
  • 邏輯運算子(Logical Operator):「&&、||、!
    • 對運算元做邏輯運算,結果只會是true(1)或是false(0)
    • 若運算元為非布林值的整數,則0視為false非0值的值視為true
    • &&:對運算元做AND運算
    • ||:對運算元做OR運算
    • !:對運算元做NOT運算
    • true & false 	⇒ false
      true & true 	⇒ true
      5 & 3 		⇒ true
      5 & 0 		⇒ false
      5 & -5 		⇒ true
      true || false 	⇒ true
      false || false 	⇒ false
      !false 		⇒ true
      !true 		⇒ false
      
  • 位元運算子(Bitwise Operator):「&、|、^、~、<<、>>
    • 只能處理整數值,如short、int、long、char,不可處理float或double
    • ~:對位元做Not運算
    • <<:對位元做左移運算,移出的值直接捨去
      • 若移出值皆為0,左移1位相當於運算元的值 * 2
      • 負數左移可能會改變正負號
    • >>:對位元做右移運算,移出的值直接捨去
      • 若移出值皆為0,左移1位相當於運算元的值 / 2
      • 有號數時通常左邊會以符號位元填補,使結果保持相同正負號,但有些編譯器可能會用0填補
    • &:對位元做And運算
    • ^:對位元做XOR運算
    • |:對位元做Or運算
  • sizeof運算子:取得資料型態或變數所佔的位元組數
    • sizeof(型態)
      • cout << sizeof(int);
        
    • sizeof 變數名稱
      • int  number = 5;
        cout << sizeof nubmer;
        
  • 複合指派運算子:用一個運算子同時執行指派運算子和算術運算子或位元運算子的功能  
    運算子 範例說明
    += a += 3 a = a + 3
    == a -= 3 a = a - 3
    *= a *= 3 a = a * 3
    /= a /= 3 a = a / 3
    %= a %= 3 a = a % 3
    <<= a <<= 3 a = a << 3
    >>= a >>= 3 a = a >> 3
    &= a &= 3 a = a & 3
    |= a |= 3 a = a | 3
    ^= a ^= 3 a = a ^ 3
  • 運算子優先權(Precedence)   
    優先權 運算子結合性說明
    1 static_cast( )
    2 ++ 左右 遞增,後置優先權大於前置
    3 -- 左右 遞減,後置優先權大於前置
    4 ( ) 小括號
    5 ! 邏輯Not
    6 ~ 位元Not
    7 - 負號
    8 + 正號
    9 sizeof 取位元組數
    10 *、/、% 乘、除、取餘數
    11 +、- 加、減
    12 <、<=、>、>= 小於、小於等於、大於、大於等於
    13 ==、!= 等於、不等於
    14 &、^、|、<<、>> 位元AND、位元XOR、位元OR、位元左移、位元右移
    15 &&、|| 邏輯AND、邏輯OR
    16 = 指派
    17 *=、/=、%=、+=、-=、<<=、>>=、&=、^=、|= 複合指派
    • int  num1 = 5;
      int  num2 = ++num1 * 3;  // num2= 18
      
  • 條件運算子(Conditional Operator):又稱三元運算子(Ternary Operator)
    • 條件 ? 條件成立時回傳的結果 : 條件不成立時回傳的結果
    • int z = x > y ? 5 : 7;    //若x大於y,就將5指派給z,否則就將7指派給z
      cout << ( num % 2 == 0 ? "偶數" : "奇數" ) << endl;
      cout << (  myFunc(num) ? "函式執行結果正確" : "函式執行結果錯誤" ) << endl;
      
  • 混合運算式
    • 一般電腦只能執行相同型態的運算,不同型態運算元的運算稱為混合運算式
    • 若執行不同型態的運算,則較小型態的運算元需先轉換成另一運算元型態
      • 運算元含不同浮點數型態 精確度較小者提升
      • 運算元含整數和浮點數 整數提升成浮點數
      • 運算元含不同的整數型態 值域較小者自動提升
      • 運算元含列舉型態 轉換成適當的整數行態