【问题标题】:Increment and logical operators precedence [duplicate]增量和逻辑运算符优先级[重复]
【发布时间】:2015-09-20 19:48:12
【问题描述】:

在下面显示的程序中,应首先评估前缀,因为它具有更高的优先级,但答案是-2, 2, 0, 1,并在“因为||的LHS为真RHS不评估”一书中进行了解释。
为什么会这样?所有的增量都应该先执行,然后再根据优先级检查逻辑。

#include<stdio.h>

int main()
{
    int i=-3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    printf("%d, %d, %d, %d\n", i, j, k, m);
    return 0;
}

【问题讨论】:

  • 优先级与评估顺序完全无关
  • @user2357112 请详细说明

标签: c pre-increment


【解决方案1】:

不要与 PrecedenceOrder of evaluation 混淆。

逻辑OR||的求值顺序是从左到右。

所以如果left = true 那么left || right 将永远不会执行right。在您的代码中发生了完全相同的情况。

如您所知,在 C 中任何非零值都被视为 true,因此,++i-2true。所以,

 m = ++i || ++j && ++k;
 m = true || bla bla bla; //right not even checked!
 m = true 
 m = 1

你得到了预期的输出。

【讨论】:

  • 所以根据您的答案优先级在上述答案中没有任何作用?@rakeb
  • 请仔细阅读答案,当然优先级问题,但首先要考虑评估的顺序。由于 LHS 是真的,RHS 根本不会评估。意味着,++j &amp;&amp; ++k; 不会执行并增加它们的值。当评估任何行/代码块时,问题就在于它们的优先级。
【解决方案2】:

逻辑 &amp;&amp;|| 运算符在对 RHS 进行任何评估之前全面评估 LHS。

在显示的代码中,由于 ++i-2|| 的 LHS 计算结果为 true (1),并且不计算 RHS。因此,jk 都不会增加。打印结果如下:m 被赋值为1i 变为-2j 保持为2k 保持为0

剩下的唯一问题是&amp;&amp; 的绑定比|| 更紧密,所以:

a || b && c

相当于:

a || (b && c)

因此,如果a 的计算结果为真(非零),那么bc 都不会被计算。

【讨论】:

    【解决方案3】:

    运算符优先级是完全不同的东西。评估顺序由副作用和序列点决定。

    请参阅this manual 了解评估顺序。

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2019-08-03
      相关资源
      最近更新 更多