C++的链式赋值
我们都知道在C++中,形如
a = b = c
这种链式赋值的结果是将c的值赋给a和b。
那么如果我们在这种链式赋值中加入括号会怎么样呢?
int main(){
int a = 1, b = 2, c = 3;
(a = b) = c;
cout << a << endl << b << endl << c ;
}
这个的输出结果是
a = 3
b = 2
c = 3
也就是只对a进行了赋值操作,而括号里面等号最右边的变量是不会进行接下来的赋值操作的。
为了证明这个猜想,可以再加入一个变量进行测试。
int main(){
int a = 1, b = 2, c = 3, d= 4;
((a = b) = c) = d;
cout << a << endl << b << endl << c << endl << d;
}
这个语句的结果是:
a = 4
b = 2
c = 3
d = 4
可见,等号右边的b和c都没有被再次赋值。
那么请问如果括号加在了b = c上,结果又会是怎么样的呢?
int main(){
int a = 1, b = 2, c = 3, d= 4;
a = (b = c) = d;
cout << a << endl << b << endl << c << endl << d;
}
如果你猜想 b = 3 那就错了。
这个语句的结果是:
a = 4
b = 4
c = 3
d = 4
也就是跳出括号之后,b又参与了 a = b = d 这个赋值运算。
其实根本原因是,()括号中的语句也是一个函数。也就是调用了 ‘=’ 这个函数。
括号中的赋值语句返回的是等号最左边的变量。于是返回的最左边的变量再参与接下来的赋值。
而连续赋值的执行顺序默认是从右向左的,
例如 a = b = c,
先执行 b = c,然后返回b,
再执行 a = b。