【问题标题】:In C whether the second part of if structure is executed if first logical part failed? Is the behavior compiler depended?如果第一个逻辑部分失败,在 C 中是否执行 if 结构的第二部分?行为编译器是否依赖?
【发布时间】:2014-03-10 10:52:32
【问题描述】:

扩展问题 What happens if the first part of an if-structure is false?

用于 C 编程

if((NULL!=b)&&(query(&b)))

在上面的代码中,如果b=Null,“query(&b)”部分会被执行吗? 编译器之间的行为是否一致?

【问题讨论】:

  • 看看这个:stackoverflow.com/questions/3958864/…。一句话:操作符会短路,这是标准的 C 行为。
  • 本题所用语言不准确且含糊不清。我会假设 if constructstatement(不是 structure)的“第二部分”是 else 部分。在这里,您只是在谈论 布尔运算的左侧 - if 构造无关紧要。
  • 感谢您接受我的回答,但功劳应该归于其他人(例如最先发帖的 paxdiablo),因为我只是想添加一个参考以清楚起见,而其他人则在他们的答案中投入了更多时间.
  • @jpw,功劳应该归于最佳答案,而不是第一个。不幸的是,我在获得标准文档之前就被叫走了。此类语言问题的最佳答案几乎总是引用标准的答案,所以你的答案是当之无愧的。无论如何,我不需要代表 :-)
  • @paxdiablo +1 给你 :)

标签: c if-statement compiler-construction


【解决方案1】:

不,C 中的逻辑运算符会短路。

如果您在a 为假时尝试评估a && b,则不会评估b

但请记住,您检查的不是b 与原始语句,而是检查a。另请注意,获取 NULL 变量的地址是安全的,但不能取消引用它。

我怀疑你应该写的是:

if ((b != NULL) && (query (*b)) ...

【讨论】:

    【解决方案2】:

    要添加到已发布的正确答案,这是 C99 标准所说的(第 6.5.13 节逻辑与运算符,第 4 段):

    与按位二进制 & 运算符不同,&& 运算符保证 从左到右的评估;之后有一个序列点 评估第一个操作数。如果第一个操作数比较相等 为 0,不计算第二个操作数。

    【讨论】:

      【解决方案3】:

      在上面的代码中,如果b=Null,“query(&b)”部分会被执行吗?

      简单的答案NO。它不会被执行。 &&short circuited。因此,如果您尝试这样做,则会破坏短路评估,因此不推荐。

      查看FAQ3.6

      【讨论】:

        【解决方案4】:

        它不是特定于if 语句,而是一般布尔表达式

        a && b 中,如果a 为假,则不会评估b

        c || d 类似,如果c 为真,则不会评估d

        这被称为短路评估,是语言定义的一部分,因此在兼容的编译器中是一致的。

        【讨论】:

        • 我认为“在 a && b 中,如果 a 为真,则不评估 b。”你的意思是说“如果 a 是假的”
        猜你喜欢
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        相关资源
        最近更新 更多