-3

为什么它显示 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;
}
4

1 回答 1

1

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

#include <iostream>

using namespace std;

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

在这种特殊情况下,在我正在使用的特定编译器上......(即,这都是未定义或未指定的行为 - 我只是试图解释结果。您应该始终避免编写触发未定义行为的代码)。

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

所以最右边的i++计算结果为1并留下i2

接下来评估第三个参数i++,给出2并离开i3

所有其他参数的计算结果为3。这就是你获得输出的方式

332331.

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

另见 使用 std::cout 的参数评估顺序

正如@rodrigo 向我指出的那样,因为i在同一个表达式中增加了两次,所以结果是未定义的。

所以有很多小精灵在起作用,这是对如何生成输出的一种可能正确、可能不正确的解释。

于 2013-06-16T10:56:42.020 回答