初期化と代入 解答ページ | Programming Place Plus C言語編 第7章

トップページC言語編第7章

問題①

問題① 次のプログラムの実行結果はどうなりますか?

#include <stdio.h>

int main(void)
{
    int value = 10;
    int value2 = -10;

    value = value2;
    printf("%d,%d\n", value, value2);

    value2 = value + 5;
    printf("%d,%d\n", value, value2);

    value = value2 = 100;
    printf("%d,%d\n", value, value2);
}


最初の代入 value = value2 で、value2 の値が value1 へ代入されます。value2 の値は -10 なので、value の値も -10 になります。代入では右辺の変数の値は変化しませんから、value2 は -10 のままです。

2つ目の代入 value2 = value + 5 では、value の値に 5 を足した結果が、value2 に代入されます。この時点での value の値は -10 になっていますから、-10 + 5 の結果である -5 が value2 に代入されます。value は -10 のままです。

3つ目の代入 value = value2 = 100 は2つの代入式が含まれています。この場合、右側から順番に処理していきます。まず、value2 = 100 によって、value2 の値が 100 に変更されます。次に value = value2 の部分が処理されて、value の値も 100 に変更されます。

したがって、実行結果は次のようになります。

実行結果:

-10,-10
-10,-5
100,100

問題②

整数を1つ入力させ、その数を2倍した数、さらに2倍した数、それをさらに2倍した数・・・を順々に出力するプログラムを作成してください(適当なところで止めてください)。


次のように書けます。

#include <stdio.h>

int main(void)
{
    puts("Please enter the integer.");
    char input_string[20];
    fgets(input_string, sizeof(input_string), stdin);
    int value;
    sscanf(input_string, "%d", &value);
    
    value *= 2;
    printf("%d\n", value);

    value *= 2;
    printf("%d\n", value);

    value *= 2;
    printf("%d\n", value);

    value *= 2;
    printf("%d\n", value);

    value *= 2;
    printf("%d\n", value);
}

実行結果:

Please enter the integer.
5    <-- 入力した整数
10
20
40
80
160

複合代入演算子を使って、変数value の値を次々に変更しながら出力を繰り返しています。

問題③

問題③ 2つの int型の変数 a, b があるとして、互いに値を入れ替えるプログラムを書いてください。


変数a の値と変数b の値を入れ替えるには、a = bb = a が必要であることは明らかです。しかし、代入は、代入先の値を変更してしまう行為ですから、先に a = b をすると、変数a の値は変数b の値に置き換わってしまいますし、逆に b = a を先にすると、変数b の値が変数a の値に置き換わってしまいます。つまり、どちらを先にしたとしても、他方に自分の値を渡す前に、他方によって自分の値が書き換えられてしまい、うまくいきません。

#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;

    a = b;
    b = a;

    printf("a = %d\n", a);
    printf("b = %d\n", b);
}

実行結果:

a = 20
b = 20

変数の値を入れ替えるには、もう1つ変数を追加する必要があります。そして、他方に自分の値を書き換えられてしまう前に、自分の値を追加した変数に退避しておきます。最後に退避しておいた値を他方にコピーすれば、値の入れ替えが実現できます。

#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;
    int work;

    work = a;  // a の値を退避
    a = b;     // b を a にコピー
    b = work;  // 退避しておいた a の値を b にコピー

    printf("a = %d\n", a);
    printf("b = %d\n", b);
}

実行結果:

a = 20
b = 10

このような、2つの変数の値を入れ替える処理は、値の交換(swap)と呼ばれ、非常によく登場するプログラムです。

退避用の変数につけた名前 work は、小さめの作業をこなすために使う一時的な変数によく付けられる名前です。ほかに、「temporary: 一時的な」を意味する temp や tmp がよく使われます。

値の交換については、アルゴリズムとデータ構造編【その他】第1章で、より詳しくあつかっています。

問題④

問題④ 次のプログラムを、複合代入演算子を使って書き直してください。

#include <stdio.h>

int main(void)
{
    int num = 15;
    int num2 = 5;
    int num3 = 30;

    num = num - 10;
    num2 = num2 + (num * 4);
    num3 = num3 % (num2 - 5);

    printf("%d %d %d\n", num, num2, num3);
}


次のようになります。

#include <stdio.h>

int main(void)
{
    int num = 15;
    int num2 = 5;
    int num3 = 30;

    num -= 10;
    num2 += num * 4;
    num3 %= num2 - 5;

    printf("%d %d %d\n", num, num2, num3);
}

実行結果:

5 25 10

複合代入演算子の場合、演算子の右側の ( ) は外してしまえます。複合代入演算子の優先順位は、通常の代入演算子と同じであるためです。


参考リンク


更新履歴



第7章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る