2012-12-26 125 views
-4

可能重复:
Order of evaluation of arguments using std::cout为什么-i ++和 - (i ++)不同?为什么结果如下?

我现在已经知道它这是负责'COUT' 的所有代码:

#include <iostream> 
using namespace std; 
int main() 
{ 
    int i = 3; 
    cout <<-i++<<endl<<i<<endl<<-(i++)<<endl<<i<<endl; 
    return 0; 
} 

我使用VC++ 6.0编译,输出为:-4 4 -3 3 但是我用g ++编译,输出是:-4 5 -3 5 为什么?我想他们应该是相同的:-4 4 -4 4

PS:我试试吧:

int main() 
{ 
    int i = 3; 
    cout <<-i++<<endl; 
    return 0; 
} 

而且

int main() 
{ 
    int i = 3; 
    cout <<-(i++)<<endl; 
    return 0; 
} 

我编译他们一个接一个,结果是一样的:-3 3 认为对所有的答案,我也许有测试-i的错误++和 - (我++)不知何故

+0

可以重新格式化,所以我们可以看到完整的代码。 –

+1

归结为评估顺序。看看这个: http://stackoverflow.com/questions/3181211/prefix-postfix-increment-operators – Peter

+0

我是一个C++的绿手,我还没有学过类 – GrinV

回答

1

这两条线是相同的

尝试

int i = 3; 
cout << - i++ << endl << i << endl; 
i=3 
cout << -(i++) << endl << i << endl; 

任何操作的运算符优先级在这里找到:

http://en.cppreference.com/w/cpp/language/operator_precedence

而且,后缀++(您使用的)具有比一元加更高的优先级和减去

在另一方面,你应该阅读Q和A:

Why is a = i + i++ undefined and not unspecified behaviour

你的例子其实是一模一样的:

(
    (
    (
     cout.operator<<(-(i++)) 
    ).operator<<(endl) 
).operator<<(i) 
).operator<<(endl); 

从本质上说,改变一个变量,并使用它在同一个表达式中往往是未定义的行为:该程序被允许做任何事情

+1

有趣的是,由于计算的顺序是未指定的,尽管是在两行相同的可能会产生不同的输出。 –

+0

这是真的吗? *重载*'<<' and '>>'操作符不会引入序列点吗? –

+0

认为,我现在要睡觉,我会稍后阅读 – GrinV

6

就像现在这样,你的代码有未定义的行为。你们都使用i的数值,并修改了i而没有干预序列点。这给出了未定义的行为。

在两条线之间产生的差异确实从使用括号干 - 这纯粹是从在第一线的++修改的i值,所以当你到达第二行的事实茎,其价值已增加。总之,由于您的行为不明确,所以的任何输出都是完全合理的,并且是允许的,但是-4 4 -3 3是相当合理和可以理解的。


  1. 作为C++ 11,标准不再使用的短语“序列点”,但使用措辞如“之前测序”或“后测序”来描述相同的基本意图。 A 很少事情最终从这个变化中获得了定义的行为,但并不是很多(特别是不是这个代码)。
+0

总而言之,输出-4 4 -3 3不是正确的结果,是依赖于编译器的任何输出情绪? – GrinV

+0

@GrinV:正确 - 没有任何一个正确的结果。至少官方说,你得到的任何结果都是同样正确的。 –

+0

我有一个测试错误 - (i ++)和-i ++莫名其妙 – GrinV

相关问题