MSdos 和 DevC++ 编译器中的前增量和后增量结果差异
pre increment and post increment result discrepancy in MSdos and DevC++ compiler
在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 节:
参数的计算顺序未指定。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- MSdos 和 DevC++ 编译器中的前增量和后增量结果差异