C++primer第五版第四章学习笔记

  1. 如果 m 和 n 是整数,且 n 非 0,则表达式 (m/n)*n+m%n 的求值结果与 m 相等。
  2. m%(-n) 等于 m%n , (-m)%n 等于 -(m%n),-m 有可能导致溢出。
  3. 关系运算符的求值结果是布尔值,将几个关系运算符连写在一起会产生意想不到的结果:

    if (i < j < k) // i < j 的布尔值结果和 k 比较,若 k 大于1 则条件为真!
    //如果 val 不是布尔值,那么首先把 true 转换成 val 的类型
    if ( val == true) { /*...*/}

  4. 使用复合运算符,左侧运算对象求值仅一次;使用普通运算符则求值两次:一次是作为右边子表达式的一部分求值,另一次是作为赋值运算符的左侧运算对象求值。

  5. 递增递减前置版本将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。

    除非必须,否则不用后置版本。后置版本需要将原始值存储下来以便于返回这个未修改的内容,如果不需要用到修改前的值,那么后置版本的操作就是一种浪费。后置递增(减)运算符优先级高于解引用运算符,p++等价于(p++) 。

  6. 仅将位运算符用于处理无符号类型。

  7. 在 sizeof 的运算对象中解引用一个无效指针(*p)仍然是安全的,因为指针实际上并没有被真正使用。sizeof 不需要真的解引用指针就能知道它所指对象的类型。

  8. sizeof 返回值是一个常量表达式,所以可以用来声明数组维度。

  9. 只有 const_cast 能改变表达式的常量属性。常用于有函数重载的上下文中。

    //const_cast 只能改变运算对象的底层const
    const char *pc;
    char *p = const_cast<char*>(pc); //正确:但是通过p写值是未定义的行为

  10. 避免强制类型转换,因为它干扰了正常的类型检查。尤其是 reinterpret_cast 。

    int *ip;
    char *pc = reinterpret_cast<char*>(ip); // pc 所指向的对象仍然是 int ,而不是字符。

  11. 运算符优先级简单归纳:
    • 括号,下标,-> 和 .(成员) 最高;
    • 单目比双目高;算术双目比其他双目高;
    • 移位运算 > 关系运算 > 高于位运算 > 逻辑运算 > 条件运算(三目);
    • (复合)赋值运算 > 逗号运算。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值