Как работает оператор декремента в операторе while?

У меня есть следующий исходный код на C:

#include<stdio.h>

void main()
{
    int i=0, x=3;
    while((x---1))
    {
        i++;
    }
    printf("%d", i);
}

Как работает оператор while и почему он печатает 2 вместо 1?

4 ответа

Решение

Так как x---1 действительно просто x-- - 1 что дает значение x - 1 перед уменьшением x,

При условии x имеет начальное значение 3, цикл выполняется 2 раза (один раз с x = 3, один раз с x = 2, затем в следующий раз x равен 1, поэтому x - 1 равно 0, и цикл больше не работает).

Так, i начинается с 0 и увеличивается вдвое, так что в итоге получается 2.

(x---1) == (x-- -1)

потому что компилятор сначала пытается выбрать больший токен, так --- интерпретируется как -- & -

выражение x-- - 1 значит первый 1 вычитается из текущей стоимости x из-за - минус операция. затем x значение уменьшено на 1 из-за постфиксного оператора декремента --,

Например, перед первой итерацией x = 3, так что пока условие 2 (то есть 3 - 1) после этого x уменьшается до следующей итерации x = 2,

x = 3, i =0;

  • 1-итерации: while(2) и в цикле i становится 1

x = 2, i = 1;

  • 2-итерации: while(1) и в цикле i становится 2

x = 1, i = 2;

  • Сейчас, x - 1 знак равно 0 это дает while(0) и разрывы петли и i не прирост.

Так что после цикла вывода i: 2

отметьте еще один момент: i не увеличивается как разрыв цикла, потому что i++ в то время как блок {}, но x уменьшено до 0, После цикла, если вы печатаете x тогда вывод будет 0,

Так что время, вероятно, имеет больше смысла, если вы посмотрите на него с еще несколькими пробелами:

while( ( x-- - 1) )

Он использует пост-декремент, поэтому x изменяется после возврата его текущего значения, поэтому оно действительно эквивалентно этому:

while( ( x - 1) )

и цикл будет выполняться, пока выражение false или в этом случае 0 что эквивалентно false, Таким образом, пробег идет так:

x   x - 1   i
=============
3     2     1    x - 1 not 0 so increment i
2     1     2    x - 1 not 0 so increment i
1     0     2    Loop exits here and does not increment i again

В этот момент цикл завершается, и вы нажимаете printf,

while((x---1)) эквивалентно while((x-- -1 != 0))что, в свою очередь, совпадает с написанием while(x-- != 1), Поскольку значение x-- это значение x до декремента, это так же, как

while(x != 1) {
    x--;
    ...
}

который работает дважды, если x начинается в 3.

Другие вопросы по тегам