C中的优先顺序

时间:2013-01-10 15:05:21

标签: c

#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&amp;&amp; ++ k)不计算为++ i非零

但作为&amp;&amp;比||有更高的偏好为什么他们没有计算

4 个答案:

答案 0 :(得分:5)

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

评估此表达式时,C的规则指定必须首先评估a。规则还规定如果a为真,那么整个表达式的值为true,而||的右侧不会被评估。

要更清楚地看到这一点,请考虑表达式a + b < c * d。优先规则会将其解释为(a + b) < (c * d)。但是,与||不同,C的规则未指定必须首先评估<的左侧。尽管a + b的优先级高于c * d,编译器可能会先评估*+。允许编译器使用任何得到正确答案的评估顺序。

此处强加的唯一顺序是a + bc * d必须在评估<之前进行评估。但是,这来自表达式的结构,而不是优先规则。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

++i将首先执行。由于i将成为-2,这意味着/等同于true。它不会执行++j && ++k部分,m值将为1

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

执行||时,它将首先执行左手部分,如果是true,则它将不会向右执行。因为,右边部分是true还是false并不重要。因此,在您的情况下,||的左侧部分已执行,因为它返回非零值,这意味着true

答案 3 :(得分:1)

由于短路评估

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

相当于

++i;
m = i != 0;
if(!m) {
  ++j;
  m = j != 0;
  if(m) {
    ++k;
    m = k != 0;
  }
}