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

时间:2012-12-26 15:26:34

标签: c++ language-lawyer

  

可能重复:
  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 ++)某种方式

2 个答案:

答案 0 :(得分:6)

就目前而言,您的代码具有未定义的行为。您都使用i的值并修改i而没有插入序列点 1 。这给出了未定义的行为。

两行之间的结果差异源于括号的使用 - 它纯粹源于第一行中++修改{的值的事实{1}},所以当你到达第二行时,它的值已经递增。

总而言之,由于您有未定义的行为,任何输出都是完全合理且允许的,但i非常合理且易于理解。


  1. 从C ++ 11开始,标准不再使用短语“序列点”,而是使用“先前排序”或“之后排序”之类的短语来描述相同的基本意图。 少数事情最终会从此更改中获得定义的行为,但并不多(具体而言,不是此代码)。

答案 1 :(得分: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

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

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

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

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

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

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