首页 文章

MSdos和DevC编译器中的前增量和后增量结果差异[重复]

提问于
浏览
1

这个问题在这里已有答案:

在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 回答

  • 0

    C没有标准化计算函数参数的顺序,这就是为什么结果因编译器而异 . 参见C标准,第5.2.2 / 8节:

    参数的评估顺序未指定 .

  • 1

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

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

    所以它可以是例如:

    • 0,0,1如果从左到右进行评估

    • 2,1,1如果从右到左进行评估

    • 2,1,2如果在i上完成预增量并存储在i中,则i作为第二个参数加载并且后递增,然后我将采用第三个参数(编译器假设已经完成了预增量),然后我被视为第一个论点 .

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

相关问题