私はCで次のコードソースを持っています:
#include<stdio.h>
void main()
{
int i=0, x=3;
while((x---1))
{
i++;
}
printf("%d", i);
}
この while ステートメントはどのように機能し、1 ではなく 2 を出力するのはなぜですか?
私はCで次のコードソースを持っています:
#include<stdio.h>
void main()
{
int i=0, x=3;
while((x---1))
{
i++;
}
printf("%d", i);
}
この while ステートメントはどのように機能し、1 ではなく 2 を出力するのはなぜですか?
なぜなら、デクリメントする前にの値を生成するのx---1
は本当に正しいからです。x-- - 1
x - 1
x
の初期値がx
3 の場合、ループは 2 回実行されます (x = 3 で 1 回、x = 2 で 1 回、次に x が 1 でx - 1
0 で、ループはそれ以上実行されません)。
つまり、i
0 から始まり、2 回インクリメントされるため、最終的には 2 になります。
(x---1)
==(x-- -1)
コンパイラは最初に大きなトークンを選択しようとするため、 &---
として解釈されます--
-
式は、マイナス演算によりの現在値からx-- - 1
最初に1
減算されることを意味します。次に、後置デクリメント 演算子により、値が 1 減少します。x
-
x
--
たとえば、最初の反復の前にx = 3
、 while 条件は2
(つまり3 - 1
) その後x
デクリメントされ、次の反復の前x = 2
です。
x = 3
、i =0
;
while(2)
、ループ内は次のようにi
なり ます1
x = 2
、i = 1;
while(1)
、ループ内は次のようにi
なり ます2
x = 1
、i = 2;
x - 1
=はブレーク0
を与え while(0)
てループし、i
インクリメントしません。 したがって、ループ出力の後i
: 2
もう 1 つの点に注意してください: while-blockではi
ループ ブレークとしてインクリメントされませんが、 にデクリメントされます。ループの後、printfの場合、出力は になります。i++
{}
x
0
x
0
そのため、さらにスペースを入れて見ると、 while はおそらくより理にかなっています。
while( ( x-- - 1) )
後デクリメントを使用しているため、現在の値を返した後に x が変更されるため、これは実際には次のようになります。
while( ( x - 1) )
false
式がor になるまでループが実行されます。この場合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 から始まる場合は 2 回実行されます。