C++Primer 5th Chap4 Expressions

左值和右值:左值:用的是对象的身份(内存中的位置),右值:用的是对象的值(内容)

解引用与递增(递减)运算符连用:

  *ivec++:取ivec当前值并向后移动一个元素,等价于*(ivec++),本来++的优先级高于*

条件运算符嵌套:(注意在语句两端加上括号,条件运算符优先级极低)

  A?B:C?D:E等价于A?B:(C?D:E)

位运算符(建议仅将位运算用于无符号类型,避免因符号位问题造成错误)

  用法:

运算符 功能 用法
~ 位求反 ~exp
<< 左移 exp1<<exp2
>> 右移 exp1>>exp2
& 位与 exp1&exp2
^ 位异或 exp1^exp2
| 位或 exp1|exp2

      

 

 

 

 

 

 

 

 

  位运算的结果一旦超出位的范围,超出部分的位将会被舍弃

  <<操作符满足左结合律

sizeof运算符:返回一条表达式或类型名所占的字节数,返回值类型为size_t,满足右结合律

  sizeof(data.revenue);//获取类对象data的revenue成员对应类型的大小

  sizeof(arr);//获取数组arr的类型大小,是其所有元素类型大小之和(利用sizeof(arr)/sizeof(*arr)可以获取arr的元素数量

命名的强制类型转换:cast-name<type>(expression),cast-name有4种:static_cast,dynamic_cast(后续章节再提),const_cast,reinterpret_cast

  例如:

  static_cast:

    int j=10;

    double slope=static_cast<double>( j ) / i;(只要不是底层const即可用,适用于将大类型赋给小类型)  

    void *vp=&d;

    double *dp=static_cast<double*>(vp);

  const_cast:

    const char*pc;

    char *p=const_cast<char*>(pc);(要求对象是底层const,借此可以除掉const属性(多用于重载函数),但是不能改变类型)

  reinterpret_cast:"为运算对象的位模式提供较低层次的重新解释",基本上用不到(极可能引起错误,慎用)

  实际上强制类型转换是迫不得已的手段,若非必要无需使用

运算符优先级表见p147

  

    

posted @ 2019-09-09 20:17 Dragonsburg 阅读(...) 评论(...) 编辑 收藏