6

私はCで次のコードソースを持っています:

#include<stdio.h>

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

この while ステートメントはどのように機能し、1 ではなく 2 を出力するのはなぜですか?

4

4 に答える 4

10

なぜなら、デクリメントする前にの値を生成するのx---1は本当に正しいからです。x-- - 1x - 1x

の初期値がx3 の場合、ループは 2 回実行されます (x = 3 で 1 回、x = 2 で 1 回、次に x が 1 でx - 10 で、ループはそれ以上実行されません)。

つまり、i0 から始まり、2 回インクリメントされるため、最終的には 2 になります。

于 2013-07-30T14:05:58.427 に答える
5

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

コンパイラは最初に大きなトークンを選択しようとするため、 &---として解釈されます---

式は、マイナス演算によりの現在値からx-- - 1最初に1 減算されることを意味します。次に、後置デクリメント 演算子により、値が 1 減少します。x-x--

たとえば、最初の反復の前にx = 3、 while 条件は2(つまり3 - 1) その後xデクリメントされ、次の反復の前x = 2です。

x = 3i =0;

  • 1-イテレーション: while(2)、ループ内は次のようにiなり ます1

x = 2i = 1;

  • 2-イテレーション: while(1)、ループ内は次のようにiなり ます2

x = 1i = 2;

  • ここで、x - 1=はブレーク0を与え while(0)てループし、iインクリメントしません。

したがって、ループ出力の後i: 2

もう 1 つの点に注意してください: while-blockではiループ ブレークとしてインクリメントされませんが、 にデクリメントされます。ループの後、printfの場合、出力は になります。i++{}x0x0

于 2013-07-30T14:05:14.880 に答える
3

そのため、さらにスペースを入れて見ると、 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.

于 2013-07-30T14:08:12.013 に答える
2

while((x---1))は と同等でwhile((x-- -1 != 0))あり、これは と同じwhile(x-- != 1)です。x--の値はデクリメントx の の値なので、これは

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

x3 から始まる場合は 2 回実行されます。

于 2013-07-30T14:06:38.213 に答える