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

Why is -i++ and -(i++) different ? Why is the result as follows?

本文关键字:为什么 结果 不同 i++ -i++      更新时间:2023-10-16

可能重复:
使用std::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++(的错误,不知何故

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

两行之间结果的差异并非源于括号的使用——它纯粹源于第一行中的++修改了i的值,因此当您到达第二行时,其值已递增。

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


  1. 从C++11开始,该标准不再使用短语"序列点",而是使用"在之前排序"或"在之后排序"等短语来描述相同的基本意图。一些的东西最终从这次更改中得到了定义的行为,但并不多(特别是,没有这个代码(

这两行是同一

尝试

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);

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