<基于 C++ Primer P124>
1.算数运算符:+(正)、-(负)、*、/、%、+、-
(1)布尔值不应该参与运算。
bool b = true;
bool b2 = -b; // b2 为真
(2)m = (m / n) * n + m % n
①(-m) / n 和 m / (-n) 都等于 -(m / n);
②m % (-n) 等于 m % n,(-m) % n 等于 m % n;
21 % 6 = 3; 21 / 6 = 3;
21 % 7 = 0; 21 / 7 = 3;
-21 % -8 = -5; -21 / -8 = 2;
21 % -5 = 1; 21 / -5 = -4;
(3)算数表达式可能产生未定义的结果,一部分原因是数学性质本身,如:除数是 0 的情况;另外一部分原因是计算机本身的特点,如:溢出(计算的结果超出该类型所能表示的范围)。
2.逻辑和关系运算符:!、<、<=、>、>=、==、!=、&&、||
(1)逻辑与运算和逻辑或运算具有短路求值性质。
(2)
if (i < j < k) // 使用 i < j 的布尔值结果和 k 比较,若 k 大于 1 则为真
(3)进行比较运算时除非比较的对象是布尔类型,否则不要使用布尔字面值 true 和 false 作为运算对象。
3.赋值运算符:=
(1)赋值运算符的优先级低于关系运算符的优先级,所以在条件语句 中,赋值部分通常应该加上括号。
(2)切勿混淆相等运算符和赋值运算符。
if (i == 42) // 判断 i 的值是否为 42
if (i = 42) // 将 42 赋给 i,判断 i 的值是否为真
(3)复合赋值运算符:+=、-=、*=、/=、%=;可以减少求值次数。
4.递增和递减运算符
int i = 0, j;
j = ++i; // j = 1, i = 1:前置版本得到递增之后的值
j = i--; // j = 1, i = 2:后置版本得到递增之前的值
(1)优先使用递增递减的前置版本,不仅可以避免不必要的工作,提升性能,写出的代码也更符合编程的初衷。
(2)简洁可以成为一种美德,美观清晰的同时也降低了出错的可能性。
auto.pbeg = v.begin()