-3

可能重复:
使用 std::cout 评估参数的顺序

我现在知道了!这是负责'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++)&lt;<endl;
   return 0;
}

我一一编译,结果是一样的:-3 3思考所有答案,我可能在某种程度上测试-i++和-(i++)有错误

4

2 回答 2

6

就目前而言,您的代码具有未定义的行为。您既可以使用 1 的值,也可以在没有干预序列点1i的情况下进行修改。这给出了未定义的行为。i

两行结果的差异并非源于括号的使用——它纯粹源于++第一行中的 修改了 的值i,所以当你到达第二行时,它的值已经增加了。

总而言之,由于您有未定义的行为,因此任何输出都是完全合理和允许的,但这-4 4 -3 3是非常合理和可以理解的。


  1. 从 C++ 11 开始,该标准不再使用短语“sequence point”,而是使用诸如“sequenced before”或“sequenced after”之类的短语来描述相同的基本意图。一些事情最终从这个变化中得到了定义的行为,但不是很多(特别是,不是这段代码)
于 2012-12-26T16:00:18.043 回答
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

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

另一方面,你应该阅读这个问答:

为什么 a = i + i++ 未定义而不是未指定的行为

您的示例实际上与此相同:

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

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

于 2012-12-26T15:42:52.560 回答