C++ Primier 笔记十五 算术运算符
下表是一个算术运算符的优先级分组:
算术运算符(左结合率) | |||
---|---|---|---|
运算符 | 功能 | 用法 | |
| 优 | 先 | 级 | | ▼ | + - | 一元正号 一元负号 | + expr - expr |
* / % | 乘法 除法 求余 | expr * expr expr / expr expr % expr | |
+ - | 加法 减法 | expr + expr expr - expr |
- 算术运算符能作用于任意算术类型以及任意能转换为算术类型的类型;
- 算术运算符的运算对象和求值结果都是右值;
- 一元正号运算符、加法运算符和减法运算符都能作用于指针;
- 一元正号运算符作用于一个指针或者算术值时,返回运算对象的一个(提升后的)副本;一元负号运算符对运算对象值取负后,返回其(提升后的)副本;
- 布尔值不应该参与运算,因为对大多数运算符来说,布尔类型的运算对象将被提升为
int
类型:
bool b = true;
bool b2 = -b; // b2 is true!
造成溢出和运算异常的原因:
- 数学性质本身,例如除数是 0;
- 计算机的特点,例如溢出。
/* limit.h 头文件规定的 short 类型的最大最小值 */
/* Minimum and maximum values a `signed short int' can hold. */
// # define SHRT_MIN (-32768)
// # define SHRT_MAX 32767
short short_value = 32767;
short_value += 1;
std::cout << “short_value : “
<< short_value
<< std::endl;
// gcc 4.8.4 的运行结果为
// short_value : -32768
其他一些知识点:
- 整数相除的结果还是整数。C++11 新标准规定商一律向 0 取整(即直接切除小数部分);
- 取余运算的运算对象必须是整数类型;
- 对于整数 m 与n 且 n 不等于0, 取余运算的结果符号与 m 相同,除了 -m 导致溢出的特殊情况。