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

Pointer not showing updated value when incrementing a variable in std::cout

#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;
}

输出:

案例 1:

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

案例 2:

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

a is 11. b is 11. c is 10.

案例 3:

a is 5. b is 5. c is 5.
a is 11. b is 10. c is 10.

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

未指定操作数的计算顺序,并且您正在修改一个对象并在没有对这些操作进行排序的情况下读取它。

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

我认为你的问题是由于所谓的序列点。您可以在 this answer 中详细了解它,但简而言之,它基本上说明了表达式元素的顺序或求值。

Update 在你的例子中,这个顺序是未定义的,尽管有些编译器似乎是从右到左。