【问题标题】:Precendence vs short-circuiting in C [closed]C中的优先级与短路[关闭]
【发布时间】:2012-06-17 11:58:24
【问题描述】:
int i=-3, j=2, k=0, m; 
m = ++i || ++j && ++k; 
printf("%d, %d, %d, %d\n", i, j, k, m);

由于在 C 中++ 的优先级高于||&&,因此首先计算它们,因此表达式变为m = -2 || 3 && 1。现在您可以应用短路,但这会产生错误的答案。这是为什么呢?

【问题讨论】:

  • omg roflmoa wut iz the prblm herr??
  • 在我眼里就像一场派对,只邀请邪恶的小丑。
  • 你得到的输出是什么,你期望的输出是什么?
  • 优先级不代表执行顺序。
  • 我得到 -2 2 0 1 但我期待 -2 3 1 1

标签: c short circuit


【解决方案1】:

++s 不会在表达式之前执行。只有++i 执行,这表示表达式的结果将为1,因此不计算表达式的其余部分(短路)。

你的代码相当于:

if (++i)
    m = 1;
else
    if (!++j)
        m = 0;
    else if (!++i)
        m = 0;
    else
        m = 1;

这意味着一旦++i 被评估为真,else 部分就永远不会执行。

【讨论】:

    【解决方案2】:

    Precedence ≠ order of evaluation.

    ||&& 的短路行为意味着首先评估它们的左侧,并且

    • 如果 || 的 LHS 计算结果为真(非零),则不计算 RHS(因为无论 RHS 是什么,表达式都将为 true
    • 如果 && 的 LHS 计算结果为 false(或零),则不会计算 RHS(因为无论 RHS 是什么,表达式都会是 false

    在您的示例中,++i 被评估,并且等于 -2,非零,因此 ||(即++j && ++k)的右侧永远不会被评估:jk 永远不会增加。

    【讨论】:

    • 如果我们拥有的是!(++i || ++j && ++k),那么jk 会增加吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2012-01-02
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多