这个问题在这里已有答案:
在printf中预先递增和后递增变量时,我无法理解下面的问题: -
turbocpp编译器中使用的代码: -
#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 .
我不知道这里发生了什么 . 有人请帮助我更好地理解......
2 回答
C没有标准化计算函数参数的顺序,这就是为什么结果因编译器而异 . 参见C标准,第5.2.2 / 8节:
对同一个变量有两个副作用会给你一个不确定的结果,因为每个编译器都可以自由选择它评估参数的顺序 .
所以它可以是例如:
0,0,1如果从左到右进行评估
2,1,1如果从右到左进行评估
2,1,2如果在i上完成预增量并存储在i中,则i作为第二个参数加载并且后递增,然后我将采用第三个参数(编译器假设已经完成了预增量),然后我被视为第一个论点 .
但其他组合也可能是合理的 . 未定义的行为意味着真的未定义,所以也许有一天这甚至可能崩溃(如果有人说编译器会自动生成并行代码并且2个内核同时访问同一个变量)