c ++代码显示奇怪的行为

时间:2013-06-16 10:05:52

标签: c++ pointers reference

为什么它显示p的值增加两倍,即使根据代码它应该稍后增加

#include "iostream.h"
#include "conio.h"

using namespace std;

int main()
{
  int i;
  cin>>i;
  int *p;         // p is a pointer to int
  int *&r = p;   // r is a reference to the pointer p

  r = &i;        // r refers to a pointer; assigning &i to r makes p point to i
  cout<<*p<<*r<<(*p)++<<*p<<*r<<(*r)++<<endl;

  getch();
  return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为您想知道的奇怪行为是因为解析和执行重定向参数的顺序。

#include <iostream>

using namespace std;

int main()
{
  int i = 1;
  cout << i << i << i++ << i << i << i++ << endl;
  return 0;
}

在这种特殊情况下,在我使用的特定编译器上...(即这是所有未定义或未指定的行为 - 我只是试图解释结果。你应该总是避免编写触发未定义行为的代码)。 / p>

首先评估参数3和6(因为它们附加了++个运算符?感谢rodrigo)。

因此,最右边的i++评估为1i2

接下来评估第三个参数i++,给出2并将i保留为3

所有其他参数评估为3。这就是你得到输出的方式

332331

请注意,未指定重定向元素的评估顺序,也就是说,它可能会从编译器更改为编译器等,您无法知道它将是什么。

另见 Order of evaluation of arguments using std::cout

正如@rodrigo指出的那样,由于i在同一个表达式中递增两次,结果是未定义的。

所以有很多小鬼在玩,这是一个可能正确的,可能是错误的解释输出的生成方式。