Как работает оператор декремента в операторе 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.