第3章「プログラムの流れの分岐」のまとめ

3.1 用語のまとめ

教 p.42if 文
if ( 式 1 ) 文 1という形のこと、式 1 を評価して、その値が実行する。式の値が(すなわち真) であれば、を(すなわち偽) であるときは、何もしない
教 p.48if〜else 文
if ( 式 1 ) 文 1 else 文 2という形のこと、式 1 を評価して、その値が実行する。式の値がif 文(すなわち真) であれば、(すなわち偽) であるときは、を実行する。

if〜else 文

Q 3.1.1 次のプログラムの断片の出力は?（出力なしのときは「無」と書く。）
1 if (0) printf("X");⃝答:2 if (0) printf("Y"); else printf("Z");⃝III - 1

答:を教 p.48等価演算子 ==は両辺の値が等しければ （つまり真）を、等しくなければ （つまり偽）を返す演算子である。==と逆に等しくないかどうかを判定する演算子はである。

教 p.50
関係演算子

以下の 4 つがある。

<

左辺が右辺よりもとき真>

左辺が右辺よりもとき真<=左辺が右辺よりもか等しいとき真>= 左辺が右辺よりもか等しいとき真=< とか => という演算子はないので注意する。
教 p.51
入れ子になった if 文

if (no == 0)puts("その数は␣0 です。 ");else if (no > 0)puts("その数は正です。");
else
puts("その数は負です。");
これは、単に else の次の文が、また if 文になっているだけのことである。

Q 3.1.2 もし、次のようになっていれば、no が 0 のときの出力はどうなるか？
if (no == 0)puts("その数は␣0 です。 ");if (no > 0)puts("その数は正です。");
else
puts("その数は負です。");
答:教 p.53

評価

教 p.56

条件演算子 (三項演算子)

式の値を調べる（ために実行する）ことをする (evaluate) という。

式1 ? 式2 : 式3
まず 式 1 を評価し、その値が、非 0 (真) であれば、を評価して、その値を返す。

は評価しない。

0 ( 偽)は評価しない。

であれば、を評価して、その値を返す。

III - 2

教 p.58
複合文 (ブロック) 文の並びを波括弧 (ブレース — 「 」 と「 」 —) で囲んだものを複合文またはブロックという。(文のまえにいくつかの宣言があってもよい。)
複合文は構文上単一の文と見なされる。複合文中の文は上 (左) から順に一つずつ実行される。
通常、if 文の制御する文 (後述の while 文、for 文などでも同様) は、たとえ一つの文でも (間違いを避けるため) 波括弧で囲んでブロックにする。
△ 望ましくないスタイル◎ 望ましいスタイル

if (n1 > n2)
max = n1;else
max = n2;

if (n1 > n2) {max = n1;} else {max = n2;}

教科書の例題は望ましいスタイルでないものが多いので、特に注意する。この授業の課題の解答は「望ましいスタイル」で提出すること。（教科書 p.59 下のほうの ▷）教 p.59（発展）ぶら下がりの else (dangling else)if (h < 12) if (h < 6) printf("A"); else printf("B");は、どのように文法的に解釈されるか?
解釈 1:

if (h < 12) { if (h < 6) printf("A"); else printf("B"); }解釈 2:if (h < 12) { if (h < 6) printf("A"); } else printf("B");

Q 3.1.3 上の解釈 1, 解釈 2 は h の値が以下のとき、どのように出力するか?
解釈 1 解釈 2
h = 3
h = 9
h = 15
ぶら下がりの else は、解釈と同等である。つまり、近い方の if と対応する。
教 p.60

論理演算子 は以下のような演算子である。左右非対称である — つまり左オペは評価しない — ことに注意
ランドを評価して値が決まれば、する（短絡評価）。

III - 3

演算子

教 p.63

呼び方

説明&&

論理 AND 演算子
かつ左オペランドを評価して、0 (偽) であれば、0 (偽) を返す。非 0 (真) であれば、右オペランドを評価してその値を返す。

||

論理 OR 演算子または左オペランドを評価して、非 0 (真) であればその値を返す。0 (偽) であれば、右オペランドを評価してその値を返す。

Q 3.1.4 次のプログラム（の一部）の誤り（の可能性が高いところ）を指摘せよ。
1.

2.
3.
4.
5.

if (a == 0);
printf("hello"); /**/if (a = 0)
printf("hello"); /**/if (a == b == c)printf("hello"); /**/if (-1 <= a <= 1)
printf("hello"); /**/if (-1 <= a & a <= 1)
printf("hello"); /**/教 p.64switch 文 ある式の値 (整数型) によって、プログラムの流れを複数に分岐するときに使う。
switch ( 式 1 ) 文 1
文 1 は、通常、複合文（ブロック）である。switch 文は式 1 を評価して、文 1 の中のと:の間に書かれた定数と一致するところにジャンプする。(どの caseにも一致しないときは、にジャンプする。) ただし、break 文に出会うと、一気に switch 文を飛び出る。逆に break 文がなければ、そのまま次の文を実行する。
case〜:や default :のようにプログラムの飛び先を示す目印を(名札) と呼ぶ。

3.2

プログラム例

繰り上がりの計算

12345#include <stdio.h>
int main(void) {int hour1, minute1, hour2, minute2, hour3, minute3;

III - 4

6
7
8910
1112131415
16
17
18
1920
21222324

printf("hour1 を入力して下さい :");
scanf("%d", &hour1);
printf("minute1 を入力して下さい :");
scanf("%d", &minute1);
printf("hour2 を入力して下さい :");
scanf("%d", &hour2);
printf("minute2 を入力して下さい :");
scanf("%d", &minute2);
hour3= hour1 + hour2;
minute3 = minute1 + minute2;
if (minute3 >= 60) {hour3= hour3 + 1 ;minute3 = minute3 - 60;}
printf("その和は、%d 時間 %d 分です。 \n", hour3, minute3);
return 0;}2 つの数を大きい順に並べる
12
345678910111213141516#include <stdio.h>
int main(void) {int n1, n2, tmp;
printf("整数1 を入力して下さい:");printf("整数2 を入力して下さい:");scanf("%d", &n1);
scanf("%d", &n2);/* n1 と n2 を入れ換える */if (n2 > n1) {tmp = n1;
n1 = n2;n2 = tmp;}
printf("大きい方は␣%d です。小さい方は ␣%d です。 \n", n1, n2);
return 0;}

III - 5

3.3

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

分類

一般形

補足説明

if 文
if〜else 文
複合文 (ブロック)switch 文
ラベル付き文if ( 式 ) 文
if ( 式 ) 文 else 文{ 宣言 . . . 文 . . . }switch ( 式 ) 文
case 整数リテラル : 文
default : 文
break ;

(教 p.42)(教 p.44)(教 p.58)(教 p.64)

break 文式 (expression)に以下を追加、

分類

一般形

補足説明

三項演算子

式?式:式

(教 p.56)

III - 6

(教 p.65)(教 p.65)