Необычное использование декрементов в циклах for для C

#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. Спасибо всем. Это действительно все прояснило. Я подозреваю, что позже я все еще могу споткнуться в зависимости от формулировки вопроса, но для этого мне просто придется решить некоторые проблемы. Ура!