- 如果 m 和 n 是整数,且 n 非 0,则表达式 (m/n)*n+m%n 的求值结果与 m 相等。
- m%(-n) 等于 m%n , (-m)%n 等于 -(m%n),-m 有可能导致溢出。
-
关系运算符的求值结果是布尔值,将几个关系运算符连写在一起会产生意想不到的结果:
if (i < j < k) // i < j 的布尔值结果和 k 比较,若 k 大于1 则条件为真! //如果 val 不是布尔值,那么首先把 true 转换成 val 的类型 if ( val == true) { /*...*/}
-
使用复合运算符,左侧运算对象求值仅一次;使用普通运算符则求值两次:一次是作为右边子表达式的一部分求值,另一次是作为赋值运算符的左侧运算对象求值。
- 递增递减前置版本将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。
除非必须,否则不用后置版本。后置版本需要将原始值存储下来以便于返回这个未修改的内容,如果不需要用到修改前的值,那么后置版本的操作就是一种浪费。后置递增(减)运算符优先级高于解引用运算符,p++等价于(p++) 。
-
仅将位运算符用于处理无符号类型。
-
在 sizeof 的运算对象中解引用一个无效指针(*p)仍然是安全的,因为指针实际上并没有被真正使用。sizeof 不需要真的解引用指针就能知道它所指对象的类型。
-
sizeof 返回值是一个常量表达式,所以可以用来声明数组维度。
-
只有 const_cast 能改变表达式的常量属性。常用于有函数重载的上下文中。
//const_cast 只能改变运算对象的底层const const char *pc; char *p = const_cast<char*>(pc); //正确:但是通过p写值是未定义的行为
-
避免强制类型转换,因为它干扰了正常的类型检查。尤其是 reinterpret_cast 。
int *ip; char *pc = reinterpret_cast<char*>(ip); // pc 所指向的对象仍然是 int ,而不是字符。
- 运算符优先级简单归纳:
- 括号,下标,-> 和 .(成员) 最高;
- 单目比双目高;算术双目比其他双目高;
- 移位运算 > 关系运算 > 高于位运算 > 逻辑运算 > 条件运算(三目);
- (复合)赋值运算 > 逗号运算。
C++primer第五版第四章学习笔记
最新推荐文章于 2020-10-05 21:11:34 发布