2016-03-05 60 views
1

我无法理解下面的问题,同时预递增,递增后里面的printf变量: - 在turbocpp编译器使用预增量,在MSDOS和DEVC++编译器后增量结果差异

代码: -

#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)M理解是printf打印左边的变量,然后右移(我用3个不同的变量对它进行了验证)。那么,根据那个输出不应该是0 0 2?

2)I与DEVC++尝试检查同一节目的输出,但它给了不同的结果。现在我真的很困惑,应该是输出。

3)另外,如果我变化: - 的printf( “%d%d%d”,I,++ I,I ++);输出为2 2 0

我没有得到这到底是怎么回事。有人请帮助我更好地了解...

+0

请改变你的程序中使用单独的' printf'语句:'printf(“%d \ n”,i); printf(“%d \ n”,i ++); printf(“%d \ n”,++ i); printf(“%d \ n”,i);'。然后,一切都应该清晰明确,并且有意义。我已经测试过 –

+0

..顺便说一句,谢谢你的回复。 – whatsinaName

回答

0

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

参数的评估顺序未指定。

1

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

1.9/15:如果一个标量对象上的副作用是相对于相同的标量对象上或者另一侧的效果或使用相同的标量对象的值的 值计算未测序,所述 行为未定义。

所以它可能是例如:

  • 0,0,1如果从左向右计算
  • 2,1,1如果评估从右到左
  • 2,1,2如果pre-increment是在i上完成并存储在i中,那么我将作为第二个参数加载并且增加后,然后i被接受为第三个参数(编译器假定preincrement已经完成),然后将i作为第一个参数。

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

+0

感谢Christophe的解释。 – whatsinaName