for (i = 1; i == 1;)タイプのfor文の仕組みを学んでみよう

以下 エクセレントC言語入門より


では

 

次のプログラムをご覧ください

👇



#include <stdio.h>


int main(void) {



int zokkouhantei;


for (zokkouhantei = 1; zokkouhantei == 1;) {


printf("プログラムは実行されました\n");


}



return 0;

}


プログラムの実行結果


プログラムは実行されました

プログラムは実行されました

プログラムは実行されました







以下 エクセレントC言語入門より



このプログラムは


for (zokkouhantei = 1; zokkouhantei == 1;) {


printf("プログラムは実行されました\n");


}


のブロック{}内の命令文

👇


printf("プログラムは実行されました\n");


👆


実行し続けるプログラムなの💖」


マックス「な、なんだ?


いきなり


プログラムの実行結果


プログラムは実行されました

プログラムは実行されました

プログラムは実行されました


なんだ?



for (zokkouhantei = 1; zokkouhantei== 1;)


こんなfor文の使い方

みたことないぞ



以下 エクセレントC言語入門より


仕組みは簡単なの


for (zokkouhantei = 1; zokkouhantei == 1;) {


printf("プログラムは実行されました\n");


}



条件式が


zokkouhantei== 1


なので


zokkouhanteiが1の値をとり続ける間は


zokkouhantei== 1



1==1


となり


真の値1をとることになるので


for (zokkouhantei = 1; zokkouhantei== 1;)につづくブロック{}内の


命令文


printf("プログラムは実行されました\n");




           ☆繰り返し☆



実行され続けることになるの


マックス「なんだ(*´▽`*)


そんなことか


だが


となると


このタイプのfor文

👇

for (zokkouhantei = 1; zokkouhantei == 1;) {


printf("プログラムは実行されました\n");


}


のブロック{}内の命令文


printf("プログラムは実行されました\n");



そのままでは


ずっと繰り返されることにならないか?


以下 エクセレントC言語入門


そうなの


便利でしょう


マックス「・・・・・へえ・・・・・ってなんじゃ?これは・・・」
























このプログラムの


int zokkouhantei;

に注目してね


続行判定zokkouhanteiが0の値をもつので


このままでは


for (zokkouhantei = 1; zokkouhantei== 1;)の


zokkouhantei== 1


が満たされることはなく


次回のfor文の繰り返しにおいて


for文のブロック{}内の


命令文


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}


が実行されることはありませんが


とりあえずは


1回は


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}



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



マックス「最低1回はブロック{}内の


命令文が実行されるか・・・


どこかで聞いたような・・・」




以下 エクセレントC言語入門より


(それは


do 

while文


よ)



マックス「??なんのこと??」



以下 エクセレントC言語入門より


さて


それはともかく


for (zokkouhantei = 1; zokkouhantei== 1;)の働きにより


最低1回は


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}


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


zokkouhantei= 0;


の次は


for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}


の実行ね


if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}



hairetu[i] <= hairetu[i + 1]


が成立する場合


int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;


が実行されることになるの


この命令文は


hairetu[i] <= hairetu[i + 1]


が成立する場合


hairetu[i]とhairetu[i + 1]


に格納されている数値データを交換するのね


そして


zokkouhantei = 1;


により


続行判定zokkouhanteiには1が代入されることになるの


for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}



if (hairetu[0] <= hairetu[1]) {

int a = hairetu[0];

hairetu[0] = hairetu[1];

hairetu[1] = a;

zokkouhantei = 1;

}


if (hairetu[1] <= hairetu[2]) {

int a = hairetu[1];

hairetu[1] = hairetu[2];

hairetu[2] = a;

zokkouhantei = 1;

}


if (hairetu[2] <= hairetu[3]) {

int a = hairetu[2];

hairetu[2] = hairetu[3];

hairetu[3] = a;

zokkouhantei = 1;

}


if (hairetu[3] <= hairetu[4]) {

int a = hairetu[3];

hairetu[3] = hairetu[4];

hairetu[4] = a;

zokkouhantei = 1;

}


が実行されることになるのだけど


一回でも数値の入れ替えがおこれば


zokkouhantei = 1;


が実行されるの



zokkouhantei = 1;


が実行されれば


続行判定zokkouhanteiに1が代入されるので





for (zokkouhantei = 1; zokkouhantei== 1;) {


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}

}



for (zokkouhantei = 1; zokkouhantei== 1;)



条件式


zokkouhantei== 1



1==1


となり


for (zokkouhantei = 1; zokkouhantei== 1;) {


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}

}


内の命令文


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}




再び実行されることになるわけね



マックス「


なるほどな


zokkouhantei = 1;


は?


何の意味があるんだ?」




以下 エクセレントC言語入門より





続行判定zokkouhanteiに1が代入されると



int zokkouhantei;


for (zokkouhantei = 1; zokkouhantei== 1;) {


zokkouhantei= 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}

}











このプログラムの

zokkouhantei = 0;


に注目して頂戴


for (zokkouhantei= 1; (zokkouhantei== 1;) {


zokkouhantei= 0;

}



for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;

}

}

を取り除くと


for ((zokkouhantei= 1; (zokkouhantei== 1;) {


zokkouhantei= 0;

}


となります


このままだと


このプログラムの実行は一回だけおこなわれて終了してしまうの


でも


for (flag = 1; flag == 1;) {


flag = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

flag = 1;

}

}

}

のなかの


for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;

}

}


のif文が実行されたなら


zokkouhantei= 1;


となり


for (zokkouhantei= 1; zokkouhantei== 1;)


の条件式


zokkouhantei== 1



1==1


となり


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



for (zokkouhantei = 1; fzokkouhantei== 1;){}



ブロック{}内の命令文


flag = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;

}

}

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


つまり

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}

を実行したとき



hairetu[0] <= hairetu[1]

hairetu[1] <= hairetu[2]

hairetu[2] <= hairetu[3]

hairetu[3] <= hairetu[4]


のどれかが成立すれば


zokkouhantei= 1;


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


hairetu[0] <= hairetu[1]

hairetu[1] <= hairetu[2]

hairetu[2] <= hairetu[3]

hairetu[3] <= hairetu[4]

が成立すれば


hairetu[0]とhairetu[1]の数値データの入れ替え

hairetu[1]とhairetu[2]の数値データの入れ替え

hairetu[2]とhairetu[3]の数値データの入れ替え

hairetu[3]とhairetu[4]の数値データの入れ替え

がおこります



hairetu[0]とhairetu[1]の数値データの入れ替え

hairetu[1]とhairetu[2]の数値データの入れ替え

hairetu[2]とhairetu[3]の数値データの入れ替え

hairetu[3]とhairetu[4]の数値データの入れ替え


がおこれば


zokkouhantei= 1;


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


ですので


再び


for (zokkouhantei= 1; zokkouhantei == 1;) {


zokkouhantei = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}

}

のなかの命令文


zokkouhantei= 1; = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;

}

}


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


まったく

hairetu[0]とhairetu[1]の数値データの入れ替え

hairetu[1]とhairetu[2]の数値データの入れ替え

hairetu[2]とhairetu[3]の数値データの入れ替え

hairetu[3]とhairetu[4]の数値データの入れ替え


が起こらないのであれば

すでに

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

には

数値データ

5

4

3

2

1

格納されていることになります


つまり


if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;

}


のなかの命令文


int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;


が実行されることはない場合は


zokkouhantei= 1;


が実行されることはないので


再び


for (zokkouhantei= 1; zokkouhantei == 1;) {


zokkouhantei = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei = 1;

}

}

}

のなかの命令文


zokkouhantei= 1; = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

zokkouhantei= 1;

}

}


が実行されることはありません


つまり



hairetu[0]とhairetu[1]の数値データの入れ替え

hairetu[1]とhairetu[2]の数値データの入れ替え

hairetu[2]とhairetu[3]の数値データの入れ替え

hairetu[3]とhairetu[4]の数値データの入れ替え

試すようなことは行われません




一回でも


hairetu[0]とhairetu[1]の数値データの入れ替え

もしくは

hairetu[1]とhairetu[2]の数値データの入れ替え

もしくは

hairetu[2]とhairetu[3]の数値データの入れ替え

もしくは

hairetu[3]とhairetu[4]の数値データの入れ替え


がおこれば


その後


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

には

数値データ

5

4

3

2

1

格納されて目的達成されているか


もしくは


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

には

数値データ

5

4

3

2

1

格納されていない


の両方の可能性があります


ですが


zokkouhantei= 1;


が実行されているので


for (zokkouhantei= 1; fzokkouhantei== 1;){}



ブロック{}内の命令文


flag = 0;

for (i = 0; i < 4; i++) {

if (hairetu[i] <= hairetu[i + 1]) {

int a = hairetu[i];

hairetu[i] = hairetu[i + 1];

hairetu[i + 1] = a;

flag = 1;

}

}

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









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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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