验证代码
#include <stdio.h>
int main(void) {
int x;
int y;
int z;
int s;
x = 2;
y = 3;
z = 4;
s = (x = y == z);
printf("%d,x=%d,y=%d,z=%d\r\n", s, x, y, z);
x = 2;
y = 3;
z = 4;
s = (x == y == z);
printf("%d,x=%d,y=%d,z=%d\r\n", s, x, y, z);
//x = 2;
//y = 3;
//z = 4;
//s = (x == y = z);
//printf("%d,x=%d,y=%d,z=%d\r\n", s, x,y,z);
x = 2;
y = 3;
z = 4;
s = (x = y = z);
printf("%d,x=%d,y=%d,z=%d\r\n", s, x, y, z);
x = 2;
y = 3;
z = 4;
s = ((x = y) == z);
printf("%d,x=%d,y=%d,z=%d\r\n", s, x, y, z);
return 0;
}
运行结果
0,x=0,y=3,z=4
0,x=2,y=3,z=4
4,x=4,y=4,z=4
0,x=3,y=3,z=4
分析
“== ” 的优先级要比=的优先级高,“==” 的结合方向是从左到右,“=” 的结合方向是从右到左。
x = y == z
先运算“y==z”,结果为0。
后将”y==z“运算的结果0赋值给x。
所以,s=0,x=0,y=3,z=4。
x == y == z
先运算"x==y", 结果为0。
后将"x==y" 的结果0同z进行"=="计算,结果为0。
所以s=0,x=2,y=3,z=4。
x == y = z
先运算"x==y", 结果为0。
然后将z赋值给0,不符合C语言的语法。
所以,此种计算不能实现。
x = y = z
先运算"y=z", 结果为y=4,z=4。
后运算"x=y", 结果为x=4,y=4,z=4。
所以,s=4,x=4,y=4,z=4。
(x = y) == z
先运算"x=y", 结果为x=3,y=3。
后运算"x==z", 结果为0, x=3,y=3,z=4。
所以,s=0,x=3,y=3,z=4 。