Я начал изучать С++ 0x. Я натолкнулся на следующее выражение:
int l = 1, m=2;
++l *= m;
Я понятия не имею, имеет ли второе выражение хорошо определенное поведение или нет. Поэтому я прошу об этом здесь.
Разве это не UB? Я просто хочу знать.
Я начал изучать С++ 0x. Я натолкнулся на следующее выражение:
int l = 1, m=2;
++l *= m;
Я понятия не имею, имеет ли второе выражение хорошо определенное поведение или нет. Поэтому я прошу об этом здесь.
Разве это не UB? Я просто хочу знать.
  В приведенном выше коде префикс ++ имеет приоритет над *=, поэтому он запускается первым. В результате 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 ответ правильный, и документирует последовательность заявления. Конечно, кредит должен идти на его ответ.
Выражение хорошо определено в С++ 0x. Часто задаваемые вопросы о стандартном цитировании даются Prasoon здесь.
Я не уверен, что такое высокое соотношение (буквальные стандарты цитирования: пояснительный текст) предпочтительнее, поэтому я даю небольшое небольшое объяснение: помните, что ++L эквивалентен L += 1, и что вычисление значения этого выражения секвенируется после приращения L. И в a *= b вычисление значения выражения a секвенируется перед присвоением результата умножения в a.
Какие побочные эффекты у вас есть?
Оба побочных эффекта транзитивно секвенируются вышеупомянутыми двумя секвенированными последовательностями и секвенированными ранее.