- ベストアンサー
プログラミングに関する質問
つい最近、Cの勉強を始めたばかりの初心者です。本を見ながら、自分で簡単なプログラムを作成、実行させている段階ですが、以下のプログラムを実行すると、出力される値が n2 = 0 となります。 自分の解釈が未熟でお恥ずかしいのですが、私の理解では、while (i++ < n2) の部分が、iが0から+1づつ足されていって、9 < n2(10) までなり、n2 -= i; が n2 = n2 - i で n2 = 10 - 9 で1となり、n2 = 1 となると思っていました。 お手数お掛けしますが、どなたか、素人の私にもわかるように専門用語も少なめでご説明頂けないでしょうか。 #include <stdio.h> int main(void) { int i, n2; i = 0; n2 = 10; while (i++ < n2) n2 -= i; printf("n2 = %d\n", n2); return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
while文の前で iの値は0 n2の値は10 while文の最初の実行は while(0<10)となり成立 従ってiの値が1足されて iの値は1 n2-=iが実行されてn2の値は9 2回目のwhile文は while(1<9)で成立 従ってiの値が1足されて iの値は2 n2-=iが実行されてn2の値は7 3回目のwhile文は while(2<7)で成立 従ってiの値が1足されて iの値は3 n2-=iが実行されてn2の値は4 4回目のwhile文は while(3<4)で成立 従ってiの値が1足されて iの値は4 n2-=iが実行されてn2の値は0 5回目のwhile文は while(4<0)で不成立 従ってループを終了し n2の値は0 以上です。
その他の回答 (3)
こんにちは。 『百聞は一見に如かず』です。 ソースに、値検証用のprintf文を入れてみて、実際の実行中の変数の値を 出力するようにしてみたら如何でしょう? 以下は、そのサンプルソースです。 ■検証用ソース 注)インデント等のため全角スペースを入れています。 ========================= #include <stdio.h> int main(void) { int i, n2; i = 0; n2 = 10; printf( "== Check Start ==\n" ); printf( "Check-1: i=%2d, n2=%2d, [Before: Loop]\n", i, n2 ); while (i++ < n2) { printf( "Check-2: i=%2d, n2=%2d, [in Loop: Before: n2 -= i]\n", i, n2 ); n2 -= i; printf( "Check-3: i=%2d, n2=%2d, [in Loop: After : n2 -= i]\n", i, n2 ); } printf( "Check-4: i=%2d, n2=%2d, [After : Loop]\n", i, n2 ); printf( "== Check End ==\n" ); printf("n2 = %d\n", n2); return 0; } ========================= <上記サンプルの実行結果> == Check Start == Check-1: i= 0, n2=10, [Before: Loop] Check-2: i= 1, n2=10, [in Loop: Before: n2 -= i] Check-3: i= 1, n2= 9, [in Loop: After : n2 -= i] Check-2: i= 2, n2= 9, [in Loop: Before: n2 -= i] Check-3: i= 2, n2= 7, [in Loop: After : n2 -= i] Check-2: i= 3, n2= 7, [in Loop: Before: n2 -= i] Check-3: i= 3, n2= 4, [in Loop: After : n2 -= i] Check-2: i= 4, n2= 4, [in Loop: Before: n2 -= i] Check-3: i= 4, n2= 0, [in Loop: After : n2 -= i] Check-4: i= 5, n2= 0, [After : Loop] == Check End == n2 = 0 ↑これを見て考えてみて下さい。 以上です。
お礼
ありがとうございます。大変参考になりました。
- BearCave
- ベストアンサー率20% (189/909)
No.1です。 質問を読み返してみて、質問者さんが勘違いしている点が分かりましたので、再度回答します。 while (i++ < n2) n2 -= i; この部分は2つの独立した文ではなく、2行目はwhileの中の文です。以下と同じ意味です。 while (i++ < n2) { n2 -= i; } 質問者さんはwhileが終了してから次の「n2 -= i;」へと進むと勘違いされているようですので。そうしたい場合、記述はこうなります。 while (i++ < n2); n2 -= i; ちなみにこの場合のプログラムは、「i」が10になった時点で「10 < 10」でFalseとなりループは終了します。でも「++」が「i」の前ではなく後ろに付いているので、条件を先にチェックしてから値が増えることになり、ループ終了時には「i」は11になります。よって「-1」がn2の最終値になります。
お礼
ご指摘の通り、勘違いしていました。ありがとうございます。
- BearCave
- ベストアンサー率20% (189/909)
whileの条件である「i」と「n2」は、両方とも常に値が変化しているので注意が必要です。各ループで両方の値がどのように変化しているのかを書いてみれば、一目瞭然だと思います。 初期値:i=0、n2=10 1ループ目:i=1、n2=9 2ループ目:i=2、n2=7 3ループ目:i=3、n2=4 4ループ目:i=4、n2=0 「i」が増えると「n2」から引かれる数も大きくなる点がポイントです。4ループが終わった時点で「i < n2」の条件がFalseとなるので、ループが終了します。よってn2の最終値は0です。
お礼
iもn2も両方とも値が変化するのですね。稚拙な質問にお付き合い頂いてありがとうございます。また、丁寧な回答も感謝です。
お礼
丁寧な回答ありがとうございます。よくわかりました。