情報基礎演習II − 第7回


1.文とブロック


文はプログラムの構成要素の最小単位です。
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);
    }
}

2.関係演算と論理演算


関係演算

C言語では、数値の大小比較を式として取り扱います。 このような式を関係演算式と言います。 また大小比較を行う演算子を関係演算子と呼びます。
x > yx が y より大きいなら真
x >= yx が y 以上なら真
x < yx が y より小さいなら真
x <= yx が y 以下なら真
x == yx と y が等しいなら真
x != yx と y が等しくないなら真
関係演算式の値は「真」「偽」のいずれかになります。 このような値を論理値と呼びます。
0 でない整数0
論理値のデータ型は整数です。 下の例では、x と y が等しければ a に 0 でない整数が、 等しくなければ 0 が入ります。
float x, y;
int a;
a = x == y;
なお、文字列同士の比較には strcmp などのライブラリ関数を用います。 strcmp は引数に与えられた2つの文字列の内容が同じ時 0 を戻り値として 返しますから、下の例では文字列 s が "abc" の時に真になります。
strcmp(s, "abc") == 0
関係演算子の優先順位は、 関係演算子同士では同じですが、 四則演算(加減乗除)より低くなっています。
x + 1 > 10
上の例では、x + 1 を計算した後、その結果と 10 を比較しています。

論理演算

上の論理値を対象とした演算です。 このような演算を行う演算子を論理演算子と呼びます。
x && yx が y ともに真のとき真
x || yx と y のいずれか一方が真のとき真
!xx が 僞なら真、真なら偽(反転)
論理演算子の優先順位は !>&&>|| の順で、 &&|| は関係演算子より低く、 ! は乗除よりも高くなります。 下の例では x >= 16 と x < 26 を計算した後、 && による論理演算が行われます。 従ってこの式は x が 16 以上 26 未満のときに真になります。
x >= 16 && x < 26
論理演算式の値は論理値になります。
!x || y
この例では !x が先に計算されるため、 この式は x が偽か、あるいは y が真のとき真になります。
!(x || y)
!x && !y
一方、上の左の例では x || y を計算した後に ! 演算子による計算が 行われるので、この式は x と y が両方とも偽のとき真になります。 すなわち、この式は、上の右の式と等価です。


3.制御構造


if

if というキーワードを使えば、 「条件」によって特定の処理を行ったり、 行わなかったりすることができます。

if の後に続く ( ) 内の論理値が真なら、 その直後の { } に書かれた処理を実行し、 偽(真でない場合)なら else の後の { } 内の処理を実行します。

if (x > y) {
    z = x;
}
else {
    z = y
}
x が y より大きい(x > y が真)なら z = x を実行し、 小さい(x > y が偽)なら z = y を実行します。 この結果、z には x と y の大きいほうの値が入ります。

if ( ) や else に続けて、 ブロックあるいは単一の文を置くことができます。 従って、上の例は下のように書くこともできます。

if (x > y)
    z = x;
else
    z = y;
しかし、{ } を省略すると非常に見つけにくいプログラムのミスを 誘発することがあります。 省略可能でも省略しない方がいいのではないかと思います。
if (x > 0)
    if (y > 0)
        z = 1;
else
    z = 2;
if (x > 0)
    if (y > 0)
        z = 1;
    else
        z = 2;
上の2つの例は同じものですが、 左のものは、x > 0 が真の時に z = 2 が実行されるように見えます。 しかし、実際にはこの else は2つ目の if に対応します。 右の例も勧められません。{ } を使って書くべきでしょう。

else に続く処理が必要なければ、else 以降は省略できます。

if (x < 0) {
    x = -x;
}
if (x < 0) x = -x;
いずれも x が負(x < 0 が真)なら x = -x; を実行します。 すなわち x の絶対値を求めます。

else の後にまた if を置くことができます。

if (x < 0) {
    printf("x は負です\n");
}
else if (x == 0) {
    printf("x は0です\n");
}
else { /* 負でも0でもなければ正 */
    printf("x は正です\n");
}

■課題26■

■課題27■

■課題28■


while

while というキーワードを使えば、 ある条件が成立する(真である)間、 同じ処理を繰り返すことができます。

while の後に続く ( ) 内の条件が真なら、 その直後の { } 内の処理を実行して再度条件を調べます。 条件が真なら、同じことを繰り返します。

int i;
i = 0;
while (i < 5) {
    printf("おはようさん\n");
    i++;
}
これは「おはようさん」と1回出力する度に i を1増すという処理を、i < 5 の間繰り返します。

従って、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);

■課題29■

■課題30■