C语言中,a=b=c,a=b==c,a==(b=c),a==(b==c)有什么区别

main()
{int
a=1,b=2,c=3;
printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));
}

第1个回答  2014-06-05
C语言和其他语言不同,在其他语言中,一般不区分 赋值操作符 与 等于 运算符,但是C语言很区分。
= 是赋值
== 是等于运算
也就是说,
a=b=c, 是一个表达式,运行到这里时,将a的值赋给b、c,运行完后abc的值相等;
a=b==c,是一个复合表达式,先将a的值赋给b,然后与c比较,如果相等则返回0,否则返回一个非零值;
a==(b=c),是一个复合表达式,先执行括号中的内容(即将b的值赋给c),然后比较a、c,如果相等则返回0,否则返回一个非零值;
a==(b==c),是一个复合表达式,先比较b、c的值,如果相等则返回0,否则返回一个非零值,然后比较a与(b==c)的返回值(注意这里不是再比较a与b或c,以前就错在这里过,希望LZ注意)。

可以看到C是区分 = 跟 == 的,虽然对新手很麻烦、容易错,但是一旦熟练之后会觉得很灵活,能把赋值语句放到任何你喜欢的地方。

PS:LZ的程序风格不好,而且还不习惯引用stdio.h,希望改正。附我改写的程序:
#include<stdio.h>
int main()
{
int a = 1, b = 2, c = 3;
printf("%d,%d,%d,%d\n", a = b = c, a = b==c, a==(b = c), a==(b==c));

return 0;
}
运行结果:3,0,0,0
这样可以么?追问

a==(b==c),是一个复合表达式,先比较b、c的值,如果相等则返回0,否则返回一个非零值,然后比较a与(b==c)的返回值(注意这里不是再比较a与b或c,以前就错在这里过,希望LZ注意)。
您觉得您分析的对吗?我感觉完全错误,如果相等是TRUE,是1好不好