第4章「プログラムの流れの繰返し」のまとめ

4.1 用語のまとめ

教 p.72

do〜while 文
do 文 1 while ( 式 1 ) ;まず、文 1（ループ本体と呼ばれる）を実行する。式 1 が（真）である限り、の実行を繰り返す。
注: 必ず 1 回はループ本体を実行する。
あとで紹介する while 文や for 文に比べると、do〜while 文の実際のプログラムでの使用頻度は低い。
プログラムの実行が止まらなくなったときは、Ctrl-C で強制終了する。
教 p.73
複合文（ブロック）内での宣言 （do〜while 文に限らず）ブロックの中で宣言された変数は、そのブロックでのみ有効である。
教 p.75
論理否定演算子子とも言う。

単項演算子のは、真偽を逆にする演算子で、論理否定演算
教 p.78

複合代入演算子*=, /=, %=, +=, -=, などのことである。例えば、 sum += t はとほぼ同じ意味になる。つまり、この代入を実行した後のsum の値は、実行する前の sum の値に t を加えた値になる。
後置増分演算子・前置増分演算子
a++ a の値を一つだけ増やす （式全体の値は、増分

教 p.79の値）

a--a の値を一つだけ減らす（式全体の値は、減分の値）++aa の値を一つだけ増やす（式全体の値は、増分の値）--aa の値を一つだけ減らす（式全体の値は、減分の値）

Q 4.1.1 次のプログラムの断片の出力は何か?
n = 3;
do {printf("%d␣", n);} while (n-- > 0);

IV - 1

答教 p.86

教 p.80

while 文while ( 式 1 ) 文 1式1 が（偽）でない限り、（ループ本体）の実行を繰り返す。
注: ループ本体が一度も実行されないことがある。

do〜while 文

while 文Q 4.1.2 次のプログラムの断片の出力は何か?

答n = 3;
while (n-- > 0) {printf("%d␣", n);}教 p.84
文字定数 1 文字を’〜’ で囲んだもののことである。\n や\t な
どの拡張表記は 1 文字として扱われる。
教 p.85putchar 関数 引数として受け取った文字を標準出力に出力する。
教 p.90for 文
for ( 式 1 ; 式 2 ; 式 3 ) 文 1
ループに入る前にまずを実行する。

が非 0（真）である間、（ループ本体）とを繰返し実行する。

詳細: 式 1 〜式 3 は省略可能である。式 2 を省略したときは、1 (真) と書くのと同じ意味になる。

IV - 2

for 文左のような for 文は右に示す while 文と（ほぼ）等価である。

for 文（ほぼ）等価な while 文

for (A ; B ; C ) {ループ本体}

while () {}なぜ左の書き方が好まれるか？ — 繰り返しを制御する変数に対する処理が、一箇所にまとまっていて、一目でどのような繰り返しか理解しやすいからである。
教 p.92
一定回数の繰返し

for 文には、良く使う決まり文句的な形がある。

1 for (i = 0; i < n; i++) . . .
⃝iが2 for (i = 1; i <= n; i++) . . .
⃝iがn 回繰り返す

3 for (i = n; i > 0; i--) . . .
⃝iがn 回繰り返す

4 for (i = n - 1; i >= 0; i--) . . .
⃝iがn 回繰り返す

n 回繰り返すQ 4.1.3 上記の形で、n が 0 や負の数だった場合はどうなるか？

Q 4.1.4 上記のそれぞれの形でループを抜けたあとの i の値は何か? （ただし、nは非負とする。）
2341⃝⃝⃝⃝IV - 3

教 p.94
空文

教 p.96

文 (statement) に以下を追加する。

分類一般形

空文;

補足説明

“何もしない” 文、{}と書いても同じ。

多重ループ for 文や while 文などのループ本体が、また for 文や while 文などの繰返し文になっていることを二重ループという。二重・三重・· · · ループをまとめて、多重ループという。特別な文法や実行規則があるわけではない。

教 p.97break 文 （もっとも内側の）繰返し文（do〜while 文, while 文, for 文）を（外側の繰返し文を一気に抜け出ることはできない。）
教 p.101

continue 文（参考） （もっとも内側の）繰返し文のはじめ（do〜while 文、 while文の場合は条件式、 for 文の場合は第 3 式）にもどる。
break 文continue 文

教 p.102
キーワード if や else など C 言語にとって特別な意味のある単語を(keyword) と呼ぶ。変数名などに使用することはできない。(ただし、変数名の一部に使用するのは構わない。)
教 p.104
自由形式 C 言語では、原則として レイアウト（空白の数や改行）はプログラムの意味に影響を及ぼさない。空白がいくつ連続しても空白 1 文字と同じであり、改行も空白と同じである。
注意すべきところ:• 前処理指令 (#include . . . , #define . . . ) などの途中では、改行できない。
• 文字列リテラル、文字定数の途中でも、改行できない。

IV - 4。

教 p.216
コンマ演算子式 1, 式 2という式は、式 1 、式 2 をこの順に評価し、を持つ。の値を捨て、の値（と型）4.2 プログラム例
整数値を逆順に (reverse.c)123456789101112（教科書 List 4-10 に類似）

#include <stdio.h>int main(void) {int no = 12345;
do {printf("%d", no % 10);
no /= 10;} while (no > 0);
return 0;}
no の値の変化
1 回目

2 回目

3 回目

4 回目

5 回目

7行
9行
Q 4.2.1 do〜while 文の代わりに while 文を使うと、振舞いがどう変わるか？

典型的な for 文（階乗の計算）(fact.c)

123
4
56
78
910
1112

#include <stdio.h>
int main(void) {int i, n, fact = 1;
printf("正の数を入力してください。␣");scanf("%d", &n);for (i = 1; /* 通常 1 行に書くところを 3 行にわけた。 */i <= n;i++) {fact = fact * i;}
IV - 5

13
14
15
16

printf("あなたの入力した数の階乗は␣%d です。 \n", fact);
return 0;}i, fact の値の変化（n が 5 のとき）
行

1 回目
i, fact

2 回目
i, fact

3 回目
i, fact

4 回目
i, fact

5 回目
i, fact

9,,,,,

11,

10→ ,→,→ ,→,→→ ,,→ ,→,→ ,典型的な for 文（正 n 角形の座標の出力）(polygon.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include <stdio.h>#include <math.h>int main(void) {int n, i;printf("n を入力して下さい :␣"); scanf("%d", &n);
for(i = 0; i < n; i++) {double theta1 = 2 * 3.1416 * i / n;double theta2 = 2 * 3.1416 * (i + 1) / n;printf("%.3f␣%.3f␣%.3f␣%.3f\n",100 * cos(theta1), 100 * sin(theta1),
100 * cos(theta2), 100 * sin(theta2));}
return 0;}

IV - 6→

二重ループ（数の三角形）(triangle.c)

1
2
3
4
5
67
8
9
10
11
1213

#include <stdio.h>
int main(void) {int i, j, n;
printf("n を入力して下さい :"); scanf("%d", &n);for (i = 1; i <= n; i++) {for (j = 1; j <= i; j++) {printf("%d", j % 10);}printf("\n");}return 0;}1121231234

Q 4.2.2 n = 3 のとき、ループ内の式、文はどの順で実行されるか？

二重ループ（ダイアモンド図形の座標の出力）(diamond.c)

12
3
4
5678
910
1112131415
16171819#include <stdio.h>#include <math.h>int main(void) {int n, i, j;
printf("n を入力して下さい :␣"); scanf("%d", &n);for (i = 0; i < n; i++) {double theta1 = 2 * 3.1416 * i / n;for (j = i + 1 /* 注意! */; j < n; j++) {double theta2 = 2 * 3.1416 * j / n;printf("%.3f␣%.3f␣%.3f␣%.3f\n",100 * cos(theta1), 100 * sin(theta1),
100 * cos(theta2), 100 * sin(theta2));}}
return 0;}

IV - 7正 n 角形（n=6）

ダイアモンド図形（n=6）

Q 4.2.3 n = 4 のとき、ループ内の式、文はどの順で実行されるか？

コンマ演算子の例 (comma.c)

12
3456
789

#include <stdio.h>
int main(void) {int i, j;for (i = 0, j = 6; i < j; i++, j--) {printf("i␣=␣%d,␣j␣=␣%d\n", i, j);}return 0;}
Q 4.2.4 このプログラムの出力はどうなるか？

4.3

文法のまとめ文 (statement)に以下を追加

分類

一般形

補足説明

do〜while 文
while 文for 文
continue 文

do 文 while ( 式 ) ;while ( 式 ) 文
for ( 式 ; 式 ; 式 ) 文
continue ;（教 p.72）式 (expression)に以下を追加する。

（教 p.80）（教 p.90）（教 p.101）

分類

一般形

補足説明

後置演算

式 後置演算子

C の後置演算子は ++, --のみ（教 p.79）
IV - 8