a=b=c 与 (a=b)=c
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法
a=b=c, 是把c的值赋给a和b, 也就是说a,b, c相等
(a=b)= c, 是先把b的值赋给a, 然后(a=b)的值返回的是a的变量, 此时值等于b, 然后把c的值赋给a, 也就是说a 和c 相等, 和b无关。
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
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 = 4
c = 3
d = 4
跳出括号之后,b又参与了 a = b = d 这个赋值运算。
其实根本原因是,()括号中的语句也是一个函数。也就是调用了 ‘=’ 这个函数。
括号中的赋值语句返回的是等号最左边的变量。于是返回的最左边的变量再参与接下来的赋值。
而连续赋值的执行顺序默认是从右向左的,
例如 a = b = c,
先执行 b = c,然后返回b,
再执行 a = b。