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

这是我的简单代码……

#include int main() { int i=5; printf("%d %d %d %d %d ",i++,i--,++i,--i,i); return 0; } 

在gcc上,它输出为“4 5 5 5 5”

但在TC上,它输出为’4 5 5 4 5′

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

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

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

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 

我认为没有指定评估函数调用的参数的顺序。 正如维基百科在本文中关于序列点所述:

未指定参数的计算顺序

在前一个和下一个序列点之间多次修改一个对象(在此代码i )是C中的未定义行为。这里序列点出现在所有参数被评估之后的函数调用中。

此时的两个答案调用了函数参数评估的未指定性。 正确答案是您的程序未定义,因为对序列点未分隔的同一变量有副作用。

实际上,函数参数的评估顺序是未指定的 。 这意味着在语句f(g(), h()); ,要么在h()之前调用g() ,要么在之后调用它。

但是,无序的副作用(如在程序中)会调用未定义的行为,任何事情都可能发生。

搞砸了一个老话题,但我刚刚发现gcc和Visual Studio编译器如何在一个语句中对同一个变量进行多项更改,所以想在这里分享它。

这里定义的编译器开始对printf中传递的参数实现堆栈方法,即’i’。 它遵循以下规则: –

1)现在它首先执行预增量,因此从右边正常开始然后–i然后执行++ i并且在i之后i的值为5因此它实现了这些值(pops)所以输出是_ _ 5 5 5

2)然后它继续从右到左并执行后增量因此,i–然后i ++因此i的值最终返回到5但由于i–它变为4但由于它是一个post而显示5因此,最终输出为4 5 5 5 5 ,i的最终值为5

希望我能清除你的疑虑。

TC不遵循这一点,因此它坚持我们的人类逻辑。