ひとつの文の終りには、 必ず ;(セミコロン)を置きます。
int x; /* 宣言文 */ x = 10; /* 代入文(実行文) */ printf("%d\n", x); /* 関数呼び出し(実行文) */
文は上から順に実行されます。文; 文; ...
ブロック
複数の文を { } でくくってひとまとめにしたものを、
ブロックと呼びます。
このブロックの最初の部分に変数の宣言を書くことができます。{ 文; 文; ... }
ブロックの内側に、 更にブロックを作ることもできます(ブロックの入れ子)。{ int x; /* 変数宣言 */ int y; /* 変数宣言 */ x = 10; /* ここから後は実行文 */ y = 20; print("%d+%d=%d\n", x, y, x + y); }
{ int x; /* 変数宣言 */ int y; /* 変数宣言 */ x = 10; /* ここから後は実行文 */ y = 20; print("%d+%d=%d\n", x, y, x + y); { int z; /* 内側のブロックでの変数宣言 */ z = x - y; /* ここから後は内側のブロックの実行文 */ printf("%d-%d=%d\n", x, y, z); } }
関係演算式の値は「真」「偽」のいずれかになります。 このような値を論理値と呼びます。
x > y x が y より大きいなら真 x >= y x が y 以上なら真 x < y x が y より小さいなら真 x <= y x が y 以下なら真 x == y x と y が等しいなら真 x != y x と y が等しくないなら真
論理値のデータ型は整数です。 下の例では、x と y が等しければ a に 0 でない整数が、 等しくなければ 0 が入ります。
真 偽 0 でない整数 0
なお、文字列同士の比較には strcmp などのライブラリ関数を用います。 strcmp は引数に与えられた2つの文字列の内容が同じ時 0 を戻り値として 返しますから、下の例では文字列 s が "abc" の時に真になります。float x, y; int a; a = x == y;
関係演算子の優先順位は、 関係演算子同士では同じですが、 四則演算(加減乗除)より低くなっています。strcmp(s, "abc") == 0
上の例では、x + 1 を計算した後、その結果と 10 を比較しています。x + 1 > 10
論理演算子の優先順位は !>&&>|| の順で、 &&、|| は関係演算子より低く、 ! は乗除よりも高くなります。 下の例では x >= 16 と x < 26 を計算した後、 && による論理演算が行われます。 従ってこの式は x が 16 以上 26 未満のときに真になります。
x && y x が y ともに真のとき真 x || y x と y のいずれか一方が真のとき真 !x x が 僞なら真、真なら偽(反転)
論理演算式の値は論理値になります。x >= 16 && x < 26
この例では !x が先に計算されるため、 この式は x が偽か、あるいは y が真のとき真になります。!x || y
一方、上の左の例では x || y を計算した後に ! 演算子による計算が 行われるので、この式は x と y が両方とも偽のとき真になります。 すなわち、この式は、上の右の式と等価です。
!(x || y) !x && !y
if の後に続く ( ) 内の論理値が真なら、 その直後の { } に書かれた処理を実行し、 偽(真でない場合)なら else の後の { } 内の処理を実行します。
x が y より大きい(x > y が真)なら z = x を実行し、 小さい(x > y が偽)なら z = y を実行します。 この結果、z には x と y の大きいほうの値が入ります。if (x > y) { z = x; } else { z = y }
if ( ) や else に続けて、 ブロックあるいは単一の文を置くことができます。 従って、上の例は下のように書くこともできます。
しかし、{ } を省略すると非常に見つけにくいプログラムのミスを 誘発することがあります。 省略可能でも省略しない方がいいのではないかと思います。if (x > y) z = x; else z = y;
上の2つの例は同じものですが、 左のものは、x > 0 が真の時に z = 2 が実行されるように見えます。 しかし、実際にはこの else は2つ目の if に対応します。 右の例も勧められません。{ } を使って書くべきでしょう。
if (x > 0) if (y > 0) z = 1; else z = 2; if (x > 0) if (y > 0) z = 1; else z = 2;
else に続く処理が必要なければ、else 以降は省略できます。
いずれも x が負(x < 0 が真)なら x = -x; を実行します。 すなわち x の絶対値を求めます。
if (x < 0) { x = -x; } if (x < 0) x = -x;
else の後にまた if を置くことができます。
if (x < 0) { printf("x は負です\n"); } else if (x == 0) { printf("x は0です\n"); } else { /* 負でも0でもなければ正 */ printf("x は正です\n"); }
while の後に続く ( ) 内の条件が真なら、 その直後の { } 内の処理を実行して再度条件を調べます。 条件が真なら、同じことを繰り返します。
これは「おはようさん」と1回出力する度に i を1増すという処理を、i < 5 の間繰り返します。int i; i = 0; while (i < 5) { printf("おはようさん\n"); i++; }
従って、i は 0, 1, 2, 3, 4, 5 と変化し、 i が 5 のときは { } 内の処理は実行せずに次に進みます。
この結果「おはようさん」は i が 0, 1, 2, 3, 4 のとき、 すなわち5回出力されます。
if と同様 while ( ) に続く { } 内が単一の文のときは、 { } を省略できます。
なお、上のプログラムは次のように書くこともできます。int i; i = 0; while (i < 5) printf("%d 回目のおはようさん\n", ++i);
int i; i = 0; while (i++ < 5) printf("%d 回目のおはようさん\n", i);