.
.
Cプログラミング入門
(2018)
第5回
─ 制御構造:条件分岐 ─
松田七美男
2018
年
5
月
17
日
分岐とは
.
.
条件式の論理値(真偽)によって処理先を
変える機構で,あらゆるプログラミング言
語に必須のもの.
必要な構成要素
I論理値
:
0
を偽,非
0
を真
として扱う
I演算
:論理演算子,比較演算子
I構文
:
if
文,
switch
文,条件演算子
分岐とは
.
.
条件式の論理値(真偽)によって処理先を
変える機構で,あらゆるプログラミング言
語に必須のもの.
必要な構成要素
I論理値
:
0
を偽,非
0
を真
として扱う
I演算
:論理演算子,比較演算子
I構文
:
if
文,
switch
文,条件演算子
if
文
if (
条件
)
文
.
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が偽
(0)
なら何もしない
.
条件の評価値が偽
(0)
なら何もしない
.
文の書法
..
.
I(
式
)
文の終わりはセミコロン
;
I複合文
:複数の文を中括弧で囲んだもの
if
文
if (
条件
)
文
.
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が偽
(0)
なら何もしない
.
条件の評価値が偽
(0)
なら何もしない
.
文の書法
..
.
I(
式
)
文の終わりはセミコロン
;
I複合文
:複数の文を中括弧で囲んだもの
if
文
if (
条件
)
文
.
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が偽
(0)
なら何もしない
.
条件の評価値が偽
(0)
なら何もしない
.
文の書法
..
.
I(
式
)
文の終わりはセミコロン
;
I複合文
:複数の文を中括弧で囲んだもの
if
文
if (
条件
)
文
.
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が真
(
非
0)
なら文を実行
.
条件の評価値が偽
(0)
なら何もしない
.
条件の評価値が偽
(0)
なら何もしない
.
文の書法
..
.
I(
式
)
文の終わりはセミコロン
;
I複合文
:複数の文を中括弧で囲んだもの
if else
文
if (
条件
)
文
1
else
文
2
.
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
複数の処理をさせる場合の記述法
..
.
8
if (...) A;B; else C;D;
◎
if (...)
{
A;B;
}
else
{
C;D;
}
すなわち,
複文
にする.
if else
文
if (
条件
)
文
1
else
文
2
.
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
複数の処理をさせる場合の記述法
..
.
8
if (...) A;B; else C;D;
◎
if (...)
{
A;B;
}
else
{
C;D;
}
すなわち,
複文
にする.
if else
文
if (
条件
)
文
1
else
文
2
.
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
複数の処理をさせる場合の記述法
..
.
8
if (...) A;B; else C;D;
◎
if (...)
{
A;B;
}
else
{
C;D;
}
すなわち,
複文
にする.
if else
文
if (
条件
)
文
1
else
文
2
.
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が真
(
非
0)
なら文
1
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
条件の評価値が偽
(0)
なら文
2
を実行
.
複数の処理をさせる場合の記述法
..
.
8
if (...) A;B; else C;D;
◎
if (...)
{
A;B;
}
else
{
C;D;
}
すなわち,
複文
にする.
例題:
ex11.c
...
int main(int argc, char **argv)
{
double x;
printf("x = ");
scanf("%lf",&x);
printf("x = %g > ", x);
if (x){
printf("True\n");
}
else{
printf("False\n");
}
return 0;
}
.
.
stdio.h, stdlib.h, math.h
の
include
.
コンパイル命令
..
.
例題:
ex11.c
...
int main(int argc, char **argv)
{
double x;
printf("x = ");
scanf("%lf",&x);
printf("x = %g > ", x);
if (x){
printf("True\n");
}
else{
printf("False\n");
}
return 0;
}
.
.
stdio.h, stdlib.h, math.h
の
include
.
コンパイル命令
..
.
例題:
ex11.c
...
int main(int argc, char **argv)
{
double x;
printf("x = ");
scanf("%lf",&x);
printf("x = %g > ", x);
if (x){
printf("True\n");
}
else{
printf("False\n");
}
return 0;
}
.
.
stdio.h, stdlib.h, math.h
の
include
.
コンパイル命令
..
.
例題:
ex12.c
int main(int argc, char **argv) {
double x, y; printf("x, y = ");
scanf("%lf, %lf", &x, &y);
printf("(%4.2f,%4.2f) > ", x, y); if (x > 0) { if (y > 0) printf("1st quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("4th-quadrant\n"); } else if (x == 0) { if (y == 0) printf("origin\n"); else printf("y-axis\n"); } else { /* x < 0 */ if (y > 0) printf("2nd quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("3rd-quadrant\n"); } return 0; }
q
.
コンパイル命令
..
.
例題:
ex12.c
int main(int argc, char **argv) {
double x, y; printf("x, y = ");
scanf("%lf, %lf", &x, &y);
printf("(%4.2f,%4.2f) > ", x, y); if (x > 0) { if (y > 0) printf("1st quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("4th-quadrant\n"); } else if (x == 0) { if (y == 0) printf("origin\n"); else printf("y-axis\n"); } else { /* x < 0 */ if (y > 0) printf("2nd quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("3rd-quadrant\n"); } return 0; }
q
.
コンパイル命令
..
.
関係演算子
演算子
意味
例
結果: 真なら1,偽なら 0<
より小さい
x < y
x
がy
より小さければ1
,でないなら0
<=
以下
x <= y
x
がy
以下ならば1
,で ないなら0
>
より大きい
x > y
x
がy
より大きければ1
,でないなら0
>=
以上
x >= y
x
がy
以上ならば1
,で ないなら0
==
等しい
x == y
x
とy
が等しければ1
, でないなら0
!=
等しくない
x != y
x
とy
が等しくなければ1
,でないなら0
論理演算子
演算子
意味
例
結果: 真なら1,偽なら 0&&
論理積
(x ∧ y)
x && y
x
とy
がともに真ならば1
,でないなら0
||
論理和
(x ∨ y)
x || y
x
とy
の少なくとも一方 が真ならば1
,でないな ら0
!
否定
(¬x)
!x
x
が真でないならば1
, でないなら0
.
論理演算子の対象
..
.
関係演算子や論理演算子の表では単純な変数
x
,
y
を例にし
ているが,一般には式もよい.例えば
(x == 1) && (y != 3)
: 「
x
が
1
,かつ
y
が
3
でない」
論理演算子
演算子
意味
例
結果: 真なら1,偽なら 0&&
論理積
(x ∧ y)
x && y
x
とy
がともに真ならば1
,でないなら0
||
論理和
(x ∨ y)
x || y
x
とy
の少なくとも一方 が真ならば1
,でないな ら0
!
否定
(¬x)
!x
x
が真でないならば1
, でないなら0
.
論理演算子の対象
..
.
関係演算子や論理演算子の表では単純な変数
x
,
y
を例にし
ているが,一般には式もよい.例えば
(x == 1) && (y != 3)
: 「
x
が
1
,かつ
y
が
3
でない」
排他的論理和
否定 論理積 論理和 排他的論理和 含意¬p
p
q
p
∧ q
p
∨ q
p
Y q
p
⇒ q
F
T
T
T
T
F
T
F
T
F
F
T
T
F
T
F
T
F
T
T
T
T
F
F
F
F
F
T
日常会話での「または」は,論理和ではなく排他的論理和を
表現している場合があるので注意が必要.
C
言語では排他的
論理和の演算子は定義されていないので,以下のような論理
表現を用いることになる.
p
Y q = (p ∧ ¬q) ∨ (¬p ∧ q)
例題:
ex12.c
の別方法
int main(int argc, char **argv) {
double x, y; printf("x, y = ");
scanf("%lf, %lf", &x, &y);
printf("(%4.2f,%4.2f) > ", x, y);
if (x > 0 && y > 0) printf("1st quadrant\n"); if (x < 0 && y > 0) printf("2nd quadrant\n"); if (x < 0 && y < 0) printf("3rd quadrant\n"); if (x > 0 && y < 0) printf("4th quadrant\n"); if (x != 0 && y == 0) printf("x-axis\n"); if (x == 0 && y != 0) printf("y-axis\n"); if (x == 0 && y == 0) printf("origin\n"); return 0; }
.
短所..
.
if
文を8
回実行例題:
ex12.c
の別方法
int main(int argc, char **argv) {
double x, y; printf("x, y = ");
scanf("%lf, %lf", &x, &y);
printf("(%4.2f,%4.2f) > ", x, y);
if (x > 0 && y > 0) printf("1st quadrant\n"); if (x < 0 && y > 0) printf("2nd quadrant\n"); if (x < 0 && y < 0) printf("3rd quadrant\n"); if (x > 0 && y < 0) printf("4th quadrant\n"); if (x != 0 && y == 0) printf("x-axis\n"); if (x == 0 && y != 0) printf("y-axis\n"); if (x == 0 && y == 0) printf("origin\n"); return 0; }
.
短所..
.
if
文を8
回実行switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
switch (case)
文
整数式
0の値によって処理先を複数変える(
多重分岐
)
switch (
整数式
0) {
case
整数
A
:
文
1
break;
case
整数
P
:
case
整数
Q
:
文
2
break;
default:
文
f
break;
}
.
.
整数式0 の値が.
整数A
(定数)に等しい場合は,.
文1
を実行.
外に出る.
整数Q
(定数)に等しい場合は,.
文2
を実行.
break(
外に出る)
.
整数P
(定数)に等しい場合は,.
文もbreak
もないので下に降りて.
文2
を実行.
break(
外に出る)
.
上記以外の場合には,default
で.
文f
を実行.
break(
外に出る)
条件演算子
.
条件演算子
..
.
唯一の3項演算子.
式を形成するので値を持つ
こと
が
if else
文などとは違う.
式
0
?
式
1
:
式
2
.
.
式
0
が真ならば 式
1
を評価
.
式
0
が真ならば 式
1
を評価
.
式
0
が偽ならば 式
2
を評価
.
式
0
が偽ならば 式
2
を評価
例)
max = (a > b) ? a : b
条件演算子
.
条件演算子
..
.
唯一の3項演算子.
式を形成するので値を持つ
こと
が
if else
文などとは違う.
式
0
?
式
1
:
式
2
.
.
式
0
が真ならば 式
1
を評価
.
式
0
が真ならば 式
1
を評価
.
式
0
が偽ならば 式
2
を評価
.
式
0
が偽ならば 式
2
を評価
例)
max = (a > b) ? a : b
条件演算子
.
条件演算子
..
.
唯一の3項演算子.
式を形成するので値を持つ
こと
が
if else
文などとは違う.
式
0
?
式
1
:
式
2
.
.
式
0
が真ならば 式
1
を評価
.
式
0
が真ならば 式
1
を評価
.
式
0
が偽ならば 式
2
を評価
.
式
0
が偽ならば 式
2
を評価
例)
max = (a > b) ? a : b
条件演算子
.
条件演算子
..
.
唯一の3項演算子.
式を形成するので値を持つ
こと
が
if else
文などとは違う.
式
0
?
式
1
:
式
2
.
.
式
0
が真ならば 式
1
を評価
.
式
0
が真ならば 式
1
を評価
.
式
0
が偽ならば 式
2
を評価
.
式
0
が偽ならば 式
2
を評価
例)
max = (a > b) ? a : b
条件演算子
.
条件演算子
..
.
唯一の3項演算子.
式を形成するので値を持つ
こと
が
if else
文などとは違う.
式
0
?
式
1
:
式
2
.
.
式
0
が真ならば 式
1
を評価
.
式
0
が真ならば 式
1
を評価
.
式
0
が偽ならば 式
2
を評価
.
式
0
が偽ならば 式
2
を評価
例)
max = (a > b) ? a : b
例題:
ex14.c
#include <stdio.h> #include <stdlib.h> #include <math.h>
int main(int argc, char **argv) { int n; double x; printf("x = "); scanf("%lf", &x); printf("%f > ", x); n = x ? printf("True\n") : printf("False\n"); printf("printed characters = %d\n", n); return (0); }