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が代入されています


ですので a=2が


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


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


つまり


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


となることによって


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


while(a<5)に続くブロック{}内の命令文


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


aの値2を代入した


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


が実行される。




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


aが今格納している値2に1をたすことにより


aの値は3になります


これでwhile{}文の1回目の繰り返し実行は終了です。


次に


while{}文の2回目の繰り返し実行に移ります


aの値は3となっているので


a=3が


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


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


つまり


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


となることによって


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


while(a<5)に続くブロック{}内の命令文


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


a=3を代入した


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


が実行される。




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


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


4が


aに代入されることになります




これでwhile{}文の2回目の繰り返し実行は終了です。


次に


while{}文の3回目の繰り返し実行に移ります


while(a<5)の条件式である論理式a<5のaに4が代入されることになります


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


つまり


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


となることによって


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


while(a<5)に続くブロック{}内の命令文


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


a=4を代入した


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


が実行される。


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


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


5



aに代入されることになります



これでwhile{}文の3回目の繰り返し実行は終了です。


次に4回目のプログラムの実行に移ります


aの値は5なので


while(a<5)の論理式a<5のaに5が代入されます


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


つまり


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


となることによって


()内が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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る