iostream — c ++ странное поведение std :: cout с использованием указателей

Возможный дубликат:
Каков правильный ответ для cout << C ++ << с ;?

Я просто выдал текст, когда вдруг заметил.

#include <iostream>
int main()
{
int array[] = {1,2,3,4};
int *p = array;

std::cout << *p << "___" << *(p++) << "\n";
// output is  1__1. Strange, but I used  brackets! it should be at
// first incremented, not clear.
p = array;std::cout << *p << "___" << *(++p) << "\n";
// output is 2_2   fine, why first number was affected? I didn't intend
// to increment it, but it was incremented
p=array;std::cout << *p << "___" << *(p + 1) << "\n";
// output is 1_2 - as it was expected
p = array;

return 0;
}

Такое поведение странно для меня, почему так?

4

Решение

Вы вызываете неопределенное поведение, так что все может случиться, и нет смысла рассуждать о том, почему.

Выражение

std::cout<<*p<<"___"<<*(p++)<<"\n"

Есть один пример: порядок оценки всех вещей между << не указано, так *p а также *(p++) не упорядочены по отношению друг к другу (т. е. компилятору не требуется делать сначала один). Вы не можете изменять переменную, а затем использовать ее без изменения последовательности и использования., и поэтому это вызывает неопределенное поведение.

То же самое относится ко всем другим местам в этой программе, где переменная модифицируется и используется без последовательности отдельно в том же выражении.

15

Другие решения

Других решений пока нет …