c++代码表现出奇怪的行为

c++ code showing weird behaviour

本文关键字:代码表 c++      更新时间:2023-10-16

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

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

#include <iostream>
using namespace std;
int main()
{
  int i = 1;
  cout << i << i << i++ << i << i << i++ << endl;
  return 0;
}

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

参数3和6首先求值(因为它们附加了++操作符?罗德里戈)感谢。

因此最右边的i++求值为1, i求值为2

接着计算第三个参数i++,得到2,留下i作为3

所有其他参数求值为3。这就是得到输出

的方法

332331 .

请注意,重定向元素的求值顺序没有指定,也就是说,它可能会随着编译器的不同而改变,等等,你无法知道它会是什么。

见也使用std::cout

计算参数的顺序

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

所以有很多小妖精在起作用,这是一个可能是正确的,也可能是不正确的输出是如何产生的解释