Возможный дубликат:
Каков правильный ответ для 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;
}
Такое поведение странно для меня, почему так?
Вы вызываете неопределенное поведение, так что все может случиться, и нет смысла рассуждать о том, почему.
Выражение
std::cout<<*p<<"___"<<*(p++)<<"\n"
Есть один пример: порядок оценки всех вещей между <<
не указано, так *p
а также *(p++)
не упорядочены по отношению друг к другу (т. е. компилятору не требуется делать сначала один). Вы не можете изменять переменную, а затем использовать ее без изменения последовательности и использования., и поэтому это вызывает неопределенное поведение.
То же самое относится ко всем другим местам в этой программе, где переменная модифицируется и используется без последовательности отдельно в том же выражении.
Других решений пока нет …