我听说 printf 函数从右到左执行并从左到右打印。按照这个约定,下面的程序应该给出 7,6,5。但它在我的 linux gcc 编译器上给出了 7,7,7。它依赖于编译器吗?
int i=5;
printf("%d %d %d\n",++i,++i,i);
另外,我们可以使用 cdecl/pascal 关键字来改变 printf 的执行顺序吗?如果是,我们该怎么做?我一直在尝试这样做,但没有成功。提前谢谢!
我听说 printf 函数从右到左执行并从左到右打印。按照这个约定,下面的程序应该给出 7,6,5。但它在我的 linux gcc 编译器上给出了 7,7,7。它依赖于编译器吗?
int i=5;
printf("%d %d %d\n",++i,++i,i);
另外,我们可以使用 cdecl/pascal 关键字来改变 printf 的执行顺序吗?如果是,我们该怎么做?我一直在尝试这样做,但没有成功。提前谢谢!
函数调用中的标准没有规定顺序,因此可以按照编译器认为合适的任何顺序评估参数。因此,如果您在评估参数时有副作用,您会得到未定义的行为。
您的代码中的评估顺序未定义,因为没有序列点。您不能中继函数参数的评估顺序,也不能更改它。
检查http://www2.research.att.com/~bs/bs_faq2.html#evaluation-order