これは非常に単純な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
_が表示されることを期待していました。
ありがとうございます。
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を使用し、しないは何も出力しません。これは、そのチェックのためにループが終了したためです。
i++
はpost-incrementであり、++i
はpre-incrementです。ポストインクリメントとは、オブジェクトをインクリメントした後に以前の値が返されることを意味します。プリインクリメントとは、オブジェクトがインクリメントされてから返されることを意味します。どちらの方法でも、式が評価されるときにオブジェクトが増分されます。そのため、最初の出力として0
が得られません。
チェック後、印刷する前にi
をインクリメントします。チェックして印刷した後にインクリメントするか、do while
ループ:
int main()
{
int i = 0;
do {
printf("%d\n", i);
} while(i++ < 10);
return 0;
}