【问题标题】:Short circuit behavior of logical expressions in C in this example本例中 C 语言中逻辑表达式的短路行为
【发布时间】:2025-12-20 08:40:17
【问题描述】:

程序

#include <stdio.h>

int main(void)
{
    int i, j, k;

    i = 1; j = 1; k = 1;

    printf("%d ", ++i || ++j && ++k);
    printf("%d %d %d", i, j, k);

  return 0;
}

结果

1 2 1 1

我期待 1 1 2 2。为什么?因为 && 优先于 ||。所以我按照以下步骤操作: 1) j 加 1,所以 j 现在值为 2... 2) k 加 1,所以 k 现在值为 2... 3) 2 && 2,计算结果为 1... 4) 作为|| 的右操作数,无需进一步求值为真,因此由于逻辑表达式的短路行为,整个表达式必须为真...

为什么我错了?

【问题讨论】:

  • 这个练习在我的教科书中,根据它,这里没有未定义的行为。
  • 这意味着你正在阅读一本非标准的书。
  • @al-Acme: ||&amp;&amp; 引入序列点。
  • @Mat - 啊,阅读问题的速度太快了。 ://
  • 请不要写这种代码 - 充其量很难阅读。

标签: c


【解决方案1】:

优先级仅影响分组。 &amp;&amp; 的优先级高于 || 表示:

++i || ++j && ++k

相当于:

++i || (++j && ++k)

但这并不意味着首先评估++j &amp;&amp; ++k。还是从左到右求值,根据||的短路规则,++i为真,所以++j &amp;&amp; ++k永远不会求值。

【讨论】:

  • 但是如果那是括号,那不应该先评估吗?
  • 短路 - 左一位忘记其余部分
  • 不应该 ++i 打印 2 而不是 1?
  • @Cool Guy 2 || anything 等于 1
  • @mch ,所以整个事情返回 1(true) 而不是 ++i 的值?