for{}文やwhile{}文の条件式の中で関数が記述されていると1回ごとのループの前にその関数が実行されることになります その1

以下が


飛行機が飛んでいる最中でも


Escキーを押すと


すぐに


プログラムの実行が終了する


プログラムです

👇

#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です




int x = 0;


int a=0;


while (x < 640 && a == 0) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


x++;


a = CheckHitKey(KEY_INPUT_ESCAPE);//KEY_INPUT_ESCAPEはEscキーに対応しています


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します

}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです

👇



ソーラー「マックス 飛行機が右に飛んでいるよ


さあ


今のうちにEscキーを押すんだ!」


マックス「おっしゃあ~


Escキー


プゥッ~シュ~」


👇


https://youtu.be/BWh8-0QSyjA


solarplexuss 「うぅ なんて 優雅に吸い込まれるようにプログラムが終了するんだ


うつくし~~~~~」


涙を流しながら喜ぶsolarplexuss



ソーラー「👆いいプログラムだね


Escキーをおすことにより


飛行機が飛んでいる最中でも


プログラムを終了することができるようになったね」


solarplexuss 「あおう~~~~~」


ソーラー「さあ


今日はこの美しいプログラムをさらに洗練することになります


今まで秘密でしたが(別に秘密でもありませんが(笑))


実は


for{}文やwhile{}文の条件式の中では


関数を用いた論理式を記述することができます」


solarplexuss「ああ~おおおうう??


おああ・・・


こ、これ以上美しく・・・?」


ソーラー「もうちょっと


分かりやすくすると


for{}文やwhile{}文の条件式内で関数を用いた論理式が記述されていると


for{}文やwhile{}文のブロック{}内の命令文


が繰り返し実行される


その前に


for{}文やwhile{}文の条件式内で記述されている関数が実行されることになります


そして


そして関数に返される戻り値によって


関数を用いた論理式


の論理値は


0

1

の値を持つことになるんだ


その


0

1

の値によって


for{}文やwhile{}文のブロック{}内の命令文が


実行される

実行されない


がきまるんだよ」



solarplexuss「あ~いい~~よよよよよ?」


マックス「ぜんぜん意味が分から~んん なんだそれ?」


ソーラー「じゃあ・・・


もっと具体的な説明を


してみよっかな


まずは


今の


while{}文をご覧ください

👇

int x = 0;


int a=0;


while (x < 640 && a == 0) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


x++;


a = CheckHitKey(KEY_INPUT_ESCAPE);//KEY_INPUT_ESCAPEはEscキーに対応しています


};


👆


CheckHitKey(KEY_INPUT_ESCAPE)が実行されたとき


Escキーが押されていない場合は


CheckHitKey(KEY_INPUT_ESCAPE)

には


戻り値として0が返されます


ですので


aには


0が返されます


CheckHitKey(KEY_INPUT_ESCAPE)が実行されたとき


Escキーが押されている場合は


CheckHitKey(KEY_INPUT_ESCAPE)

には


戻り値として1が返されます


ですので


aには


1が返されます


このwhile{}文では


while (x < 640 && a == 0)のように


条件式が


x < 640 && a == 0


になっているので


Escキーが押されていなくて


CheckHitKey(KEY_INPUT_ESCAPE)


戻り値として0が返される場合は


論理式

a == 0



0==0


となり


真の値1をもちます


ですので


論理式

x < 640 も真の値1


を持つ場合は


条件式

x < 640 && a == 0



1&&1


となり


真の値を持つことになるので


while{}文のブロック{}内の命令文は実行されることになります


Escキーが押されていて


CheckHitKey(KEY_INPUT_ESCAPE)


戻り値として1が返される場合は


論理式

a == 0



1==0


となり


論理式

a == 0


偽の値0をもちます


ですので


論理式

x < 640 が真の値1


を持っていても


条件式

x < 640 && a == 0



1&&0


となり


偽の値0 を持つことになるので



while{}文のブロック{}内の命令文は実行されず


さらにこれ以降の


while{}文のブロック{}内の命令文の繰り返し実行は行われないことになります


つまり


while{}文のブロック{}内の命令文の繰り返し実行(繰り返しループ)から抜け出すことになります」


マックス「おお そうだよな」


ソーラー「ただ


この


while{}文


ちょっと


長いと思いませんか?」


solarplexss「え? どこどこ?」


ソーラー「


int x = 0;


int a=0;


while (x < 640 && a == 0) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


x++;


a = CheckHitKey(KEY_INPUT_ESCAPE);//KEY_INPUT_ESCAPEはEscキーに対応しています


};


ソーラー「ヒントは



int a;



while (x < 640 && a == 0)

a = CheckHitKey(KEY_INPUT_ESCAPE);//KEY_INPUT_ESCAPEはEscキーに対応しています


の部分です」


solarplexuss「


int a;



while (x < 640 && a == 0)

a = CheckHitKey(KEY_INPUT_ESCAPE);//KEY_INPUT_ESCAPEはEscキーに対応しています


の部分

??


まあ


確かに


これらを記述するのは


ちょっと長いと思うけど


まあ


仕方ないよね」



ソーラー「実は


int a;



while (x < 640 && a == 0)


a = CheckHitKey(KEY_INPUT_ESCAPE);//KEY_INPUT_ESCAPEはEscキーに対応しています




while (x < 640 && a == 0)の


aに直接


CheckHitKey(KEY_INPUT_ESCAPE)


を代入した


while (x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)


で置き換えることができます(ただし 本当に微妙ですが違いがあります)


aがいらなくなるので


変数宣言


int a;


を実行して


変数aを作成する必要もなくなります


その場合


while{}文



int x = 0;


while (x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


x++;


};



シンプルに書き換えられることになります」


solarplexuss「おおう シンプル~~プルプルゥ~~」


マックス「


while{}文



int x = 0;


while (x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


x++;


};



となっている場合


この


while{}文はどのように実行されるんだ」


ソーラー「このように


while{}文が記述されている場合



while{}文のブロック{}内の命令文の繰り返し実行が行われる際




        🌞while{}文のブロック{}内の命令文が行われる前に🌞



まず


CheckHitKey(KEY_INPUT_ESCAPE)


が実行されることになります


そして


CheckHitKey(KEY_INPUT_ESCAPE)が実行されたとき


Escキーが押されていない場合は


CheckHitKey(KEY_INPUT_ESCAPE)

には


戻り値として0が返されます



CheckHitKey(KEY_INPUT_ESCAPE)が実行されたとき


Escキーが押されている場合は


CheckHitKey(KEY_INPUT_ESCAPE)

には


戻り値として1が返されます



このwhile{}文では


while (x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)のように


条件式が


x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0


になっているので


Escキーが押されていなくて


CheckHitKey(KEY_INPUT_ESCAPE)


戻り値として0が返される場合は


論理式

CheckHitKey(KEY_INPUT_ESCAPE) == 0



0==0


となり


真の値1をもちます


ですので


論理式

x < 640 も真の値1


を持つ場合は


x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0



1&&1となり


真の値1


をもつので


while{}文のブロック{}内の命令文は実行されることになります


Escキーが押されていて


CheckHitKey(KEY_INPUT_ESCAPE)


戻り値として1が返される場合は


論理式

CheckHitKey(KEY_INPUT_ESCAPE) == 0 == 0



1==0


となり


論理式

CheckHitKey(KEY_INPUT_ESCAPE) == 0 == 0


偽の値0をもちます


ですので


論理式

x < 640 が真の値1


を持っていても


x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0



1&&0となり


偽の値1


をもつので



while{}文のブロック{}内の命令文は実行されず


さらにこれ以降の


while{}文のブロック{}内の命令文の繰り返し実行は行われないことになります


つまり


while{}文のブロック{}内の命令文の繰り返し実行(繰り返しループ)から抜け出すことになります」


solarplexuss「おお


条件式内にCheckHitKey(KEY_INPUT_ESCAPE) を記述する


この方法

👇

while (x < 640 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)

👆


プログラムが短くなってとっても便利だね


なんていうかこっちのほうがわかりやすいね」





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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