赋值操作符的左操作数必须是非 const 的左值。下面的赋值语句是不合法的:
int i, j, ival;
const int ci = i; //初始化而非赋值
1024 = ival; // 错误,字面值是右值
i + j = ival; // 错误,算术表达式是右值
ci = ival; //错误,ci是常量
如果赋值运算符的左右两个运算对象类型不同,则右侧运算对象将转换成左侧运算对象的类型:
k=3.14; //如果k是int类型,值是3
C++11新标准允许使用花括号括起来的初始值列表作为赋值语句的右侧运算对象:
k={3.14}; //错误:窄化转换
赋值运算满足右结合律
赋值运算符满足右结合律:
int ival,jval;
ival=jval=0; //正确,都被赋值为0
对于多重赋值语句中的每一个对象,它的类型或者与右边对象的类型相同,或者可由右边对象的类型转换得到:
int ival,*pval;
ival=pval=0; //错误,不能把指针的值赋给int
string s1,s2;
s1=s2=“OK”; //字符串字面值转换成string对象
赋值运算优先级较低
int i;
while((i=get_value())!=20)
{
}
注意上面代码中的表达式括号暂时不能省略。
切勿混淆相等运算符和赋值运算符
C++语言允许用赋值运算作为条件,但是有可能造成严重后果:
if(i=j)
但是初衷可能是判断i与j是否相等:
if(i==j)
复合赋值运算符
复合赋值操作符的一般语法格式为:
a op= b;
其中,op= 可以是下列十个操作符之一:
+= -= *= /= %= // arithmetic operators
<<= >>= &= ^= |= // bitwise operators
这两种语法形式存在一个显著的差别:使用复合赋值操作时,左操作数只计算了一次;而使用相似的长表达式时,该操作数则计算了两次,第一次作为右操作数,而第二次则用做左操作数。除非考虑可能的性能价值,在很多(可能是大部分的)上下文环境里这个差别不是本质性的。
a = a op b;