Как это для цикла завершается? - PullRequest
0 голосов
/ 31 мая 2019

Находится в виде пользовательского сообщения по коду leetcode для задачи Plus One.

vector<int> plusOne(vector<int>& digits) {
  for (int i=digits.size(); i--; digits[i] = 0)
      if (digits[i]++ < 9)
          return digits;
  digits[0]++;
  digits.push_back(0);
  return digits;
}

Обычно в условном выражении есть что-то вроде i >= 0; Как это происходит для завершения цикла и отсутствия доступа к некоторому элементу -i?

1 Ответ

2 голосов
/ 31 мая 2019

Цикл for завершается, когда второе выражение равно false или когда контекстно преобразуется в значение bool , получается false.В C ++ 0 контекстуально преобразуется в false;все остальные целые числа преобразуются в true в контексте bool.(Спасибо MM за ссылку.)

Таким образом, в начале каждого цикла вычисляется выражение i--.Это просто выражение, поэтому оно даст результат.Если полученный результат равен нулю, цикл завершится.Если вы раньше не видели это выражение, вот как оно работает:

  • Оно уменьшает значение i и возвращает исходное значение i до его уменьшения.Таким образом, если i было 5, оценка i-- будет иметь "результат" 5, но в качестве побочного эффекта i будет 4 после оценки.

Общая картина: i уменьшается на 1 каждый раз, поэтому, предполагая, что он начинается с положительного значения, он опустится до 0, и тогда оценка i-- даст 0.

...