こんにちは。いさごです。
While loopで{}を付け忘れた場合どうなるか宿題がでました。
自分でやってみたところ、コンパイルは出来たのですが、
whileの部分でプログラムが止まり、終了できなくなりました。
考えてみたのですが、実際に中で何が起きているのかよく分かりません。
どなたか教えていただけませんか?
質問です~。
-
管理人
Re:質問です~。
if文で書く上記/*内容*/の部分を色々変更してコンパイルしてみてください。
カッコがあるかないかでどのようにかわるのか確認するためにこのようなプログラムを書いてみました。
それぞれの大きなカッコは一つ一つのプログラムに分かれていることを強調したものです。
カッコがあるかないかでどのようにかわるのか確認するためにこのようなプログラムを書いてみました。
それぞれの大きなカッコは一つ一つのプログラムに分かれていることを強調したものです。
#include <stdio.h>
int main(){
{
printf("1\n");
if(1==1)
printf("2\n");
printf("3\n");
if(1==2)
printf("4\n");
printf("5\n");
}
{
int i=0,a=0;
while(i<10)
i++;
a++;
a++;
printf("a=%d\ti=%d\n",a,i);
}
{
int i,a=0;
for(i=0;i<10;i++)
a++;
a++;
a++;
printf("a=%d\ti=%d\n",a,i);
}
return 0;
}
このプログラムをじっくり見て、どのように処理が行われるからこうような出力になるのか考えてみてください。-
管理人
Re:質問です~。
boxさんのおっしゃっている「実行しっぱなし」を目で見てわかるようにしたのが下のプログラムです。
whileの条件をちょっといじくって「a++;かi++;がどちらか20億回計算されたら終了」するようにしてあります。
(プログラムの意味を直訳すると「iの値もaの値もどちらも20億より小さい時ループ」)
PCのスペックによってはずっと黒い画面のままだと思いますので、気長に何か表示されるまで待ってください。
この黒い画面のままのときは裏でひたすら計算が行われているのです。(20億回もね。)
>whileの場合、条件の更新がwhileの真下にあればその部分だけループされる、と言う事でしょうか。
その通りです。
whileに限らず、カッコを省略するものにはそれが適応される事が多いです。
if文であったり、for文であったり、while文であったり。
カッコを沢山書くとうっとうしいので、よく1行しか実行する文が無い時は省略して書きます。
whileの条件をちょっといじくって「a++;かi++;がどちらか20億回計算されたら終了」するようにしてあります。
(プログラムの意味を直訳すると「iの値もaの値もどちらも20億より小さい時ループ」)
PCのスペックによってはずっと黒い画面のままだと思いますので、気長に何か表示されるまで待ってください。
この黒い画面のままのときは裏でひたすら計算が行われているのです。(20億回もね。)
#include <stdio.h>
int main(){
long int i=0,a=0;
while(i<2000000000 && a<2000000000)
a++;
i++;
printf("a++;は%10d回計算されました。\ni++;は%10d回計算されました。\n",a,i);
return 0;
} >whileの場合、条件の更新がwhileの真下にあればその部分だけループされる、と言う事でしょうか。
その通りです。
whileに限らず、カッコを省略するものにはそれが適応される事が多いです。
if文であったり、for文であったり、while文であったり。
カッコを沢山書くとうっとうしいので、よく1行しか実行する文が無い時は省略して書きます。
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(i==j){
printf("iとj同じ\n");
}
}
}
これと
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(i==j)
printf("iとj同じ\n");
これは同じことです。
書いてある次の行のみ有効になります。
基本的に「次の;まで」だと思ってください。