#c
Вопрос:
Это было частью вопроса в тесте, предназначенном для того, чтобы просто проверить, понимаем ли мы использование операторов декремента. Я думал, что знаю. Я был неправ.
for(int i=99; i — -;) cout lt;lt; i;
Почему первый вывод из этого 98!? (В соответствии с тестом) Я думал, что постфиксное уменьшение означает, что уменьшение произойдет в следующей итерации.
Комментарии:
1. Префикс против постфикса не меняется при выполнении проверки, он изменяет возвращаемое значение уменьшения. Это
i--
происходит до того, как будет введен цикл. Он возвращает значение99
, да, но затем в теле цикла произошло уменьшение, и первое напечатанное значение равно98
. Префикс против постфикса будет актуален позже-именно поэтому цикл в конечном итоге печатается0
.2. здесь
i--
это второе утверждение в цикле for, а не третье. В этом-то и загвоздка. В цикле нет третьего оператора3. Этот вопрос также проверяет ваше понимание конструкций циклов. Условие завершения
for
цикла проверяется до того, как блок цикла будет когда-либо выполнен.
Ответ №1:
Оператор постфиксного уменьшения не означает, что уменьшение происходит «на следующей итерации» некоторого цикла. В конце концов, вы не найдете никакого цикла в следующей функции:
int counter; int next_one() { return counter--; }
Очень тщательный поиск не выявит наличия какого-либо цикла в приведенном выше коде. Ни counter--
то , ни другое не меняет его фундаментального значения, потому что оно появляется как выражение в for
цикле. counter--
всегда означает одно и то же в C , где бы оно ни появлялось. То же самое относится и к любому другому базовому выражению.
Оператор постфиксного уменьшения означает, что уменьшение происходит после оценки его объекта (его текущее значение «используется»), но до следующего оператора или выражения (и до нескольких других точек последовательности, но это не относится к данному обсуждению).
for(int counter=99; counter--;) cout lt;lt; counter;
В приведенном выше коде «следующий оператор или выражение», которое выполняется после counter--
, является cout lt;lt; counter
. Поэтому, если начальное значение счетчика равно 99, «до следующего оператора или выражения» дает вам железную гарантию того, что оно будет уменьшено до counter
того, как будет напечатано значение «s».
Комментарии:
1. Спасибо всем. Это действительно все прояснило. Я подозреваю, что позже я все еще могу споткнуться в зависимости от формулировки вопроса, но для этого мне просто придется решить некоторые проблемы. Ура!