MSdos 和 DevC++ 编译器中的前增量和后增量结果差异

pre increment and post increment result discrepancy in MSdos and DevC++ compiler

本文关键字:结果 DevC++ 编译器 MSdos      更新时间:2023-10-16

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

涡轮CPP编译器中使用的代码:-

#include<stdio.h>
main()
{
int i=0;
clrscr();
printf("%d %d %d",i,i++,++i);
getch();
return(0);
}

MSdos 编译器中的输出是 :- 2 1 1

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

1)我的理解是printf打印,首先取左变量,然后向右移动。(我已经使用 3 个不同的变量对其进行了验证。那么,根据这一点,输出不应该是 0 0 2 吗?

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

3) 另外,如果我改变:- printf ("%d %d %d", i,++i,i++);输出为 2 2 0。

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

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

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

因此,例如,它可以是:

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

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

C++没有

标准化函数参数的计算顺序,这就是为什么编译器的结果不同。请参阅C++标准,第 5.2.2/8 节:

参数的计算顺序未指定。