Указатель, не показывающий обновленное значение при увеличении переменной в std:: cout [дубликат]
На этот вопрос уже есть ответ здесь:
- порядок оценки аргументов с использованием std:: cout 4 ответа
- странный вывод, не так, как ожидалось 2 ответа
- неопределенное поведение и точки последовательности 4 ответа
#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 ответа:
Порядок вычисления операндов не определен, и вы изменяете объект и считываете его без последовательности этих операций.
Таким образом, ваша программа так же неопределенна, как иcout << a << a++;
, и может произойти все, что угодно.
Я думаю, что ваша проблема связана с тем, что называется последовательными точками. Вы можете долго читать об этом в этом ответе, но в нескольких словах он в основном определяет порядок или оценку элементов выражения.
Update в вашем случае этот порядок не определен, хотя некоторые компиляторы, похоже, делают его справа налево.