我没有编译器方便自己查看。
版本1:
int a, b, c, d;
... some code to set the above variables ...
if (a != b != c != d)
//Do something
... rest of code ...
版本2:
int a, b, c, d;
... some code to set the above variables ...
if ((a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d))
//Do something
... rest of code ...
答案 0 :(得分:3)
由于!=
从左到右关联:
if (a != b != c != d)
可以翻译为
if (((a != b) != c) != d)
但结果不是您所期望的,例如,给定a = 100, b = 200;
,则a != b
为0
,因为任何真值都被评估为1
,false值为0
。所以对你的问题:
版本1(下面)中的代码在C C99中是否有效?它会编译运行吗? 它在逻辑上等同于版本2中的代码吗?
它是有效的,但它不等同于版本2中的代码。
答案 1 :(得分:2)
第一个程序是有效的C代码。
它不等同于第二个程序,因为!=
运算符的结果是0
或1
。
答案 2 :(得分:1)
如果你要做的是检查四个变量是否都有不同的值,那么第二个版本是正确的。由于逻辑运算符的左右关联性,第一个版本将被解析为:
if (((a != b) != c) != d)
所以你最终会检查d
是否等于零或一个值。