【问题标题】:C99 single line comparitive syntax shortcutC99 单行比较语法快捷方式
【发布时间】:2013-08-08 05:12:08
【问题描述】:

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

  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 ...

【问题讨论】:

  • 如果你在线,有几个 online compilers 可用,至少在 Coliru 和 ideone 中,使用 C99 很简单。

标签: c syntax shortcut c99


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    由于!=是从左到右关联的:

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

    可以翻译成

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      因此您最终将检查d 是否等于某个值,该值不是零就是一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2011-05-18
        • 1970-01-01
        • 2016-06-12
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多