Подтвердить что ты не робот

Является ли поведение "++ l * = m" undefined?

Я начал изучать С++ 0x. Я натолкнулся на следующее выражение:

int l = 1, m=2;
++l *= m;

Я понятия не имею, имеет ли второе выражение хорошо определенное поведение или нет. Поэтому я прошу об этом здесь.

Разве это не UB? Я просто хочу знать.

4b9b3361

Ответ 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 ответ правильный, и документирует последовательность заявления. Конечно, кредит должен идти на его ответ.

Ответ 2

Выражение хорошо определено в С++ 0x. Часто задаваемые вопросы о стандартном цитировании даются Prasoon здесь.

Я не уверен, что такое высокое соотношение (буквальные стандарты цитирования: пояснительный текст) предпочтительнее, поэтому я даю небольшое небольшое объяснение: помните, что ++L эквивалентен L += 1, и что вычисление значения этого выражения секвенируется после приращения L. И в a *= b вычисление значения выражения a секвенируется перед присвоением результата умножения в a.

Какие побочные эффекты у вас есть?

  • Increment
  • Назначение результата умножения

Оба побочных эффекта транзитивно секвенируются вышеупомянутыми двумя секвенированными последовательностями и секвенированными ранее.