C++ Primer第四章 表达式
基础
详情点击查看
5
基本概念
1.一元运算符和二元运算符
1 | 作用于一个运算对象的运算符是一元运算符 |
2.重载运算符
1 | 当运算符作用于类类型的运算对象时,用户可以自定义其含义,被称为重载运算符 |
3.左值和右值
1 | 当一个对象被用作右值的时候,用的是对象的值(内容); |
优先级与结合律
移步c++primer p123,这里不做阐述
求值顺序
运算对象的求值顺序与优先级和结合律无关
算术运算符
详情点击查看
1 | bool b = true; |
对于大多数运算符来说,布尔类型的运算对象将被提升为int类型。上式中b的值为真,参与运算时会被提升成1,求负后变为-1,-1的布尔值为真,所以结果为true
取余运算符%的运算对象必须是整数类型
逻辑和关系运算符
详情点击查看
逻辑与和逻辑或都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为短路求值。
利用短路求值的策略来确保右侧运算对象求值过程的正确性和安全性
赋值运算符
详情点击查看
1.与其他二元运算符不同,赋值运算符满足右结合律
1 | int ival, jval; |
注意:因为赋值运算符的优先级低于关系运算符的优先级,所以在条件语句中,赋值部分通常应该加上括号
2.复合运算符的性能比普通运算符好,因为复合运算符只求值一次,而普通运算符求值两次,一次是作为右边表达式的一部分求值,另一次是作为赋值运算的左侧运算对象求值
递增和递减运算符
详情点击查看
1.很多迭代器不支持算术运算,但基本都支持递增和递减运算符
2.建议:除非必须,优先使用递增递减运算符的前置版本
1 | 前置版本的递增递减运算符是将值加1后直接返回改变了的运算对象; |
3.在一条语句中混用解引用和递增运算符
1 | //输出vector对象的内容直到遇到第一个负值为止 |
成员访问运算符
详情点击查看
点运算符(.)和箭头运算符(->)都可以用于访问成员。
箭头运算符先解引用左侧对象再访问它的成员
1 | string s1 = "a string", *p = &s1; |
注意:解引用的优先级低于点运算符,所以要加括号
条件运算符
详情点击查看
1.条件运算符(?:)允许我们将简单的if-else逻辑嵌入到单个表达式中
1 | //判断成绩是否合格 |
2.嵌套条件运算符
1 | finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"; |
3.在输出表达式中使用条件运算符
1 | cout << ((grade < 60) ? "fail" : "pass");//输出pass或者fail |
位运算符
详情点击查看
1.位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。bitset类型也能使用位运算符
2.位运算符(左结合)
| 位运算符 | 含义 | |
|---|---|---|
| ~ | 取反 | |
| << >> | 左移 右移 | |
| & | 位与 | |
| ^ | 位异或 | |
| \ | 位或 |
关于符号位如何处理没有明确的规定,所以建议仅将位运算符用于处理无符号类型
3.移位运算符
1 | unsigned char bits = 0233;//0233是八进制的字面值 |
3.位取反运算符
1 | unsigned char bits = 0227; |
4.位与,位或, 位异或运算符
1 | & :如果两个运算对象的对应位置都为1,则运算结果中该位为1,否则为0; |
5.使用位运算符
1 | //假设班上有30名学生,进行了一次小测试,测试的结果分为通过与不通过。我们可以用二进制位表示学生是否通过,这样全班的测验结果可以用一个无符号整数来表示 |
6.移位运算符(又称为IO运算符)满足左结合律
1 | 移位运算符的重载版本被用来进行IO操作。但他们的优先级和结合律都是一样的 |
sizeof运算符
详情点击查看
1.sizeof运算符返回一条表达式或一个类型名字所占的字节数
sizeof运算符满足右结合律
1 | sizeof data;//data的类型的大小 |
2.sizeof 返回表达式结果类型的大小,但不实际计算运算对象的值
1 | sizeof char 返回1 |
3.因为sizeof的返回值是一个常量表达式,所以可以用sizeof的返回值来声明数组的维度
逗号运算符
详情点击查看
逗号运算符含有两个运算对象,规定了运算对象求值的顺序,按从左向右的顺序依次求值
类型转换
详情点击查看
算术转换
算术转换的规则定义了一套类型转换的层次,其中运算符的运算对象将转换成最宽的类型
P142-143
其他隐式类型转换
1.数组转换成指针
1 | int ia[10]; |
2.指针的转换
1 | 1.常量整数值0或字面值nullptr能转换成任意指针类型 |
3.转换成布尔类型
4.转换成常量
显示转换
显示转换的方法称为强制类型转换
1.命名的强制类型转换
1 | cast-name<type>(expression); |
2.static_cast
1 | //任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast |
3.const_cast
1 | //const_cast只能改变运算对象的底层const |
4.reinterpret_cast
c++primer p146
运算符优先级表
详情点击查看
c++primer p147






