-1

可能重复:
谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等……)

我听说 printf 函数从右到左执行并从左到右打印。按照这个约定,下面的程序应该给出 7,6,5。但它在我的 linux gcc 编译器上给出了 7,7,7。它依赖于编译器吗?

int i=5;
printf("%d %d %d\n",++i,++i,i);

另外,我们可以使用 cdecl/pascal 关键字来改变 printf 的执行顺序吗?如果是,我们该怎么做?我一直在尝试这样做,但没有成功。提前谢谢!

4

2 回答 2

1

函数调用中的标准没有规定顺序,因此可以按照编译器认为合适的任何顺序评估参数。因此,如果您在评估参数时有副作用,您会得到未定义的行为。

于 2012-05-21T17:20:18.763 回答
1

您的代码中的评估顺序未定义,因为没有序列点。您不能中继函数参数的评估顺序,也不能更改它。

检查http://www2.research.att.com/~bs/bs_faq2.html#evaluation-order

于 2012-05-21T17:20:56.657 回答