-1

我没有方便的编译器来自己检查。

  1. 版本 1(下)中的代码在 C C99 中有效吗?它可以编译并运行吗?
  2. 它在逻辑上是否等同于版本 2 中的代码?

版本 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 ...
4

3 回答 3

3

因为!=从左到右关联:

if (a != b != c != d)

可以翻译成

if (((a != b) != c) != d)

但结果不是你所期望的,例如,给定a = 100, b = 200;,然后a != b0,因为任何真值都被评估为1,假值被评估为0。所以对于你的问题:

版本 1(下)中的代码在 C C99 中有效吗?它可以编译并运行吗?它在逻辑上是否等同于版本 2 中的代码?

它是有效的,但它不等同于版本 2 中的代码。

于 2013-08-07T01:13:59.060 回答
2

第一个程序是有效的 C 代码。

它不等同于第二个程序,因为!=运算符的结果是0or 1

于 2013-08-07T01:06:42.237 回答
1

如果您要做的是检查四个变量是否都有不同的值,那么第二个版本是正确的。由于逻辑运算符的左右关联性,第一个版本将被解析为:

if (((a != b) != c) != d)

所以你最终会检查是否d等于某个零或一的值。

于 2013-08-07T01:14:08.200 回答