國立屏東大學 資訊工程學系 物件導向程式設計
算術運算子就如同我們一般在數學式子中,所使用的運算符號,例如加減乘除等。table 1為C/C++語言支援的算術運算子:
等號「=」被稱為C/C++語言的指定運算子(assignment operator),用以將等號右方的值指定(assign)給等號左方,我們將其稱為是右關聯(right associativity)的運算子。例如:
要注意的是,若等號左右兩邊的資料型態不一致時,C/C++語言會進行自動的型態轉換,例如:
假設宣告有:
int i; float j; i = 83.34f; // i = 83 j = 136; // j=136.0
在一個運算式中,有時可以出現一個以上的等號,例如:
等同於
請考慮以下的程式片段,想想看其輸出結果為何?
i = 1; k = 1 + (j=i); cout << i << ", " << j << ", " << k << endl;
假設i=3,考慮以下的運算式:
其結果是先進行等號右邊的運算,得到結果為5後,將數值5給定到等號左邊的變數i,因此,最後i的值等於5。針對這種情形,C/C++語言提供複合指定(compound assignment)運算子,例如 「+=」,上面的運算式可重寫為:
其它常見的複合指定運算子,還有 -=, *=, /=與 %=。這些複合指定運算子為右關聯,請考慮下列的運算式:
等同於
當我們需要將某個變數的值遞增時,可以寫做:
i = i + 1; 或 i += 1;
但是C/C++語言還提供++與--這兩個運算子,分別是
我們可以把i=i+1或i+=1,改寫為:
i++;
同理,還有i- -可以遞減i的數值。但是++與- -可以選擇為prefix operator或postfix operator,視其寫在變數的前面或後面而定。放在前面,例如++i,會先遞增i的數值,然後再傳回新的i的數值;但寫在後面,例如i++則會先傳回i現有的數值,然後才將i的值遞增。
考慮以下的程式碼,想想看輸出的結果為何?
i=1; cout << ++i << endl; cout << i << endl; cout << i++ << endl; cout << i << endl;
sizeof運算子可以計算型態或變數等的記憶體空間,其用法有二:在sizeof後接一組括號並在其中放置要計算空間的對象,或者直接在sizeof後放置欲計算空間的對象(無須括號),請參考下例:
using namespace std; #include <iostream> int main() { char *month[]= {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; cout << "Size of char type = " << sizeof(char) << " byte." << endl; cout << "Size of month array = " << sizeof month << " bytes." << endl; return 0; }
關係運算子是一個二元的運算子,用以判斷兩個運算元(數值、函式、變數或運算式)之間的關係,其可能的關係有﹕大於、小於、等於、或不等於。C/C++語言提供以下的關係運算子,如table 2:
雖然我們已經提過:C/C++語言將數值0視為false,並將其它所有非0的數值視為true。但關係運算子會以數值0代表運算結果為false,以數值1代表true。還要注意關係運算子較算術運算子的優先順序低,所以像是 x + y < i - j 等同於 ( x + y ) < ( i - j )。在C/C++語言中,x < y < z等同於 ( x < y ) < z,因為關係運算子為左關聯。假設x=1, y=3, z=5: x<y<z ⇒ ( x < y ) <z ⇒ 1 < z ⇒ 1。要注意的是C++已提供了bool型態,因此也可以直接使用true或false來代表運算的結果。
相等運算子是一個binary運算子,用以判斷兩個運算元(數值、函式、變數或運算式)之值是否相等。C/C++語言提供以下的關係運算子,如table 3:
同樣地,相等運算子會以數值0代表運算結果為false,以數值1代表true。還要注意相等運算子與關係運算子一樣,其優先順序都較算術運算子來得低。
<note important>是 == , 不是 = 。 千萬不要將比較兩數是否相等的==寫成=,這實在是一個常常會遇到的錯誤!建議您以後如果遇到程式執行結果錯誤,但找不出任何問題時,試試檢查一下所有的 = 與 ==,有很高的機會可以改正您的程式。</note>
邏輯運算子共有以下三種,如table 4:
其運算結果請參考table 5的真值表:
假設變數score代表c語言的修課成績,以下的邏輯運算即為檢查成績是否介於0~100:
((score >= 0) && (score <=100))
C/C++語言還有提供一種特別的運算子,稱為條件運算子(conditional operator),可依條件決定運算式的傳回值,其語法如下:
expression1 ? expression2 : expression3
運算式的運算結果expression1的值為true(非0的數值)或false(數值0)而定,當expression1為true時,傳回expression2的值;否則當expression1為false時,傳回expression3的值。事實上,這等同於下面的if敘述:
if (expression1) result = expression2; else result = expression3;
條件式敘述有可能是因為像「如果expression為真則…. 否則….」這樣的述敘,在程式中出現的機會很高的緣故吧!請參考以下的應用:
int x=1, y=2, z; if(x>y) z=x; else z=y;
上面這段程式碼是令z為x與y兩者中較大的值,如果以條件運算式改寫,則只要寫成
z= x>y ? x: y;即可,是不是簡化很多?下面這行程式,假設score為學生成績,則可以簡單地檢查score是否大於100,若超過100則以100分計。
score = score > 100 ? 100 : score ;
我們將C/C++的運算子之優先順序與關聯性彙整於table 6