專欄簡介:本專欄主要面向C++初學者,解釋C++的一些基本概念和基礎語言特性,涉及C++標準庫的用法,面向對象特性,泛型特性高級用法。通過使用標準庫中定義的抽象設施,使你更加適應高級程序設計技術。希望對讀者有幫助!
目錄
- 4.2算術運算符
4.2算術運算符
表4算術運算符(左結合律)
運算符 | 功能 | 用法 |
十 | 一元正號 | + expr |
一 | 一元負號 | - expr |
* | 乘法 | expr * expr |
/ | 除法 | expr / expr |
% | 求余 | expr % expr |
+ | 加法 | expr + expr |
一 | 減法 | expr - expr |
表4.1按照運算符的優先級將其分組。一元運算符的優先級最高,接下來是乘法和除法,優先級最低的是加法和減法。優先級高的運算符比優先級低的運算符組合得更緊密。上面的所有運算符都滿足左結合律,意味著當優先級相同時按照從左向右的順序進行組合。
除非另做特殊說明,算術運算符都能作用于任意算術類型以及任意能轉換為算術類型的類型。算術運算符的運算對象和求值結果都是右值。在表達式求值之前,小整數類型的運算對象被提升成較大的整數類型,所有運算對象最終會轉換成同一類型。
一元正號運算符、加法運算符和減法運算符都能作用于指針。己經介紹過二元加法和減法運算符作用于指針的情況。當一元正號運算符作用于一個指針或者算術值時,返回運算對象值的一個(提升后的)副本。
一元負號運算符對運算對象值取負后,返回其(提升后的)副本:
int i = 1024;
int k = -i; //k是-1024
bool b= true;
bool b2 = -b; //b2是true
布爾值不應該參與運算,-b就是一個很好的例子。
對大多數運算符來說,布爾類型的運算對象將被提升為int類型。如上所示,布爾變量b的值為真,參與運算時將被提升成整數值1,對它求負后的結果是-1。將-1再轉換回布爾值并將其作為b2的初始值,顯然這個初始值不等于0,轉換成布爾值后應該為1。所以,b2的值是真!
提示:溢出和其他算術運算異常:
算術表達式有可能產生未定義的結果。一部分原固是數學性質本身:例如除數是0的情況;另外一部分則源于計算機的特點:例如溢出,當計算的結樞超出試類型所能表示的范國時就會產生溢出。
假設某個機器的short類型占16位,則最大的shot敏值是32767。在這樣一臺機器上,下面的復合賦值語句將產生溢出:
short short_value=32767; //如果short類型占16位,則能表示的最大值是 32767
short_value+=1; //該計算導致溢出
cout << “short_value:“ <<short_value<<endl;
給short_value賦值的語句是未定義的,這是因為表示一個帶符號數32768需要17位,但是short類型只有16位。很多系統在編譯和運行時都不報溢出錯誤;像其他未定義的行為一樣,溢出的結果是不可預知的。在我們的系統中,程序的輸出結果是:
short_value : -32768
該值發生了“環繞(wrapped around),符號位本來是0,由于溢出被故成了1,于是結果變成一個負值。在別的系統中也許會有其他結果,程序的行為可能不同甚至直接崩潰。
當作用于算術類型的對象時,算術運算符+、~、*、/的含義分別是加法、減法、乘法和除法。整數相除結果還是整數,也就是說,如果商含有小數部分,直接棄除:
int ival = 21/6;//ival1是3,結果進行了刪節,余數被拋棄掉了
int ival2 = 21/7;// ival2是3,沒有余數,結果是整數值
運算符%俗稱“取余“或“取模“運算符,負責計算兩個整數相除所得的余數,參與取余運算的運算對象必須是整數類型:
int ival = 42;
double dval=3.14;
ival % 12; //正確:結果是6
ival % dval;//錯誤:運算對象是浮點類型
在除法運算中,如果兩個運算對象的符號相同則商為正(如果不為0的話),否則商為負。C++語言的早期版本允許結果為負值的商向上或向下取整,C++11新標準則規定商一律向0取整(即直接切除小數部分)。
根據取余運算的定義,如果m和n是整數且n非0,則表達式(m/n)*n+m%n 的求值結果與m相等。隱含的意思是,如果m%n不等于0,則它的符號和m相同。C++語言的早期版本允許m%n的符號匹配n的符號,而且商向負無窮一側取整,這一方式在新標準中已經被禁止使用了。除了-m導致溢出的特殊情況,其他時候(-m)/n和m/(-n)都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)。具體示例如下:
int ivall
int ival221%6; /*結果是3*/ 21/6; /*結果是3*/
21%7; /*結果是0*/ 21/7; /*結果是3*/
-21%-8; /*結果是-5*/ -21/-8; /*結果是2*/
21%-5; /*結果是1 */ 21/5; /*結果是-4*/