Ошибка в стандартах? - PullRequest
       12

Ошибка в стандартах?

1 голос
/ 22 января 2011

§5 / 4 C ++ стандарт

i = 7, i++, i++;  // i becomes 9
i = ++i + 1;  //the behavior is unspecified

Это должно быть изменено на

i = 7, i++, i++;  // the behavior is undefined
i = ++i + 1;  //the behavior is undefined

верно?

Ответы [ 4 ]

7 голосов
/ 22 января 2011

Да, смотрите этот отчет о дефектах: http://www.open -std.org / jtc1 / sc22 / wg21 / docs / cwg_defects.html # 351 .

Пояснение: пример неверен, но ваше «исправление» неверно для первого утверждения. Первое утверждение правильно прокомментировано в стандарте. Неточно только второй комментарий.

6 голосов
/ 22 января 2011
i = 7, i++, i++; // i becomes 9

отлично.Оператор = имеет более высокий приоритет, чем ,, поэтому выражение эквивалентно

(i = 7), i++, i++; 

, что является совершенно определенным поведением, поскольку , является точкой последовательности.

Насколько

i = ++i + 1; //the behavior is unspecified

касается поведения не определено в C ++ 03 , но четко определено в C ++ 0x .Если у вас есть черновик C ++ 0x, вы можете проверить его в разделе 1.9/15

i = i++ + 1; // the behavior is undefined
4 голосов
/ 22 января 2011

Нет, стандарт правильный. оператор запятой гарантирует, что любые побочные эффекты предыдущих операндов будут завершены до оценки следующего.

Эти гарантии предоставляются последовательностями , которыми являются оператор запятой (а также && и ||).

Обратите внимание, что вы правы в отношении изменения формулировки для второго утверждения. Не определено, не указано.

2 голосов
/ 22 января 2011

Это должно быть изменено на

i = 7, i++, i++;  // the behavior is undefined

Почему?Стандарт верен, это не должно быть изменено, и это поведение четко определено.

Запятая (,) вводит точку последовательности в расчет, поэтому порядокисполнение определено.

...