第43章 ?: ???

 ある変数に、条件によって違った値を代入したいときとかあります。また、同じ関数の引数に、条件によって違った値を渡したいときもあるでしょう。そういったときに if-else 文を使うと少し冗長な感じがします。こんな時に便利な演算子があります。今回はそんな話です。


 では、今回の要点です。


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


 では、次のプログラムを見て下さい。

プログラム
// Cndop1b.cpp
#include <iostream.h>

int main()
{
    int num1, num2;

    cout << "2つ値を入力して下さい > ";
    cin >> num1 >> num2;

    if(num1 > num2)
        cout << "大きい方の値は " << num1 << " です。" << endl;
    else
        cout << "大きい方の値は " << num2 << " です。" << endl;

    return 0;
}
実行結果
2つ値を入力して下さい > 12 54
大きい方の値は 54 です。

 2つの値を入力させて、大きい方の値を出力するというプログラムです。等しい場合も「大きい方の値は」と表示されてしまいますが、そこは気にしないで下さい。何ていうか意味のないプログラムですが、まぁ我慢して下さい。

 このプログラム、出力の部分がかなり重複していて無駄ですね。先ず、今までの知識で工夫をしてみましょう。

 先ず考えられるのは、重複している部分を if-else 文内から出してやることですね。ということで、以下のようにしてみました。

cout << "大きい方の値は ";
if(num1 > num2)
    cout << num1;
else
    cout << num2;
cout << " です。" << endl;

 一応すっきりしましたが、cout が4つも並んでいて見ていて気持ちのいいものではありませんね。では、次のようにしてみましょう。あらかじめ出力する値を別変数に入れておき、出力を1つで済ましてしまうというものです。

int max;
if(num1 > num2)
    max = num1;
else
    max = num2;
cout << "大きい方の値は " << max << " です。" << endl;

 まあまあすっきりしましたが、こういった処理をする度にいちいち変数を作らなければならないのも面倒な気がします。

 では、cout が1つですみ、変数も作らなくてすむ方法はあるのでしょうか? もちろんあります。そのための演算子が条件演算子です。記号は ?: です。

 何やら変な演算子ですね。これは3項演算子で、3つのパラメータをとります。代入演算子 = では、右辺と左辺の2つのパラメータをとるので2項演算子、インクリメント演算子 ++ では、変数1つをパラメータにとるので単項演算子と呼ばれます。3項演算子はこの条件演算子だけです。

 使い方を説明する前に、上のプログラムを条件演算子で書き換えたものを見てみましょう。

プログラム
// Cndop1.cpp
#include <iostream.h>

int main()
{
    int num1, num2;

    cout << "2つ値を入力して下さい > ";
    cin >> num1 >> num2;

    cout << "大きい方の値は "
         << ((num1 > num2) ? num1 : num2) << " です。" << endl;

    return 0;
}
実行結果
2つ値を入力して下さい > 12 54
大きい方の値は 54 です。

 赤くなっている部分が条件演算子の部分です。書式は

<条件式> ? <数値1> : <数値2>

のようです。条件式を判定して、その結果に応じて数値1か数値2を返すという風になっていることが想像できますね。

 num1 > num2 のときに num1 を返すべきなのですから、条件文が満たされているときは数値1を返すことが分かります。満たされていないときは数値2を返します。

 この演算子は文の量が減るだけでなく、変数確保や関数の重複使用などを避けることが出来るので処理の軽減にも繋がります。使えそうなところでは積極的に使うといいでしょう。

 ちなみに、上で使った最大値を求めるルーチンは stdlib.h で __max マクロとして定義されています。それだけ一般的なルーチンとも言えます。


 では、今回はこれで終わりです。要点を再度まとめてみましょう。


 また次回まで、さようなら。


第42章 変えてくれるな2 | 第44章 いろんな計算を

Last update was done on 2002.2.28

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