第7章 代入文のリサイクル

 前回言った通り、宣言文とブロック文以外の文は「式にセミコロンをつけたもの」です。では、代入文はどうなのでしょうか? 代入文を式として利用した場合どうなるのでしょうか? 今回は、その代入文についてのお話です。


 では、今回の要点です。


 では、いってみましょう。


 先ず、代入文を式にセミコロンをつけたものと考えます。この式を代入式と呼びましょう。例えば、i = 0; の場合は i = 0 が代入式となります。

 この代入式は普通の式と同じように使えるのでしょうか? そして、使えるとすればどのようになるのでしょうか? では、代入式を普通の式と同じように使ってみましょう。優先順位が気になるので、代入文はカッコで囲んでおきましょう。

プログラム実行結果
// Assign1.cpp
#include <iostream.h>

int main()
{
    int a = 0, b = 0;

    a = (b = 5);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl << endl;

    cout << "b = " << (b += 3) << endl;
    cout << "b = " << b << endl << endl;

    (b = 1) += a;
    cout << "b = " << b << endl;

    return 0;
}
a = 5
b = 5

b = 8
b = 8

b = 6

 先ずは a = (b = 5); です。

 初めに、a と b は0で初期化しておきました。その上で、次は a に (b = 5) を代入することにしたわけです。すると、a も b も5になっていますね。

 どうやら、代入式の値は代入される値か、b の値かのどちらかのようです。このどちらかを試すために、次は (b += 3) の表示を試しています。

 この前は b は5だったのですが、ここで表示されたのは8です。つまり、b + 3 の値です。さらに次に b を表示していますが、b の値は8になっています。

 このことから分かるように、代入式の値は代入される変数の値になり、その値は代入後の値が使われるようです。


 最後は (b = 1) += a; です。

 コンパイルエラーが出るかと思いきや、何の問題もありませんでした。

 で、表示された b の値は6です。このときの a の値は5でしたので、この6というのは 1 + a だと思われます。先ず b に1が代入され、その上で a が足されたのです。


 以上より、代入式は代入される変数の代わりになるということになります。そして、その時の値は代入された後の値になるのです。丁度、代入される変数への参照が返ってくるような感じですね。

 前回の while 文は、このことを利用したのでも簡素になります。

while((letter = fgetc(pf)) != EOF)
{
    ... 処理 ...
}

 この書き方もよく使われます。どちらを使うかは、趣味に任せるとしましょう。


 さて、インクリメント演算子 (++) 、デクリメント演算子 (--) も代入演算子です。第1部第6章で話したとおり、これは変数の前につけることも後につけることもできます。第1部第6章では触れませんでしたが、これらには違いがあります。やはり、これもプログラムを作って確かめてみましょう。実験あるのみです。

プログラム実行結果
// Assign2.cpp
#include <iostream.h>

int main()
{
    int a, b;

    a = 5;
    b = 0;
    a = (++b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl << endl;

    a = 5;
    b = 0;
    a = (b++);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl << endl;

    return 0;
}
a = 1
b = 1

a = 0
b = 1

 先ずは ++ が前についた方を見てみましょう。

a = (++b);

 a は5で、b は0で初期化されています。上で話したとおりに考えると「先ず b が1になり、それが a に代入される」となります。つまり、両方とも1になるはずです。

 実行結果を見てみると...両方とも1になっていますね。(++b) と (b += 1) とは等価であることになります。


 次は ++ が後についた方です。

a = (b++);

 a は5で、b は0で初期化されています。つまり、上で話したとおりに考えると「先ず b が1になり、それが a に代入される」となります。つまり、やはり両方とも1になるはずです。

 実行結果を見てみると...何と、a は0になっています。どうやら、b が1増える前に a に代入されたようです。


 このように、++ がについた方は、先にインクリメントをします。このインクリメントを前置インクリメントと呼びます。

 一方、++ がについた方は、後でインクリメントされます。このインクリメントを後置インクリメントと呼びます。そしてこの性質のために、後置インクリメント式には代入演算を行えません。(b++) = 1; はコンパイルエラーになります。

 後置インクリメントは代入式の中でも特殊であることが分かります。しかし、前置、後置どちらがどちらになるかは、見た目から何となく判断できるようになっていますね。


 今回のことをまとめると、


となります。

 やたらと代入文の再利用を行うとやはりプログラムが見づらくなるので、適度に使うようにしましょう。


第6章 コンマ演算子 | 第8章 アドレスを返す関数

Last update was done on 2000.8.5

この講座の著作権はロベールが保有しています