Программа имеет неопределенное поведение.
Этот оператор
j += *ptr++;
эквивалентен
j += *( ptr++ );
Таким образом, указатель теперь указывает на переменную i, которая являетсяон не указывает на действительный объект.
Таким образом, этот оператор
cout<<"ptr : "<<*ptr<<"\n";
вызывает неопределенное поведение.
Так получилось, что компилятор поместил переменную j послепеременная я. Однако порядок переменных не указан стандартом C ++.
Например, вывод компилятора gcc такой же, как вы показали.
i : 10
j : 12
ptr : 12
Хотя вывод компилятора clang равен
i : 10
j : 12
ptr : 4201824
Вы имеете в виду следующее
j += ( *ptr )++;
В этом случае вывод будет
i : 11
j : 12
ptr : 11
Обратите внимание, что выводимое значение i
равно 11
, поскольку переменная i
выводится в следующем предложении, когда к переменной уже применен побочный эффект.