左值、右值、运算符

1、取地址符作用于一个左值运算对象,返回一个指向该左值运算对象的指针,这个指针是一个右值。

2、如果表达式的求值结果是左值,decltype作用于该表达式(不是变量)得到一个引用类型,例如,假设p的类型是int *,由于解引用运算符返回左值,那么decltype(*p)得到的类型是int &。另一方面,因为取地址运算符生成右值,所以decltype(&p)的结果是int **,即结果是一个指向整型指针的指针。

3、运算对象的求值顺序与优先级和结合律无关,如表达式f() + g() * h() + j();中并没有规定fghj四个函数哪个先求值,当四个函数没有关联时不会出错,但是当它们相互有影响时,由于哪个先求值并没有规定,因此会得到不确定的结果,此时这条语句是错误的。

4、算术运算符、逻辑运算符、关系运算符的运算对象和求值结果都是右值。

5、求余运算符结果的符号与第一个运算对象符号一致,出发运算符结果的符号根据两个运算对象的符号而定,如果两个运算对象符号相同则结果为正,否则为负。

6、if(val)当val非0时为真,if(val == true)只有当val为1时为真。进行比较运算时,除非比较的对象是bool类型,否则不要使用布尔字面值true和false作为运算对象。

7、递增递减运算符有前置版本和后置版本,前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。建议:除非必须,否则不用后置版本。

8、后置递增运算符的优先级高于解引用运算符,因此,*iter++的意思是先进行iter++,使iter得值加1,返回iter增加之前的原始值,再进行解引用。

9、成员访问运算符(箭头运算符和点运算符):箭头运算符作用于一个指针类型的运算对象,结果是一个左值,点运算符分两种情况:如果成员所属的对象是左值,那么结果是左值,反之,如果成员所属的对象是右值,那么结果是右值。

10、当条件运算符:两侧的表达式是左值或者能转换成同一左值时,结果是左值,反之,结果是右值。

posted @ 2022-12-12 10:40  许卡文迪  阅读(89)  评论(0编辑  收藏  举报