0

这是我的程序:

 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 

但根据运算符优先级表,我猜 ++ 应该首先评估。我也尝试在它们周围加上括号,但输出仍然保持不变。我在某处读到,无论如何,加上括号会使它首先评估。

有人,请说清楚,它是如何评估的。提前致谢。

4

2 回答 2

4

这里发生的是短路。k++计算结果为0,这是错误的。因此,整个布尔表达式k++ && ++i && ++j为假,因此++i永远++j不会执行。

于 2013-10-24T04:43:50.077 回答
3

您将优先级评估顺序混淆了。优先级定义了操作数的分组方式。的较高优先级++使表达式等效于:

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

但评估顺序无关紧要。的快捷电路&&保证首先评估其左操作数。

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


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

给定int i = 0, 的结果i + (i++)是未指定的,编译器可以i++先求值,这会修改 的值i,编译器可以选择先求值i。你应该避免这样的表达。

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

于 2013-10-24T04:46:57.150 回答