В цикле while последний оператор, разделенный запятыми, гарантированно выполняется последним?

Рассмотрим следующий (тривиальный) сегмент кода:

while (i++, i <= 10) {
  // some more code
}

В общем случае C++ позволяет вычислять операторы через запятую в любом порядке. В случае цикла while мы, по крайней мере, гарантируем (согласно спецификации), что последний оператор (который используется в качестве условия для цикла) будет вычислен последним?

3 ответа

Решение

В общем случае C++ позволяет вычислять операторы через запятую в любом порядке.

Если вы ссылаетесь на запятые между аргументами функции, это просто разделитель.

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

Так что да, это четко определено.

Из раздела 5.18/1 стандарта ISO C++98:

Пара выражений, разделенных запятой, оценивается слева направо, а значение левого выражения отбрасывается. Стандартные преобразования lvalue-to-rvalue (4.1), массив-указатель (4.2) и функция-указатель (4.3) не применяются к левому выражению. Все побочные эффекты (1.9) левого выражения, за исключением уничтожения временных (12.2), выполняются до оценки правого выражения. Тип и значение результата - это тип и значение правого операнда; результат - lvalue, если его правый операнд.

Да. , Оператор (если не перегружен!) вводит так называемую точку последовательности и действительно гарантирует порядок выполнения слева направо.

Приведенные выше комментарии объяснили это. И один из распространенных способов злоупотребления этим методом

while(scanf("%d", &n), n){
    // do something
}

Это будет читать целое число, пока мы не прочитаем ноль.

Другие вопросы по тегам