5.4 赋值操作符
赋值操作符的左操作数必须是非const的左值。数组名是不可修改的左值,因此数组不可以作为赋值操作的目标。而下标和解引用操作符都返回左值。因此当将这两种操作用于非const数组时,其结果可作为赋值操作的左操作数。
5.4.1 赋值操作的右结合性
与下标和解引用操作符一样,赋值操作符也返回左值。同一,只要被赋值的每个操作数都具有相同的通用类型,c++语言允许将这多个赋值操作写在同一个表达式中。
5.4.2 赋值操作符具有低优先级
5.4.3 复合赋值操作符
复合赋值操作符的一般语法格式为:
a op=b;
其中op=可以是以下十个操作符之一:
+=,-=,*=,/=, %= (算术操作符)
<<=,>>=,&=,^= |=(bitwise 运算符)
每个复合赋值运算符实质上等价于,
a=a op b ;
这两种语法存在有一个显著的区别,使用复合赋值操作时,左操作数只计算了一次;而使用相似的长计算表达式时,该操作数计算了两次,第一是作为右操作数,而第二次则是作为左操作数。
5.5 自增和自减操作符
自增和自减运算都有前置和后置两种使用形式。
前置操作返回的是加1 后的值,所以返回对象本身,这是左值。而后置操作返回的是右值。
建议: 只有在必要时才使用后置操作符
前置操作需要做的工作更少,只需要加1后返回加1的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回尚未加1之前的值作为操作的结果。对于int 型对象和指针,编译器可优化掉这项额外的工作,但是对于更多的复杂迭代器类型,这种额外的工作可能会要花费更大的代价。因此,养成使用前置操作这个好习惯,就不必担心性能差异的问题。
2.在单个表达式中组合使用解引用和自增操作
下面使用一种非常通用的c++编程模式输出ivec的内容:
vector<int>::iteractor iter =ivec.begin();
while (iter !=ivec.end())
cout<<*iter++<<endl;
由于后自增操作的优先级高于解引用操作,因此*iter++等效于*(iter++)。
建议:简介即是美
对于上面例子中代码,不建议用
cout<<*iter<<endl;
iter++;
来代替。
5.9 逗号操作符
逗号表达式是由一组由逗号分隔的表达式,这些表达式从左到右计算。逗号表达式的结果是其最右边表达式的值。
5.10 复合表达式的求值
含有两个和更多个操作符的表达式成为复合表达式。在复合表达式中,操作数和操作符的结合方式决定了整个表达式的值。
5.11 new和delete表达式