Также не существует не определено поведение. И даже ни один из них не задан или неуказанный. (Все три условия - разные вещи.)
Эти две линии хорошо определены, но они делают разные вещи.
*++p1 = *p2++;
эквивалентно
_T1* _p1 = ++p1;
T2_* p2_ = p2++;
*_p1 = *p2_;
И
++*p1 = *p2++;
эквивалентно
T1& x = *p1;
__T1_& y = ++x;
T2_* p2_ = p2++;
y = *p2_;
Где
С ++x
(для C++ нативных типов) возвращение ссылки на x
в вашем случае x
и y
являются одной и той же ссылка (т.е. *p1
) - но это не может быть в случае, если T1
будет каким-то пользовательский типом с перегруженными operator++()
.
ADD:
Очевидно приращение значения, а затем присвоить это совершенно бессмысленно.
И да - как и другие люди, которые уже сказали, просто не пишите код, о котором у вас есть такие вопросы. Напишите то, что ясно для вас и должно быть понятным читателям.
ADD2:
Чтобы уточнить спорные моменты я цитирую стандарт.
ИСО/МЭК 14882-2003 5.3.2:
- Операнд префикса ++ модифицируется путем добавления 1, или установить истинно, если оно является BOOL (это использование не рекомендуется). Операнд должен быть модифицируемым lvalue. Тип операнда должен быть арифметическим типом или указателем на полностью определенный тип объекта. Значение представляет собой значение операнда; это значение lvalue. Если x не относится к типу bool, выражение ++ x эквивалентно x + = 1.
Интересно, почему все это утро задает вопросы о группировке произвольного '++,' * 'и' = 'в одном ужасно сложной и тяжелой для чтения строки ... – ereOn
Если вы должны попробовать и выясните, будет ли код ужасно взрываться и вызвать апокалипсис или нет, ** не используйте его **. Независимо от того, насколько он определен, это * не хороший код *. – ssube
Если это не легко читаемо и прозрачно, это не нормально. – maligree