C言語/制御文

出典: フリー教科書『ウィキブックス(Wikibooks)』

書きかけ

目次

[編集] 論理型

[1] [2]

論理型とはデータ型の内の1つであり、真(true)か偽(false)かの2種類の論理値をとる。 JISX3010:2003(ISO/IEC 9899:1999)において、論理型はキーワード_Boolを用いて宣言される。 偽は0,真は1(及び0以外)を用いて表現される。

ヘッダファイルstdbool.hをインクルードすることで、 _Boolの代わりにbool、0の代わりにfalse, 1の代わりにtrueを用いることができる。 なお、C++用のコンパイラを使用している場合は、stdbool.hをインクルードせずに bool, false, trueを用いることができる。

Very Important!
0が偽、1(及び0以外)が真であるとこは、このページ全体の前提知識となっており、
とても重要です。

[編集] 比較演算子と論理演算子

[3] [4] [5] [6] [7]

演算子とは演算の内容を指示する記号である。 C言語には非常に多くの演算子が存在するが、 ここでは比較演算子と論理演算子とについてだけ説明する。

【下の表を参照しつつ読むこと】比較演算子とは、左辺と右辺の比較を指示する演算子である。 比較演算子は左辺が右辺と比較して、 「<(より小さい)」、「>(より大きい)」「<=(以下)」「>=(以上)」 「==(等しい)」「!=(等しくない)」の場合は真(1)を、 それ以外の場合は偽(0)を、値として返す。

  • 次に比較演算子を表にまとめた。
演算子の種類 演算子 演算子の名称 意味
関係演算子 < <演算子 左オペランドが右オペランドより小さい場合は1、それ以外の場合は0
> >演算子 左オペランドが右オペランドより大きい場合は1、それ以外の場合は0
<= <=演算子 左オペランドが右オペランド以下の場合は1、それ以外の場合は0
>= >=演算子 左オペランドが右オペランド以上の場合は1、それ以外の場合は0
等価演算子 == ==演算子 左右オペランド同士を比較し、等しい場合は1、それ以外の場合は0
!= !=演算子 左右オペランド同士を比較し、等しくない場合は1、それ以外の場合は0

【下の表を参照しつつ読むこと】論理演算子とは、論理値の計算を指示する演算子である。 論理演算子には否定を指示する!、論理積を指示する&&、論理和を指示する||がある。

  • 次に論理演算子を表にまとめた。
演算子の種類 演算子 演算子の名称 意味
単項演算子 ! 論理否定演算子! 右オペランドの否定
(右オペランドの値を0と比較し、等しい場合は1、等しくない場合は0)
論理AND演算子 && &&演算子 左右オペランドの論理積
(左右オペランドの値を0と比較し、ともに等しくない場合は1、それ以外の場合は0)
論理OR演算子 || ||演算子 左右オペランドの論理和
(左右オペランドの値を0と比較し、いずれか一方でも等しくない場合は1、それ以外の場合は0)

【下の表を参照しつつ読むこと】否定とは論理値の真と偽を入れ替えることを表す。 論理積とは左右両方の論理値がともに真であるときのみ真(1)を、それ以外は偽(0)を値として返す。 論理和とは左右両方の論理値のうちいずれか一方でも真であるとき真(1)を、それ以外は偽(1)を値として返す。

  • 次に否定、論理積、論理和に対する論理値を表にまとめた。
p q  !p
否定
p&&q
論理積
p||q
論理和
0 0 1 0 0
0 1 1 0 1
1 0 0 0 1
1 1 0 1 1

[編集] 増分及び減分演算子

[8] [9]

演算子とは演算の内容を指示する記号である。 C言語には非常に多くの演算子が存在するが、 ここでは増分及び減分演算子についてだけ説明する。

【下の表を参照しつつ読むこと】増分及び減分演算子とは、変数の値に1を加えたり、1を引いたりすることを指示する演算子である。 増分及び減分演算子には、それぞれ後置演算子と前置演算子とがある。 後置演算子は変数の値を返した後に、増減を行う。 前置演算子は変数の値を返す前に、増減を行う。

  • 次に、後置増分及び後置減分演算子と前置増分及び前置減分演算子とを、表にまとめた。
演算子の種類 演算子 演算子の名称 意味
後置演算子 ++ 後置++演算子 左オペランドが指す変数の値を返した後、その変数の値に1を加える。
-- 後置--演算子 左オペランドが指す変数の値を返した後、その変数の値から1を引く。
単項演算子 ++ 前置++演算子 右オペランドが指す変数の値に1を加え、その変数の値を返す。
-- 前置--演算子 右オペランドが指す変数の値から1を引き、その変数の値を返す。

[編集] 選択文

[編集] if文

[10] [11]

if文とは、選択文の内の1つであり、式の論理値に従って、指定する文を実行するかどうか選択する。 if文には、if形式、if-else形式の2通りの形式があり、またそれらを組み合わせてもよい。

if文には次の2通りの形式がある。

  • if形式
if (式)
	文

if形式では、式の値を0と比較し等しくない場合は文に制御を移し、 等しい場合は文の直後に制御を移す。 すなわち式の論理値が真である場合は文を実行し、偽である場合は実行しない。

  • if-else形式
if (式)
	文
else
	文

if-else形式では、式の値を0と比較し等しくない場合は前の文に制御を移し、 等しい場合は後の文に制御を移す。 すなわち、式の論理値が等しくない場合は最初の分だけを実行し、 等しい場合は2番目の文だけを実行する。

  • if-else if-...-else形式

上の2つの形式を組み合わせて次のように連続して記述することもできる。

if (式)
	文
else if
	文
.
.
.
else
	文

elseは上の2つの形式で許されるifのうち、そのelseの前で最も近い位置にあるifと対応する。

なおif文に限らないが、一般に文はブロックであってもかまわない。

[編集] switch文

[12] [13]

switch文とは、選択文の内の1つであり、式の整数値に従って、指定するいくつかの文からいずれかを実行するかどうか選択する。 switch文には、いくつかのcaseラベルが含まれ、式の整数値と等しい整数値を持つcaseラベルへ制御を移す。 等しい整数値を持つcaseラベルがなければ、defaultラベルへ制御を移す。

switch文の記述は次のようになっている。

  • switch-case-...-default文
switch (整数式){
	case 整数定数式:
		複文
		break;
	.
	.
	.
	default:
		複文;
}

switch文は制御式とよばれる整数式と、 スイッチ本体と呼ばれるブロック内に、任意の個数のcaseラベル、及び高々1つのdefaultラベルとからなる。 同一のswitch文の中では、2つのcaseラベルの整数定数式は同じ値であってはならない。 一般にcaseラベルの後には文とbreak文が含まれるが、なくてもよい。

switch文は制御式の値を評価し、それをcaseラベルの整数定数式の値と比較し、 同一の値があればそのcaseラベルへ制御を移し、 同一の値がなければdefaultラベルへ制御を移す。 同一のcaseラベルの値がなくかつdefaultラベルもなければ、スイッチ本体のいかなる文も実行せず、スイッチ本体の直後へ制御を移す。

また、ここでのbreak文はスイッチ本体の直後へ制御を移す。

break文の書き忘れに注意してください。
なお、あえてbreak文を書かなくてもよく、
その場合をファールスルーと呼びます。

[編集] 繰り返し文

[編集] while文

[14] [15]

while文とは、繰り返し文の内の1つであり、式の論理値が真である間、指定する文の実行を繰り返す。 while文では式の論理値の評価は、各繰り返しの前に行われる。

while文の記述は次のようになっている。

  • while文
while(式)
	文

while文は、制御式の値を評価し、その値を0と比較して等しくなるまで、ループ本体と呼ばれる文を、繰り返して実行する。 すなわち、制御式の論理値が真である場合はループ本体を繰り返し、 偽である場合はその繰り返しを終える。 制御式の評価は、ループ本体の各実行の前に行う。 すなわち、制御式の論理値があらかじめ偽であれば、ループ本体は1度も実行されない。

[編集] do-while文

[16] [17]

do-while文とは、繰り返し文の内の1つであり、式の論理値に従って、指定する文の実行を繰り返す。 do-while文では式の論理値の評価は、各繰り返しの後に行われる。

do-while文の記述は次のようになっている。

  • do-while文
do
	文
while(式);

do文は、制御式の値を評価し、その値を0と比較して等しくなるまで、ループ本体と呼ばれる文を、繰り返して実行する。 すなわち、制御式の論理値が真である場合はループ本体を繰り返し、 偽である場合はその繰り返しを終える。 制御式の評価は、ループ本体の各実行の後に行う。 すなわち、制御式の論理値にかかわらず、ループ本体は少なくとも1度は実行される。

[編集] for文

[18] [19]

for文とは、繰り返し文の内の1つであり、式の論理値に従って、指定する文の実行を繰り返す。 while文では式の論理値の評価は、各繰り返しの前に行われる。 for文は、初期化及び後実行を形式的に記述する点でwhile文と異なっている。

for文の記述は次のようになっている。

  • for文
for(初期化式; 前実行式; 後実行式)
	文

for文は、「;(セミコロン)」で区切られた、初期化式、前実行式(制御式、継続条件式とも呼ばれる)、後実行式、 及びループ本体と呼ばれる文からなる。 初期化式では宣言も行ってもよい。 3つの式はいずれとも省略してもよい。前実行式を省略した場合、0でない定数(真)によって置き換えられる。

for文は、まず初期化式を評価し、 そのあと「前実行式の評価-ループ本体(文)の実行-後実行式の評価」を、 制御式(前実行式)の値が0と等しくなるまで繰り返して実行する。 すなわち、制御式の値が偽となるまで繰り返して実行する。 すなわち、制御式の論理値があらかじめ偽であれば、ループ本体は1度も実行されない。

一般に、初期化式では変数の初期化を、前実行式では変数に対する継続条件を、後実行では変数の増分または減分を、それぞれ行う。

[編集] 分岐文

[編集] goto文

[20] [21]

goto文とは、分岐文の内の1つであり、指定するラベルへ制御を移す。

goto文の使用は一般には推奨されません。
理由は読みにくいコード(スパゲティコード)となるからです。

goto文及びラベルの記述は次のようになっている。

  • goto文
goto 識別子;
  • ラベル
識別子:

goto文は、識別子が指すラベルへ制御を移す。 そのラベルはgoto文を含む関数内になければならない。

[編集] continue文

[22] [23]

continue文とは、分岐文の内の1つであり、ループ内で使われ、ループの最後の文の直後へ制御を移す。

continue文の記述は次のようになっている。

  • continue文
continue;

continue文は、ループ本体の中で使われ、ループ本体の終わりへ制御を移す。 ループ本体の終わりとはcontinue文を含む最も内側のループ本体の最後の文の直後である。

[編集] break文

[24] [25]

break文の記述は次のようになっている。

  • break文
break;

break文は、スイッチ本体またはループ本体の中で使われ、 スイッチ本体またはループ本体の直後へ制御を移す。 また、break文は、break文を含む最も内側のスイッチ本体またはループ本体に対応する。

[編集] return文

[26] [27]

return文とは、分岐文の内の1つであり、実行中の関数を終了し、その呼び出し元へ制御を返す。

return文の記述は次のようになっている。

  • return文
return 式;

return文は、実行中の関数を終了し、制御をその呼び出し元に返す。 式があるかどうかは関数の返却値のデータ型により異なり、 void型の場合は式がなく、それ以外のデータ型の場合は式がある。

[編集] 脚注

  1. ^ 『JISX3010:2003』p.32「6.3.1.2 論理型」
  2. ^ 『JISX3010:2003』p.182「7.16 論理型及び論理値<stdbool.h>」
  3. ^ 『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」
  4. ^ 『JISX3010:2003』p.62「6.5.8 関係演算子」
  5. ^ 『JISX3010:2003』p.63「6.5.8 等価演算子」
  6. ^ 『JISX3010:2003』p.65「6.5.8 論理AND演算子」
  7. ^ 『JISX3010:2003』p.65「6.5.8 論理OR演算子」
  8. ^ 『JISX3010:2003』p.54「6.5.2.4 後置増分及び後置減分演算子」
  9. ^ 『JISX3010:2003』p.57「6.5.3.1 前置増分及び前置減分演算子」
  10. ^ 『JISX3010:2003』p.101「6.8.4 選択文」
  11. ^ 『JISX3010:2003』p.101「6.8.4.1 if文」
  12. ^ 『JISX3010:2003』p.101「6.8.4 選択文」
  13. ^ 『JISX3010:2003』p.101「6.8.4.2 switch文」
  14. ^ 『JISX3010:2003』p.102「6.8.5 繰り返し文」
  15. ^ 『JISX3010:2003』p.102「6.8.5.1 while文」
  16. ^ 『JISX3010:2003』p.102「6.8.5 繰り返し文」
  17. ^ 『JISX3010:2003』p.102「6.8.5.2 do文」
  18. ^ 『JISX3010:2003』p.102「6.8.5 繰り返し文」
  19. ^ 『JISX3010:2003』p.102「6.8.5.3 for文」
  20. ^ 『JISX3010:2003』p.103「6.8.6 分岐文」
  21. ^ 『JISX3010:2003』p.103「6.8.6.1 goto文」
  22. ^ 『JISX3010:2003』p.103「6.8.6 分岐文」
  23. ^ 『JISX3010:2003』p.104「6.8.6.2 continue文」
  24. ^ 『JISX3010:2003』p.103「6.8.6 分岐文」
  25. ^ 『JISX3010:2003』p.105「6.8.6.3 break文」
  26. ^ 『JISX3010:2003』p.103「6.8.6 分岐文」
  27. ^ 『JISX3010:2003』p.103「6.8.6.4 return文」
ヘルプ