C++ 为什么是-i++;和-(i+;+;)不同?为什么结果如下?

C++ 为什么是-i++;和-(i+;+;)不同?为什么结果如下?,c++,language-lawyer,C++,Language Lawyer,可能重复: 我现在知道了!这是“cout”的原因。 所有代码: #include <iostream> using namespace std; int main() { int i = 3; cout <<-i++<<endl<<i<<endl<<-(i++)<<endl<<i<<endl; return 0; } 及 intmain() { int i=3; 这两

可能重复:

我现在知道了!这是“cout”的原因。 所有代码:

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

intmain()
{
int i=3;

这两条线是一样的

试一试

inti=3;

cout就目前而言,您的代码具有未定义的行为。您正在使用
i
的值,并且在没有中间序列点1的情况下修改
i
。这会产生未定义的行为

这两行之间的结果差异并不是因为使用了括号,而是因为第一行中的
++
修改了
i
的值,所以当您到达第二行时,它的值会增加

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


< C++ > 11,标准不再使用短语“序列点”,而是使用类似“先排序”或“后排序”的短语来描述相同的基本意图。一些事情最终从这个变化中得到了定义行为,但不是很多(具体地说,不是这个代码)。
你能重新格式化,这样我们就能看到完整的代码,它是按照评价的顺序来的。看看这个:我是C++的新手,我还没学过。class@GrinV一个有用的@GrinV:虽然您的每个输出语句都取决于求值顺序,但您报告的实际结果是不现实的你发布的输出。发布你运行的确切代码和打印的确切输出。有趣的是,由于计算顺序未指定,尽管相同,但这两行可能会产生不同的输出。这是真的吗?重载的
运算符没有引入序列点吗?我想,我现在必须睡觉了是的,你是对的,我想you@MatteoItalia,我想“你好,世界”也是一个允许的输出…总之,输出-4-3不是正确的结果,任何输出是否取决于编译器的情绪?@GrinV:正确--实际上没有任何一个正确的结果。至少从官方来看,你得到的任何结果都是同样正确的。不知何故,我在测试-(I++)和-I++时犯了一个错误
int main()
{
   int i = 3;
   cout <<-i++<<endl;
   return 0;
}
int main()
{
   int i = 3;
   cout <<-(i++)<<endl;
   return 0;
}
int i = 3;
cout << - i++  << endl << i << endl;
i=3
cout << -(i++) << endl << i << endl;
(
  (
    (
      cout.operator<<(-(i++))
    ).operator<<(endl)
  ).operator<<(i)
).operator<<(endl);