变量的前后增量运算在TC和gcc上给出不同的输出

Udi*_*pta 3 c standards gcc turbo-c

这是我的简单代码......

#include<stdio.h>
int main()
{
int i=5;
printf("%d %d %d %d %d ",i++,i--,++i,--i,i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

在gcc上,它输出为"4 5 5 5 5"

但在TC上,输出为"4 5 5 4 5"

我知道在printf语句中,如果是单个表达式,则评估将从左到右,但在正常语句中,它将从左到右.

但是如果printf包含多个表达式,那么评估将在堆栈上,元素将从左到右推入堆栈,但从右到左弹出,这证明TC输出是正确的

请纠正我在哪里错了???

Dan*_*Dan 8

C没有指定应该在哪里评估哪个顺序函数参数,因此它是未定义的,编译器可以选择它,包括任意和随机.Bjarne Stroustrup在"The C++ Programming Language"第3版第6.2.2节中明确说明了这一点

他还给出了一个理由:

Better code can be generated in the absence of restrictions on expression evaluation order
Run Code Online (Sandbox Code Playgroud)

  • @PeteWilson在回答C问题时参考C++书.答案使用"undefined",它应该使用"unspecified"(函数参数的评估顺序是**未指定**.这两个词并不意味着相同的事情).无论如何,这是错误的解释,因为OP的程序真的调用了**未定义的**行为,因为它没有将赋值分配给带有序列点的`i`. (3认同)