私は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-- - 1x - 1x
の初期値がx3 の場合、ループは 2 回実行されます (x = 3 で 1 回、x = 2 で 1 回、次に x が 1 でx - 10 で、ループはそれ以上実行されません)。
つまり、i0 から始まり、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なり ます2x = 1、i = 2;
x - 1=はブレーク0を与え while(0)てループし、iインクリメントしません。 したがって、ループ出力の後i: 2
もう 1 つの点に注意してください: while-blockではiループ ブレークとしてインクリメントされませんが、 にデクリメントされます。ループの後、printfの場合、出力は になります。i++{}x0x0
そのため、さらにスペースを入れて見ると、 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--;
...
}
x3 から始まる場合は 2 回実行されます。