C99单行比较语法快捷方式

时间:2013-08-07 01:05:09

标签: c syntax shortcut c99

我没有编译器方便自己查看。

  1. 版本1(如下)中的代码是否在C C99中有效?它会编译运行吗?
  2. 它在逻辑上等同于版本2中的代码吗?
  3. 版本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 ...
    

3 个答案:

答案 0 :(得分:3)

由于!=从左到右关联:

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

可以翻译为

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

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

  

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

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