Адрес приращения в выражении cout дает неожиданный вывод - PullRequest
1 голос
/ 26 февраля 2020

Я не понимаю, что здесь происходит. Должно быть что-то, связанное с "termen" гриппа sh, но я хотел бы объяснения.

int arr[4] {3,8,1,6};

cout<<arr[0];
cout<<arr[1];
cout<<arr[2];
cout<<arr[3];

cout<<endl;

cout<<&arr[0]<<endl;
cout<<&arr[1]<<'\n';
cout<<&arr[2]<<endl;
cout<<&arr[3]<<endl;

cout<<&arr[0]<<endl;

int *j = &arr[0];
cout << *j << *(++j) << *(++j) << *(++j); // HERE IS THE PROBLEM

Почему эта последняя команда cout имеет тенденцию выводить числа в обратном порядке? Мне кажется, что это откат назад, но я не уверен.

Я ожидал 3816 в качестве вывода, вместо этого я получил 6618.

1 Ответ

5 голосов
/ 26 февраля 2020

В выражении

cout << *j << *(++j) << *(++j) << *(++j);

Порядок оценки не определен, поэтому поведение не определено .

Примерами неопределенного поведения являются обращения к памяти за пределами границ массива, целочисленное переполнение со знаком, разыменование нулевого указателя, более одной модификации одного и того же скаляра в выражении без какой-либо промежуточной точки последовательности (до C ++ 11), которые не были упорядочены (начиная с C ++ 11)

I управлял им , и он превосходил 3816. Обратите внимание, что с флагами предупреждения это обнаруживается компилятором.

Если вы попытаетесь:

cout << *j;
cout << *(++j);
cout << *(++j); 
cout << *(++j);

Это хорошо упорядоченное выражение отобразит ожидаемый результат.

...