while文もfor文と同じく命令文をくりかえし実行します

ソーラー 「そう、24時間営業したい!


そんな、activeな、あなたへ、このwhile文


#include <stdio.h>

int main(void){


while(1)printf("ただいま24時間大好評セール中です。");


return 0;

}


はいかがです?


このwhile文は

while( )の( )の中の論理式の値が1のとき


while( )に続く命令文をずっと繰り返しつづけるんだ。


while( )に続く命令文が複数あるときは


その複数の命令文を{ }


でくくるのはif文のときと同じでっす。


このwhile文のプログラムを実行すれば


ずっと


なにも命令をこちらから与えなくても


ただいま24時間大好評セール中です。が


コマンドプロンプト画面に


ひたすら実行表示されつづけます。


大変便利ですね。


デスクトップパソコンのディスプレイに


このプログラムのコンパイル結果を表示した


コマンドプロンプト画面を貼り付けておけば


お客様も


ただいま24時間大好評セール中です。


とすぐに気づいていただけます。


同じ文章表示をくりかえす電光掲示板に最適です。」


マックス「ほう、どうれ


このプログラムをコンパイルすればいいだけなのか?


それっと」



コンパイル実行ボタンをおしてみる。



実行されるプログラム

#include <stdio.h>

int main(void){


while(1)printf("ただいま24時間大好評セール中です。"

);


return 0;

}


コンパイル結果


ずたたたたたたたたたたたたたたっ


マックス 「ぉぉぉおおおっ す、凄まじい~~~


 こ、このスピード・・・


画面をおおいつくす


ただいま24時間大好評セール中です。


お、お客様もびっくり、い、いきてるいきてる


なんて斬新なデザイン


ぶるぶるぶるるんぶるるん


このwhile文のコンパイル結果は一味違う・・・」


ソーラー 「そう、アピール度抜群のデスクトップ掲示板です。


また お部屋に飾っておけば一味お味のちがう空間に早代わり(^^)


画面いっぱいに


ただいま24時間大好評セール中です。


が広がってみえるのは


while(1)printf("ただいま24時間大好評セール中です。");


の命令文のところで


while(1)printf("ただいま24時間大好評セール中です。\n");と


エスケープシーケンス\n(改行)がかかれていないからなんだね。


だから


ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。ただいま24時間大好評セール中です。・・・・・・

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・



と ただいま24時間大好評セール中です。


が改行されず超高速でつながって表示されているわけなんだ。


だから


次のプログラムのように


エスケープシーケンス\nをかきこんでコンパイルすると


今度は


ただいま24時間大好評セール中です。が


きれいに改行されてprintf出力表示され


#include <stdio.h>

int main(void){


while(1)printf("ただいま24時間大好評セール中です。\n");


return 0;

}


コンパイル結果


ただいま24時間大好評セール中です。

ただいま24時間大好評セール中です。

ただいま24時間大好評セール中です。

ただいま24時間大好評セール中です。

ただいま24時間大好評セール中です。

ただいま24時間大好評セール中です。


となります。」


マックス 「fof文につづいて

同じく

ずっと命令文を繰り返すwhile文か・・・」


ソーラー 

「while文はfor文と一緒で命令文をずっと繰り返すというシステムです


while文の基本形は


for文と同じで


初期化式、条件式、継続方法の


3つの項目があります。


初期化式をまずかく。

次に

while(条件式){

printf("%d\n",a);(😊実行したい命令文)

継続処理方法

}

をかく。


という仕様になっています。


実際に

具体例をみていきましょう。


#include <stdio.h>

int main(void){

int a=2;


while(a<5){

printf("%d\n",a);

a++;

}

return 0;

}


このプログラムでは


初期化式 int a=2;

条件式 a<5

継続処理方法 a++


となっています


まず初期化式 

int a=2;

が記述されていますね。


ですので a=2が


while(a<5)の条件式である論理式a<5に代入される。


論理式a<5の値が2<5=1(真の値)となることによって


while(a<5)>>> while(2<5)>>>while(1)


となり


while文の実行条件のwhile(1)がみたされているため


printf("%d\n",a);に


a=2を代入した


printf("%d\n",2);


が実行される。


これで1回目のプログラムの実行は終了です。


次に継続方法 a++により


aが今格納している値2に1をたした


a=3が


while(a<5)の論理式a<5に代入される。


論理式a<5の値が3<5=1となることによって


while(a<5)>>> while(3<5)>>>while(1)


となり


while文の実行条件のwhile(1)がみたされているため


printf("%d\n",a);に


a=3を代入した


printf("%d\n",3);


が実行される。


これで2回目のプログラムの実行も終了です。


次に継続方法 a++により


aが今格納している値3に1をたした


a=4が


while(a<5)の条件式である論理式a<5に代入される。


論理式a<5の値が4<5=1となることによって


while(a<5)>>> while(4<5)>>>while(1)


となり


while文の実行条件のwhile(1)が満たされているため


printf("%d\n",a);に


a=4を代入した


printf("%d\n",4);


が実行される。


これで3回目のプログラムの実行も終了です。


次に継続方法 a++により


aが今格納している値4に1をたした


a=5が


while(a<5)の論理式a<5に代入される。


論理式a<5の値が5<5=0となることによって


while(a<5)>>> while(5<5)>>>while(0)


となり


while文の実行条件のwhile(1)が満たされていないので


ここでプログラムのwhile文の実行はおわります。


コンパイル結果は


2

3

4


となります。」


マックス「このwhile文とfor文は


初期化式 条件式 継続方法


をどのようにかくか


見た目がちがうだけでまったくおなじ命令文じゃないか?」


ソーラー 「 そうですね。


見た目は for文とwhile文では ちがってみえますが


翻訳されたコンパイル後の機械語はまったく同じものだったりして・・・


さすがにすこしはちがうかな


それに関しては機械語を勉強すると理解できるようになるかな?」





🌞  🌞  🌞  🌞  🌞  🌞  🌞


   おまけのコーナー





for文を使った命令文

printf("%d\n",a);

を繰り返すプログラム

👇

#include <stdio.h>

int main(void){


int a=2;

for(a;a<5;a++)

printf("%d\n",a);


return 0;


}



while文を使った命令文

printf("%d\n",a);

を繰り返すプログラム

👇


#include <stdio.h>

int main(void){

int a=2;


while(a<5){

printf("%d\n",a);

a++;

}

return 0;

}


はコンパイルされると

同じ機械語の命令となって実行されているのでしょうか?


それとも

違う機械語の命令となって実行されているのでしょうか?


興味がありますね。


そこで

for文を使った命令文

printf("%d\n",a);

を繰り返すプログラム


while文を使った命令文

printf("%d\n",a);

を繰り返すプログラム



アセンブリ言語という

機械語と同等の

言語に書き換えてみます。


書き換えたアセンブリ言語のプログラムが一緒であれば

機械語のプログラムもまったく同じということになります。



for文を使った命令文

printf("%d\n",a);

を繰り返すプログラム

👇は


#include <stdio.h>

int main(void){


int a=2;

for(a;a<5;a++)

printf("%d\n",a);



return 0;


}



アセンブリ言語では


.LC0:

.string "%d\n"

main:

push rbp

mov rbp, rsp

sub rsp, 16

mov DWORD PTR [rbp-4], 2

.L3:

cmp DWORD PTR [rbp-4], 4

jg .L2

mov eax, DWORD PTR [rbp-4]

mov esi, eax

mov edi, OFFSET FLAT:.LC0

mov eax, 0

call printf

add DWORD PTR [rbp-4], 1

jmp .L3

.L2:

mov eax, 0

leave

ret


とあらわされます。



while文を使った命令文

printf("%d\n",a);

を繰り返すプログラムは

👇


#include <stdio.h>

int main(void){

int a=2;


while(a<5){

printf("%d\n",a);

a++;

}

return 0;

}

アセンブリ言語で


.LC0:

.string "%d\n"

main:

push rbp

mov rbp, rsp

sub rsp, 16

mov DWORD PTR [rbp-4], 2

.L3:

cmp DWORD PTR [rbp-4], 4

jg .L2

mov eax, DWORD PTR [rbp-4]

mov esi, eax

mov edi, OFFSET FLAT:.LC0

mov eax, 0

call printf

add DWORD PTR [rbp-4], 1

jmp .L3

.L2:

mov eax, 0

leave

ret



とアセンブリ言語で表されます。


よ~くみると


for文を使った命令文

printf("%d\n",a);

を繰り返すプログラム


while文を使った命令文

printf("%d\n",a);

を繰り返すプログラムは


まったく同じアセンブリ言語で記述されるのがわかります。



つまり


for文を使った命令文

printf("%d\n",a);

を繰り返すプログラム


while文を使った命令文

printf("%d\n",a);

を繰り返すプログラムは


コンパイルされると


まったく同じ

機械語プログラムによって命令が実行されています。


           solarplexussより

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

作者を応援しよう!

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

応援したユーザー

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