C++ MSdos和DevC中的增量前和增量后结果差异++;编译程序

C++ MSdos和DevC中的增量前和增量后结果差异++;编译程序,c++,c,side-effects,C++,C,Side Effects,在对printf中的变量进行预递增和后递增时,我无法理解以下问题:- turbocpp编译器中使用的代码:- #include<stdio.h> main() { int i=0; clrscr(); printf("%d %d %d",i,i++,++i); getch(); return(0); } #包括 main() { int i=0; clrsc(); printf(“%d%d%d”,i,i++,i++); getch(); 返回(0); } MSdos编译器中的输出

在对printf中的变量进行预递增和后递增时,我无法理解以下问题:-

turbocpp编译器中使用的代码:-

#include<stdio.h>
main()
{
int i=0;
clrscr();
printf("%d %d %d",i,i++,++i);
getch();
return(0);
}
#包括
main()
{
int i=0;
clrsc();
printf(“%d%d%d”,i,i++,i++);
getch();
返回(0);
}
MSdos编译器中的输出为:-2 1

但是对于DevC++5.11中的相同程序,输出为:-2

1) 我的理解是printf通过先取左变量,然后向右移动来打印。(我已经用3个不同的变量验证了它。)因此,根据这一点,输出不应该是0 2吗

2) 我尝试用DevC++检查同一程序的输出,但结果不同。现在我真的很困惑,应该输出什么

3) 同样,如果我改变:-printf(“%d%d%d”,I,++I,I++);输出为20


我不明白这里发生了什么。有人请帮我更好地理解

C++没有标准化函数参数的计算顺序,这就是为什么不同编译器的结果不同。参见C++标准,第5.2.2/8节:< /P> 未指定参数的求值顺序


在同一个变量上有两个副作用会给您一个不确定的结果,因为每个编译器都可以自由选择它计算参数的顺序

1.9/15:如果标量对象上的副作用相对于同一标量对象上的另一个副作用或一个 使用相同标量对象的值进行值计算 行为是未定义的

例如,它可以是:

  • 如果从左到右计算,则为0,0,1
  • 2,1,1如果从右向左计算
  • 2,1,2如果预增量在i上完成并存储在i中,则i作为第二个参数加载并进行后增量,然后i作为第三个参数(编译器假设预增量已经完成),然后i作为第一个参数

但其他组合也可能是合理的。未定义的行为意味着真正的未定义,所以也许有一天这甚至会崩溃(如果有人说一个编译器会自动生成并行代码并同时有两个内核访问同一个变量)

感谢Christophe的解释。请将您的程序改为使用单独的
printf
语句:
printf(%d\n“,i);printf(“%d\n”,i++);printf(“%d\n”,+i);printf(“%d\n”,i)。那么一切都应该是清晰的,明确的,有意义的。我已经测试过了。。顺便说一句,谢谢你的回复。