Ответ 1
В приведенном выше коде префикс ++
имеет приоритет над *=
, поэтому он запускается первым. В результате l
равно 4
.
UPDATE: Это действительно поведение undefined. Мое предположение о том, что правило приоритета было ложным.
Причина в том, что l
- это как lvalue, так и rvalue в *=
, а также в ++
. Эти две операции не секвенированы. Следовательно, l
записывается (и считывается) дважды "без точки последовательности" (старая стандартная формулировка), а поведение undefined.
Как побочный элемент, я предполагаю, что ваш вопрос связан с изменениями в точках последовательности в С++ 0x. С++ 0x изменил формулировку, касающуюся "точек последовательности", до "sequenced before", чтобы сделать стандартную четкость. Насколько мне известно, это не меняет поведения С++.
ОБНОВЛЕНИЕ 2: Оказывается, на самом деле существует четко определенная последовательность в соответствии с разделами 5.17 (1), 5.17 (7) и 5.3.2 (1) of N3126 черновик для С++ 0x. @Johannes Schaub ответ правильный, и документирует последовательность заявления. Конечно, кредит должен идти на его ответ.