В цикле 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
}
Это будет читать целое число, пока мы не прочитаем ноль.