在不同的编译器上得到不同的输出
Getting Different ouputs on Diffrent compilers
我遇到了运算符优先级问题…乍一看,这很容易,但实际上很难……我在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
- C++编译器命令 C++ 不会生成输出
- 编译器资源管理器和 GCC 具有不同的输出
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- 我不明白我的编译器是如何获得此输出的
- C++编译器只显示数字,不显示正确的输出
- 乘以时输出错误.这是我编译器中的错误吗?C
- Web 编译器输出奇怪的结果
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 编译器将输出的流运算符<<解释为用于按位左移的二进制运算符<<
- 构建 C/C++ 代码时的 Gradle 编译器输出
- C 编译器输出由于Permisson误差而未运行
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- VS说"Too few arguments...",但其他编译器给了我正确的输出?
- GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
- 以下代码的输出是什么(答案因差异编译器而异)
- 简单构造函数的复杂编译器输出
- C++程序中的输出编译器版本
- 最后的所有输出——c++编译器