【问题标题】:Why is -i++ and -(i++) different ? Why is the result as follows? [duplicate]为什么 -i++ 和 -(i++) 不同?为什么结果如下? [复制]
【发布时间】:2012-12-12 03:05:00
【问题描述】:

可能重复:
Order of evaluation of arguments using 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++)<<endl;
   return 0;
}

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

【问题讨论】:

  • 能否重新格式化,以便我们看到完整的代码。
  • 归结为评估顺序。看看这个:stackoverflow.com/questions/3181211/…
  • 我是C++新手,没学过课
  • @GrinV 一个有用的like to you answer
  • @GrinV:虽然您的每个输出语句都取决于评估顺序,但您报告的实际结果是不切实际的。您发布的代码不可能产生您发布的输出。发布您运行的确切代码及其打印的确切输出。

标签: c++ language-lawyer


【解决方案1】:

就目前而言,您的代码具有未定义的行为。您既在使用i 的值,又在修改i 而没有插入序列点1。这会产生未定义的行为。

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

总而言之,由于您有未定义的行为,any 输出是完全合理且允许的,但 -4 4 -3 3 是非常合理且可以理解的。


  1. 从 C++ 11 开始,该标准不再使用短语“sequence point”,而是使用“sequenced before”或“sequenced after”等短语来描述相同的基本意图。 少数 事情最终会从这个变化中得到定义的行为,但不是很多(特别是,不是这段代码)。

【讨论】:

  • 一句话,输出 -4 4 -3 3 不是正确的结果,是不是输出取决于编译器的心情?
  • @GrinV:正确——实际上没有任何一个正确的结果。至少正式地说,你得到的任何结果都是同样正确的。
  • 我在测试 -(i++) 和 -i++ 时出错了
【解决方案2】:

这两行是一样的

试试

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

此处可以找到任何运算符的运算符优先级:

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

而且,后缀 ++(你使用的那个)的优先级高于 一元加减

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

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

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

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

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

【讨论】:

  • 有趣的是,由于未指定评估顺序,尽管两行相同,但可能会产生不同的输出。
  • 这是真的吗? overloaded &lt;&lt;&gt;&gt; 运算符不会引入序列点吗?
  • 想,我现在要睡觉了,我稍后再看
  • 是的,你是对的,你想你
  • @MatteoItalia,我认为“Hello World”也是允许的输出......
猜你喜欢
  • 2011-10-06
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多