在std :: cout中递增变量时,指针未显示更新的值

nSv*_*v23 4 c++ pointers operator-precedence

#include <iostream>
#include <string>

using namespace std;

int main()
{
  int a = 5;
  int& b = a;
  int* c = &a;

  cout << "CASE 1" << endl;
  cout << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl;
  b = 10;
  cout << endl << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl << endl;

  cout << "CASE 2";
  a = 5;
  cout << endl << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl;
  b = 10;
  cout << endl << "a is " << a << endl << "b is " << ++b << endl << "c is " << *c << endl << endl;

  cout << "CASE 3";
  a = 5;
  cout << endl << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl;
  b = 10;
  cout << endl << "a is " << a << endl << "b is " << b++ << endl << "c is " << *c << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

情况1:

a is 5. b is 5. c is 5.
a is 10. b is 10. c is 10.
Run Code Online (Sandbox Code Playgroud)

案例2:

a is 5. b is 5. c is 5.

a is 11. b is 11. c is 10.
Run Code Online (Sandbox Code Playgroud)

案例3:

a is 5. b is 5. c is 5.
a is 11. b is 10. c is 10.
Run Code Online (Sandbox Code Playgroud)

我理解CASE 1.但我很难理解CASE 2和CASE 3.有人可以解释为什么c在这两种情况下都没有更新新值?

mol*_*ilo 5

操作数的评估顺序未指定,您正在修改对象并在不对这些操作进行排序的情况下读取它.

因此,您的程序未定义cout << a << a++;,任何事情都可能发生.

  • 这有点模糊."任何事情都可能发生"使它看起来像是有未定义的行为,但只有使用旧的C++(在C++ 11之前)才会出现这种情况."未定义为..."是正确的但没有帮助; 我相信它实际上是"U ++ in C++ 03;在C++ 11及更高版本中未指定",用于OP中的代码和`cout << a << a ++`.我不确定. (3认同)
  • @anatolyg操作数评估在C++ 11(第1.9节,第15项)中未被排序,导致未定义的行为.我相信17改变了这个. (3认同)