Указатель, не показывающий обновленное значение при увеличении переменной в 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 не обновляется с новым значением в обоих случаях?

2 4

2 ответа:

Порядок вычисления операндов не определен, и вы изменяете объект и считываете его без последовательности этих операций.

Таким образом, ваша программа так же неопределенна, как и cout << a << a++;, и может произойти все, что угодно.

Я думаю, что ваша проблема связана с тем, что называется последовательными точками. Вы можете долго читать об этом в этом ответе, но в нескольких словах он в основном определяет порядок или оценку элементов выражения.

Update в вашем случае этот порядок не определен, хотя некоторые компиляторы, похоже, делают его справа налево.