在不同的编译器上得到不同的输出

Getting Different ouputs on Diffrent compilers

本文关键字:输出 编译器      更新时间:2023-10-16

我遇到了运算符优先级问题…乍一看,这很容易,但实际上很难……我在DEV和Visual studio上运行它,但是它给出了不同的输出,我完全震惊了。下面是我的代码

#include<iostream>
using namespace std;
int main(){
int a=0;
a=++a*++a*a++;
cout<<a<<endl;
}

它在Dev和g++中提供8个输出,但在Microsoft Visual studio 2013中提供9个输出,任何帮助将不胜感激…另外,请告诉我这些操作符彼此调用的顺序,以便在控制台上获得所需的输出。

a=++a*++a*a++;

应该是

++a;++a; //a = 2, because you have the two pre-increments.
temp = a * a; //temp = 4
temp = temp * a; //temp = 8
a = temp; //a = 8
a++; //a = 9, for the post-increment.

所以你应该把这个和你的CPU规格一起报告给编译器团队。

但是,根据gnu.org关于操作符优先级的规定:

在C中,不能假设在看起来很自然的顺序。例如,考虑表达式++a * f()这是在调用函数f之前还是之后增加a ?编译器可以用任何一种顺序来做,所以你不能做假设。

(注意以上内容摘自GNU c手册)

所以从技术上讲,这不是一个bug,尽管它不一致。

短期解决方案:
a = 9;

如果你真的写这样的代码,你就有麻烦了。最好使用辅助变量,如

#include<iostream>
using namespace std;
int main(){
int a=0;
int aux = ++a;
a=aux*aux*a++;
cout<<a<<endl;
}

或类似的东西来解决歧义。

如果你的问题是为了学习,有些情况下没有唯一的结果,因为这是编译器解这个方程的方式。

。《dobbs’s Magazine》展示了几个这样的例子,并不是所有的方程都有一个确切的结果。

我现在找不到一些页面来展示你永远不会使用的代码,以避免这样的bug。

例如:http://www.cplusplus.com/forum/beginner/26383/

这是一个序列点问题,如果您启用了-Wsequence-point,应该已经警告您了。在本质上,你的语句是未定义的,这就是为什么不同的编译器给出不同的结果。

请查看此问题之前的答案:undefined-behavior-and-sequence-points