其他章节:C++ Primer
算术运算符(左结合律)
运算符 | 功能 | 用法 |
---|---|---|
+ |
一元正号 | + expr |
- |
一元负号 | - expr |
* |
乘法 | expr * expr |
/ |
除法 | expr / expr |
% |
求余 | expr % expr |
+ |
加法 | expr + expr |
- |
减法 | expr - expr |
一元运算符的优先级最高,接下来是乘法和除法,优先级最低的是加法和减法。
- 优先级高的运算符比优先级低的运算符组合地更紧密。
- 上述所有的运算符都满足左结合律,当优先级相同时按照从左到右的顺序进行组合。
- 算术运算符都能作用于任意算术类型以及任意能转换为算术类型的类型。算术运算符的运算对象和求值结果都是右值。
一元正号运算符、加法运算符和减法运算符都能作用于指针。
- 一元正号运算符作用于一个指针或者算术值时,返回运算对象值的一个(提升后的)副本;一元负号运算符对运算对象值取负后,返回其(提升后的)副本。
cpp
int i = 1024;
int k = -i; // k是-1024
bool b = true;
bool b2 = -b; // b2是true!
// b参与运算时提升为数值1,求负结果为-1,不等于0,bool为真
算术表达式有可能产生未定义的结果。一部分原因是数学性质本身:例如除数是0
的情况;另外一部分则源于计算机的特点:例如溢出,当计算的结果超出该类型所能表示的范围时就会产生溢出。
/
:除法运算符,整数相除的结果还是整数,如果商还有小数,直接弃除。
%
:取余或取模运算符,负责计算两个整数相除所得的余数,参于取余运算的运算对象必须是整数类型。
除法运算中,如果两个运算对象的符号相同则商为正,否则商为负。
根据取余运算的定义,如果m
和n
是整数且n
非0
,则表达式(m/n)*n+m%n
的求值结果与m
相等。
除了-m
导致溢出的特殊情况,其他时候(-m)/n
和m/(-n)
都等于-(m/n)
,m%(-n)
等于m%n
,(-m)%n
等于-(m%n)
。
cpp
21 % 6; /*结果是3*/ 21 / 6; /*结果是3*/
21 % 7; /*结果是0*/ 21 / 7; /*结果是3*/
-21 % -8; /*结果是-5*/ -21 / -8; /*结果是2*/
21 % -5; /*结果是1 */ 21 / -5; /*结果是-4*/