C++的表达式要不然是右值,要不然是左值,左值可以位于赋值语句的左侧,右值则不能。

当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

在需要右值的地方可以用左值来代替,但是不能把右值当成左值(也就是位置)使用。

当一个左值被当成右值使用时,实际使用的是它的内容。

1.赋值运算符需要一个左值作为其左侧运算对象,得到的结果也是一个左值。

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

3.内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是左值。

4.内置类型的迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结论也是左值。

使用关键字decltype的时候,如果表达式求值结果是左值,得到一个引用类型。

运算对象的求值顺序与优先级和结合律无关

f()+g()*h()+j()//不知道这四个函数哪个先执行,不要操作同一个对象 bool b= true;bool b2= -b; // b2是true

    在除法运算中,c++语言的早期版本允许结果为负号的商向上或向下取整,c++11新标准则规定商一律向0取整。

c++语言早期版本允许m%n的符号匹配n的符号,而且商向负无穷一侧取整,这一方式在新标准中被禁止使用。除了-m导致溢出。其它时候(-m)/n和m/(-n)都等于-(m/n),m%(-n)等价于-(m%n)

关系运算符作用于算术类型或指针类型,逻辑运算符作用于任意能转换布尔值的类型。逻辑运算符和关系预算符的返回值都是布尔类型。对于这两类运算符来说,运算对象和求值结果都是右值。

赋值运算符的左侧运算对象必须是一个可修改的左值

赋值运算符结果类型是左侧对象类型是左值。 

 

 赋值运算符优先级低,低于关系运算符的优先级,通常加上括号

因为很多迭代器本身不支持算术运算,所以此时递增和递减运算符除了书写简洁外还是必须的。

前置版本++u 将对象本身作为左值返回,后置版本将对象原始副本作为右值返回

除非必须,否则不用递增递减运算符的后置版本

后置版本需要将原始值存储下来以便返回这个未修改的内容。如果不需要修改前的值,那么后置版本的操作是一种浪费。对于整数和指针编译器可能会优化,对于一些相对复杂的迭代器类型,这种额外的工作消耗巨大。

*it++ 等价于 *(it++)

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

cond?expr1:expr2 条件运算符的两个表达式都是左值或者能转换成同一种左值类型时,运算的结果是左值;否则运算的结果是右值。

条件运算符的优先级非常低,当一条长表达式中嵌套了条件运算子表达式时,通常需要在它两端加上括号。

关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算用于处理无符号类型、

左移运算符在右侧插入值为0的二进制位,右移运算符的行为依赖左侧运算对象的类型,如果是无符号,在左侧插入值为0的二进制位;带符号在左侧插入符号位的副本或值为0的二进制位,如何选择视具体环境而定 。

 位求反运算符将运算对象逐位求反后生成一个新值。

移位运算符的优先级比算术运算符的优先级低,比关系运算符、赋值运算符和条件运算符的优先级高。

sizeof运算符返回一条表达式或一个类型名字所占的字节数。sizeof运算符满足右结合律。其所得值是一个size_t类型的常量表达式。

sizeof *p=== sizeof (*p) 对char或这个类型位char


比丘资源网 » C++ primer

发表回复

提供最优质的资源集合

立即查看 了解详情