2
#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;
}

为什么输出结果是-2 2 0 1?

一个逻辑是 (++j&& ++k) 不计算为 ++i 非零

但是因为 && 比 || 具有更高的偏好 为什么不计算它们

4

4 回答 4

5

优先级不指定计算表达式的顺序。它指定如何解释表达式。在这种情况下,C 的优先规则(嵌入在其形式文法中)导致a || b && c被解释为a || (b && c).

当计算这个表达式时,C 的规则指定a必须首先计算。规则还规定,如果a为真,则整个表达式的值为真,并且不计算右侧的||值。

为了更清楚地看到这一点,请考虑表达式a + b < c * d。优先规则导致 this 被解释为(a + b) < (c * d). 然而,与 不同的是,C 的规则并没有指定必须首先计算||的左侧。<编译器可能a + b首先评估或c * d首先评估,即使*优先级高于+. 允许编译器使用任何得到正确答案的评估顺序。

这里强加的唯一顺序是,a + b并且c * d必须在评估之前<都进行评估。但是,这来自表达式的结构,而不是优先级规则。

于 2013-01-10T15:22:30.730 回答
4

运算符&&||计算顺序是从左到右的。编译器保证||如果左操作数的计算结果为真,则不会计算运算符的右操作数。

于 2013-01-10T15:08:17.060 回答
1

m = ++i || ++j && ++k;

++i将首先执行。因为,i将变成-2,这意味着/等价于true。它不会执行++j && ++kpart 并且mvalue 将是1.

因此,最终输出将变为-2 2 0 1

执行时||,会先执行左手部分,如果是true则不会执行右手部分。因为,无论是右部分true还是false. 因此,在您的情况下,执行的剩余部分||并且由于它返回非零值,这意味着true.

于 2013-01-10T15:07:59.700 回答
1

由于短路评估

m = ++i || ++j && ++k;

相当于

++i;
m = i != 0;
if(!m) {
  ++j;
  m = j != 0;
  if(m) {
    ++k;
    m = k != 0;
  }
}
于 2013-01-10T15:29:19.267 回答