为什么它显示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;
}
答案 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++
评估为1
,i
为2
。
接下来评估第三个参数i++
,给出2
并将i
保留为3
。
所有其他参数评估为3
。这就是你得到输出的方式
332331
。
请注意,未指定重定向元素的评估顺序,也就是说,它可能会从编译器更改为编译器等,您无法知道它将是什么。
另见 Order of evaluation of arguments using std::cout
正如@rodrigo指出的那样,由于i
在同一个表达式中递增两次,结果是未定义的。
所以有很多小鬼在玩,这是一个可能正确的,可能是错误的解释输出的生成方式。