Оператор "-" в цикле while () - PullRequest
       1

Оператор "-" в цикле while ()

1 голос
/ 09 октября 2010

Я читаю книгу K & R, на странице 63 есть строка

while (--lim > 0 && (c=getchar()) != EOF && c != '\n')

, где lim равен int, равному 1000

Мой вопрос, почему lim не уменьшается после последовательных запусков цикла while?На мой взгляд, - lim эквивалентно "lim = lim - 1"

==================================================================

Спасибо за все ответы!

Ответы [ 6 ]

6 голосов
/ 09 октября 2010

--lim означает «возьми одно из значения lim и используй результат».

Альтернативой lim-- будет «использовать значение lim, а затем убрать одно».

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

MSDN как страница этого Операторы приращения и уменьшения префикса

Когда оператор появляется перед своим операндом, операнд увеличивается или уменьшается, и его новое значение является результатом выражения.

1 голос
/ 09 октября 2010

Попробуйте скомпилировать и запустить этот код. Это должно быть несколько поучительно.

#include <stdio.h>

int main()
{
        int lim = 10;
        while (--lim > 0 && 1 > 32)
             printf("I should never get here\n");
        printf("%d\n",lim); // lim is now 9
}

О, смотри, lim теперь 9, хотя я никогда не входил в цикл, потому что 1 не больше 32.

1 голос
/ 09 октября 2010

Lim уменьшается , вы, вероятно, ошиблись в другом месте. Однако --lim не совсем равно lim = lim - 1.

Существует два оператора для выполнения увеличения / уменьшения переменной: предварительное увеличение (или уменьшение) и последующее увеличение (или уменьшение).

++x (пре-инк) и x++ (пост-инк) изменяют значение х на +1. Так в чем же разница?

Когда вы используете x++ в выражении, выражение будет считать, что x имеет текущее значение, и после , оценивая все соответствующим образом, увеличивая это значение на единицу. Итак ...

int x = 5;
printf("%d", x++);

... выведет 5. ОДНАКО после строки printf () значение x будет равно 6.

Предварительное увеличение работает наоборот: значение x сначала увеличивается, а затем рассматривается для вычисления выражения, его окружающего. Итак ...

int x = 5;
printf("%d", ++x);

... выведет 6 и, конечно, значение x будет 6 после этого.

Конечно, то же самое относится и к операторам декремента.

Теперь операция присваивания (x = x + 1) оценивается как присвоенное значение после того, как присвоение произошло, поэтому ее поведение фактически аналогично ++x, а не x++.

1 голос
/ 09 октября 2010

Вы уверены?

#include <stdio.h>

int main()
{
        int lim = 10;
        while (--lim > 0 && printf("%d\n",lim));
}

Выход:

9
8
7
6
5
4
3
2
1
0 голосов
/ 09 октября 2010

Исключая пример Дэвида (где первоначальный тест 'c' приводит к тому, что тело цикла никогда не выполняется, и, следовательно, lim не уменьшается), и вероятность того, что lim изначально меньше или равен 1 (в этом случае getchar () не будет выполнен), код эквивалентен следующему:

c=getchar();
while (lim > 1 && c != EOF && c != '\n')
{
    lim = lim - 1;

    /* Original body of loop */

    c=getchar();
}

Оба исключения довольно маловероятны и, вероятно, несущественны, поэтому вы можете использовать приведенный выше код, если его легче понять.

0 голосов
/ 09 октября 2010

--lim или lim-- - это короткая комбинация lim = lim - 1, поэтому, возможно, автор захочет использовать этот синтаксис для лучшего разъяснения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...