【C++基础】第二十三课:赋值运算符

赋值运算符

Posted by x-jeff on April 19, 2021

【C++基础】系列博客为参考《C++ Primer中文版(第5版)》C++11标准)一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.赋值运算符

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

1
2
int i=0,j=0,k=0;//初始化而非赋值
const int ci=i;//初始化而非赋值

如果赋值运算符的左右两个运算对象类型不同,则右侧运算对象将转换成左侧运算对象的类型。

C++11新标准允许使用花括号括起来的初始值列表作为赋值语句的右侧运算对象。

无论左侧运算对象的类型是什么,初始值列表都可以为空。此时,编译器创建一个值初始化的临时量并将其赋给左侧运算对象。例如:

1
2
const int a;//错误:a必须被初始化
const int b={};//正确:可以用空列表初始化

2.赋值运算满足右结合律

1
2
int ival,jval;
ival=jval=0;//正确:都被赋值为0

因为赋值运算符满足右结合律,所以靠右的赋值运算jval=0作为靠左的赋值运算符的右侧运算对象。

对于多重赋值语句中的每一个对象,它的类型或者与右边对象的类型相同、或者可由右边对象的类型转换得到:

1
2
3
4
int ival,*pval;
ival=pval=0;//错误:不能把指针的值赋给int
string s1,s2;
s1=s2="OK";//正确

3.赋值运算优先级

赋值运算优先级较低,需要优先进行赋值运算时可以加上括号:

1
2
3
4
5
int i;
while((i=get_value()) != 42)//赋值运算符的优先级低于关系运算符
{
	//其他处理......
}

上述代码如果不加括号,那么比较运算符!=的运算对象将是get_value函数的返回值和42,比较的结果不论真假将以布尔值的形式赋值给i

4.区分相等运算符

1
if (i = j)

此时,if语句的条件部分把j的值赋给i,然后检查赋值的结果是否为真。如果j不为0,条件将为真。判断是否相等应该使用相等运算符:

1
if (i == j)

5.复合赋值运算符

每种运算符都有相应的复合赋值形式:

  1. 算术运算符:+=-=*=/=%=
  2. 位运算符:<<=>>=&=^=!=

任意一种复合运算符都完全等价于:

\[a=a \ op \ b\]