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

Gri*_*inV -4 c++ language-lawyer

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

我现在已经知道了!这是'cout' 的全部代码:

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

我用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;
}
Run Code Online (Sandbox Code Playgroud)

int main()
{
   int i = 3;
   cout <<-?i++?<<endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我逐个编译它们,结果是一样的:-3 3想到所有的答案,我可能有一个错误的测试-i ++和 - (i ++)莫名其妙

Jer*_*fin 6

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

两条线之间的结果差异并不是来自括号的使用 - 它纯粹源于++第一行中的值修改了它的值i,所以当你到达第二行时,它的值已经递增.

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


  1. 从C++ 11开始,标准不再使用短语"序列点",而是使用"先前排序"或"后排序"之类的短语来描述相同的基本意图.一个件事结束了,这一变化让定义的行为,但不是很多(和,特别是,不是这个代码).


归档时间:

查看次数:

542 次

最近记录:

12 年,8 月 前