Я начал изучать С++ 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
.
Какие побочные эффекты у вас есть?
Оба побочных эффекта транзитивно секвенируются вышеупомянутыми двумя секвенированными последовательностями и секвенированными ранее.