web-dev-qa-db-ja.com

Cのwhileループでポストインクリメント

これは非常に単純なCプログラムです。

_int main()
{
    int i = 0;
    while(i++ < 10)
         printf("%d\n", i);

    return 0;
}
_

結果は次のとおりです。

_1
2
3
4
5
6
7
8
9
10
_

なぜ_0_が最初に印刷されないのですか?そして、_i++_を_++i_に置き換えると、次のようになります。

_1
2
3
4
5
6
7
8
9
_

_i++_と_++i_の両方で、最初の数値は_1_です。
whileループwhile()でポストインクリメントのために_0_が表示されることを期待していました。
ありがとうございます。

11
algo

i++(および++i)はwhile式の評価の一部として行われます。これはbeforeの印刷時に行われます。つまり、常に最初に1が常に出力されます。

i++バリアントと++iバリアントの唯一の違いは、インクリメントが式自体の内部で発生する場合で、これは出力される最終的な値に影響します。それぞれの同等の疑似コードは次のとおりです。

while(i++ < 10)            while i < 10:
                               i = i + 1
    printf("%d\n", i);         print i
                           i = i + 1

そして:

                           i = i + 1
while(++i < 10)            while i < 10:
    printf("%d\n", i);         print i
                               i = i + 1

iが最大9になるとしましょう。 i++ < 10では、while式に9 < 10を使用しますthenは、印刷する前にiを10にインクリメントします。したがって、チェックは9を使用し、次に10を出力します。

++i < 10では、最初にiをインクリメントしますその後は、while式に10 < 10を使用します。したがって、チェックは10を使用し、しないは何も出力しません。これは、そのチェックのためにループが終了したためです。

13
paxdiablo

i++post-incrementであり、++ipre-incrementです。ポストインクリメントとは、オブジェクトをインクリメントした後に以前の値が返されることを意味します。プリインクリメントとは、オブジェクトがインクリメントされてから返されることを意味します。どちらの方法でも、式が評価されるときにオブジェクトが増分されます。そのため、最初の出力として0が得られません。

3
0x499602D2

チェック後、印刷する前にiをインクリメントします。チェックして印刷した後にインクリメントするか、do whileループ:

int main()
{
    int i = 0;
    do {
        printf("%d\n", i);
    } while(i++ < 10);
    return 0;
}
0
Michael Slevin