for文の()内の初期化式、条件式、継続処理方法を書いたり書かなかったりするとどうなるでしょうか モンスター数値さん、お久しぶりです 0.1

EAZY IDECをお使いの方は

以下にでてくるプログラムにおいて

printf("このprintf出力表示は%d回目です\n",a);

と記述せず

printf("このprintfは%d回目です\n",a);

と記述してください

なぜかコンパイルエラーとなります


#include <stdio.h>


int main(void){

int a;

for(a=1; a<=3; a++){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


アレサ 「ここでfor(a=1; a<=3; a++)のはたらきにより


for(a=1; a<=3; a++)につづく{}内の命令文


printf("このprintf出力表示は%d回目です\n",a);



a=1,a=2,a=3と値をかえながら


繰り返し実行されていきます。


つまり

printf("このprintf出力表示は%d回目です\n",1);

printf("このprintf出力表示は%d回目です\n",2);

printf("このprintf出力表示は%d回目です\n",3);


実行されていくのですね。


ここでa++は


for(a=1; a<=3; a++)に


継続処理方法として


かきこまれています。


a++は


a=1,a=2,a=3とaの数値を1つずつ増やしていく・・・


つまり


aの値を1つずつ変化させながら


命令を継続させるための


継続処理する方法を示すためにかかれているのです。


そして、


for(a=1; a<=3; a++)の真ん中の条件式の項の


a<=3はaの数値が3のときまで


printf("このprintf出力表示は%d回目です\n",a);


を繰り返すために記述されています。」


ソーラー 「ふっふ~ん😊


このfor文はいろいろカスタマイズできそうだね。


では、a++がない場合


for(a=1; a<=3;)とかかれた場合(一番右の項が空白になっています)


はどうなるかな。



そうきましたか😝 solarplexussより



早速コンパイルしてみると


#include <stdio.h>


int main(void){

int a;

for(a=1; a<=3;){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


コンパイル結果

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

以下ずっと

このprintf出力表示は1回目です

が続いていく


ソーラー「


このプログラムは


aの値を1つずつ増加させるa++はかかれていないけれども


a=1の場合の命令文をずっとくりかえしているね・・・


もしかして


for文は同じ命令を繰り返す機能が



        🍓もともと備わっていて🍓



a++がない状態


for(a=1; a<=3; )のような状態でも


a=1の場合をずっと繰り返してしまうのじゃないかな?


つまりa++なしでも繰り返し命令をおこなうことができる。


a=1ならずっとa<=3の条件式を満たしているので


プログラムがとまることもないし・・・


では 条件式


for(a=1; )で条件式a<=3;を書かない場合は?


for文は同じ命令文を繰り返す機能がもともと備わっているなら


a=1の場合だけを


ずっと繰り返してしまいそう?


コンパイルしてみると


#include <stdio.h>


int main(void){

int a;

for(a=1; ){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


コンパイル結果

ファイル「C:/Users/solarplexus/AppData/Local/EasyIDEC/project/sasasa/main.c」の

「5行目」で記述エラーを発見しました。

「identifier」を付け忘れています。


おおっと


久々にでてきた。「identifier」=識別子


はて、これはなんのことかな・・・


と思ったら


この場合のコンパイルエラーのもとになってる識別子は;なんだよね。


つまり


条件式と継続処理方法をかかなくてもいいのだけど


for(a=1; )ではコンパイルできず


for(a=1; ;)と


for文の書式のセミコロン2つ


をきちんとかかないとコンパイルできないんです。


つまり


for文はfor( ;  ; ) この書式が基本ということ。


そこでまたもとにもどり


プログラムを


for(a=1; ;)と修正してコンパイルしてみると


#include <stdio.h>


int main(void){

int a;

for(a=1; ;){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}

コンパイル結果

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

このprintf出力表示は1回目です

以下ずっと

このprintf出力表示は1回目です

が続いていく


やっぱりfor文には



          🍓もともと命令を繰り返す機能🍓



があるんだ。」


アレサ 「なんだか


for文の仕組みがすこしだけわかってきましたね。


どうやら条件式がないと・・・


for文の表示をとめられなさそうですね、ソーラーさん。」


ソーラー 「そうだ、こんどは


継続処理方法a++だけをかいた


for(;;a++)をコンパイルしてみよっ


なんというかこんなのコンパイルできるのかな?


さあ、どうだろ


なにかさらにfor文の仕組みがわかるかもしれない。


では プログラムを構成してっと


#include <stdio.h>


int main(void){

int a;

for(; ;a++){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


ソーラー「コンパ~イル~」


統合開発環境Visual Studoでは変数が初期化されていないと


ビルド失敗となるよう


設計されているので


変数aが初期化されていないこのプログラムを実行することはできません。


優秀ですね。


私の手持ちの統合開発環境EAZY IDECのコンパイラでは


コンパイル結果は


ちょっと暴走ぎみですが元気よく

このprintf出力表示は4234333回目です

このprintf出力表示は4234334回目です

このprintf出力表示は4234335回目です

とaの値を1ずつ増加させながら


ずうっと繰り返しておられます。」


アレサ「繰り返しておられます」


ソーラー

「それも  なぜかかなり高速で(^^)


もう元気のよさが一味ちがいます。


これも成功です。


どうしてこのようなコンパイル結果が表示されるのかは


後ほど調べるとしようかな。


では


for(;;)と 初期化式も条件式も継続処理方法も書かない場合は・・・


これはどうなるんでしょうか?みなさ~ん。


#include <stdio.h>


int main(void){

int a;

for(; ;){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


ソーラー「コンパ~~~イル~」


統合開発環境Visual Studoでは変数が初期化されていないとビルド失敗となるよう


設計されているので


変数aが初期化されていないこのプログラムを実行することはできません。


統合開発環境EAZYIDECでは


コンパイル結果


このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です


ソーラー「

👆

このprintf出力表示は4198543回目です


がずっとつづきます。


このプログラムでなつかしい数値がでてきました。


(このprintfは4198543回目です。)の中の数値


      「4198543」   です。


これは変数aを初期化してないとでてくるモンスター数値なんだ。


なつかしいな(^^)/


今のプログラムの場合、


確かにint a;(aの変数宣言)はかいてあるけど


変数aの初期化はおこなわれてないね。


詳しくは、天国にいけるC言語入門


☆変数の初期化 

☆変数を初期化しないと モンスターがなかにはいってて、 どしぇー

☆初期化する前の変数に格納されている値をみつけちゃえ(^^)

☆☆初期化されていない変数に格納されている数値をもとめてみました 

をご参照ください。


うわあっ


ほんとうに懐かしい。


前は変数の初期化のことですら全然分からなかったんだ。


ははあっ さては


さきほどのプログラム


#include <stdio.h>


int main(void){

int a;

for(; ;a++){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


のコンパイル結果が

このprintf出力表示は4234333回目です

このprintf出力表示は4234334回目です

このprintf出力表示は4234335回目です


そう、いきなり

4234333、

4百23万台あたりからプログラムがはじまったのも


説明できるかな。


さきほどのプログラムはfor(; ;a++)と書いただけで


for文の一番左の初期化式を記入するところに


for(a=1; ;a++)のように書いて


変数aの初期化をおこなわなかったため


変数aの初期化を行わない場合に変数aに格納されている数値


a=4198543から


printf("このprintf出力表示は%d回目です\n",a);


の繰り返しがはじまったわけなんじゃないかな。


そして継続処理方法に


a++が記述されているから


aの値が

4198543から1つずつ値を増やしながら


printf("このprintf出力表示は%d回目です\n",a);


が実行されるというわけなんだね。


となると


先程のプログラムの


コンパイル結果は


このprintf出力表示は4198543回目です

このprintf出力表示は4198544回目です

このprintf出力表示は4198545回目です

と表示されるはずなのだけど


コンピュータがあまりにも高速でプログラムを実行するため


この部分は一瞬でコマンドプロンプト画面に表示されて


気付かれることなく終わり



このprintf出力表示は4234333回目です

このprintf出力表示は4234334回目です

このprintf出力表示は4234335回目です


いきなり

4234333、

4百万台あたりからコンパイル結果の表示がはじまったようにみえるわけだね。


もちろん、for(a=1; ;a++)のように


変数aの初期化


a=1;

を行った場合は


コマンドプロンプト画面へは


このprintf出力表示は1回目です

このprintf出力表示は2回目です

このprintf出力表示は3回目です

から


表示がはじまるよ ♪♪♪~~~


そして


for(;;)と 初期化式も条件式も継続処理方法も書かない場合は・・・


#include <stdio.h>


int main(void){

int a;

for(; ;){

printf("このprintf出力表示は%d回目です\n",a);

}

return 0;

}


ソーラー「コンパ~~~イル~」


統合開発環境Visual Studoでは変数が初期化されていないとビルド失敗となるよう


設計されているので


変数aが初期化されていないこのプログラムを実行することはできません。


統合開発環境EAZYIDECでは


コンパイル結果


このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です

このprintf出力表示は4198543回目です


と表示されるのは


for(; ;)と記述したため


変数aの初期化式が記述されていないので


変数aが初期化されていないときに


変数aが格納している数値


4198543


から


つまり


printf("このprintf出力表示は%d回目です\n",4198543);


から


繰り返しが始まったからなんだね。


また


継続処理方法が記述されていないので


変数aが格納している数値は


4198543


のまま


printf("このprintf出力表示は%d回目です\n",4198543);


の繰り返しがおこなわれているんだね。


さらに


条件式も書かれていないので


変数aの格納している値によって


printf("このprintf出力表示は%d回目です\n",4198543);


繰り返しが止まるということもないわけなんだね。」








  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます