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

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

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

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

Ответ 1

В общем случае С++ разрешает вычислениям, разделенным запятой, в любом порядке.

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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