В цикле while последний оператор, разделенный запятыми, гарантированно выполняется последним? - PullRequest
12 голосов
/ 01 ноября 2010

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

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

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

Ответы [ 3 ]

16 голосов
/ 01 ноября 2010

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

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

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

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

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

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

11 голосов
/ 01 ноября 2010

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

3 голосов
/ 23 февраля 2014

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

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

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

...