如果++(前/后)具有更高的优先级,为什么&&正在评估?

时间:2013-10-24 04:37:39

标签: c

这是我的计划:

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

上述程序的输出是:

 -3 2 1 0 

但是根据运算符优先级表,我应该首先评估++。 我也尝试在它们周围加上括号,但输出仍然相同。 我在某处读到,无论如何,将括号括起来都会先进行评估。

有人,请说清楚,如何评价。 提前谢谢。

2 个答案:

答案 0 :(得分:4)

这里发生的事情是短路。 k++评估为0,这是错误的。因此,整个布尔表达式k++ && ++i && ++j为false,因此永远不会执行++i++j

答案 1 :(得分:3)

您将优先级评估顺序混淆。优先级定义了操作数的分组方式。 ++的优先级越高,表达式就相当于:

m = (k++) && (++i) && (++j);

但评估顺序无关紧要。 &&的快捷方式保证 它的左手操作数首先被评估。

通常,大多数运算符都没有指定评估顺序,但有四个例外:逻辑AND &&,逻辑OR ||,条件运算符?:和逗号运算符{{1 }}


作为不同评估顺序的具体例子:

给定,int i = 0的结果未指定,编译器可能首先评估i + (i++),这会修改i++的值,编译器可能会选择评估i {1}}首先。你应该避免使用这些表达式。

另一方面,确定i的结果,因为i && (i++)确保首先评估左操作数&&,因为它是零,右操作数i永远不会被评估。