-1

对于测试代码如下:

#include <stdio.h>
int addTen(int x, int b[])
{
  b[2] =  x + b[2];
  return b[2];
}
void main(void)
{
   int a[3] = {4,5,6};
   int i = 2;
   printf("%i %i %i \n", a[i], addTen(10,a), a[i]);
}

为什么输出是 16、16、6?我知道即使编译器像 a[i] <- addTen(10,a) <-a[i] 那样处理从右到左的顺序。调用 addTen(10,a) 后,a[i] 已经是 16(不是 6)。那么为什么输出不是16、16、16呢?谢谢!

4

2 回答 2

4

这是未定义的行为,您应该阅读有关序列点的信息。您正在修改a并同时以相同的表达式读取它。

此外,未定义评估顺序。

于 2013-11-11T17:40:14.497 回答
4

没有为评估参数定义顺序。编译器可以自由地以任何顺序评估参数,并且通常会选择最方便的顺序。所以,你不能定义任何预期的输出。

于 2013-11-11T17:42:43.743 回答