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

时间:2015-06-05 16:58:05

标签: c++

我陷入了运算符优先级问题......在第一次看起来它很容易但它真的很难......我在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个,任何帮助都会受到赞赏...另外请告诉我这些操作符以何种顺序相互调用以便在控制台上获得所需的输出

3 个答案:

答案 0 :(得分:1)

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 regarding operator precedence

  

在C中,你不能假设在中评估多个子表达式   看似自然的顺序。例如,考虑表达式   ++ a * f()。这是在调用函数f之前还是之后递增?编译器可以按任意顺序执行,因此您无法进行   假设

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

从技术上讲,这不是一个错误,即使它不一致。

短期解决方案:

a = 9;

答案 1 :(得分:0)

如果你真的写了这样的代码,你就麻烦了。 你必须使用像

这样的辅助变量
byte[] bytes = File.ReadAllBytes("pathtoyourdll");
AppDomain.CurrentDomain.Load(bytes);

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

如果你的问题是出于学习目的,有些情况没有独特的结果,因为编译器解决这个等式的方式。

Dr.dobbs的杂志显示了这样的几个案例,并且所有方程式都没有确切的结果。

我现在无法获得一些显示您永远不会使用的代码的页面,以避免此类错误。

仅举例:http://www.cplusplus.com/forum/beginner/26383/

答案 2 :(得分:0)

这是一个序列点问题,如果你启用了-Wsequence-point,它应该警告你。从本质上讲,您的陈述是未定义的,这也是不同编译器给出不同结果的原因。

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