C言語の演算子「?」は三項演算子と呼ばれ、条件式を評価して真偽値を返すことができます。
また、その結果に応じて2つの式のうちどちらか一方を実行することができます。C言語プログラミングにおいて非常に重要な役割を持っていますので、しっかりと理解しておく必要があります。
条件演算子とは
条件演算子は、C言語において「?」と「:」を使って表現される演算子です。この演算子は、if文の簡略化版として利用することができます。
具体的には、「条件式 ? 式1 : 式2」という形式で使用します。この場合、条件式が真(true)の場合には式1が評価され、偽(false)の場合には式2が評価されます。
以下に例を示します。
#include <stdio.h>
int main() {
int a = 10, b = 20;
int max;
// 条件演算子を使った最大値の求め方
max = (a > b) ? a : b;
printf("max=%d\n", max);
return 0;
}
上記のプログラムでは、変数aとbの値を比較し、大きい方を変数maxに代入しています。
この処理で使用した条件演算子「(a > b) ? a : b;」では、「a > b」が真(true)であれば「a」がmaxに代入され、「a > b」が偽(false)であれば「b」がmaxに代入されます。
また、条件演算子はネストさせることも可能です。以下に例を示します。
#include <stdio.h>
int main() {
int score = 80;
// 成績判定(A,B,C,D,F)
char grade = (score >= 90)
? 'A'
: ((score >= 80)
? 'B'
: ((score >= 70)
? 'C'
: ((score >=60)
? 'D'
:'F')));
printf("成績:%c\n", grade);
return 0;
}
上記のプログラムのように何十にもネストすることが出来ますが、可読性が著しく低下します。
100歩譲ってもやらないほうが賢明です。
if文と条件演算子の比較
if文と条件演算子は、どちらもプログラムの中で条件分岐を行うために使用されます。しかし、それぞれの使い方や特徴が異なるため、適切に使い分けることが重要です。
まず、if文は次のような構造を持っています。
if (条件式) {
条件式が真だった場合に実行する処理
}
このように、条件式が真である場合に実行する処理を指定します。また、else句を用いて、「偽」の場合に実行する処理も指定することができます。
一方、条件演算子は次のような構造を持っています。
(条件式) ? 真だった場合に実行する処理 : 偽だった場合に実行する処理;
if文の場合、カッコ等を書く関係で行数が多くなりますが、条件演算子だと1行で簡潔に記述することが出来ます。
そのため、if-else文内で行う処理が1行だけの場合、条件演算子を使ったほうが可読性が上がることがあります。
ただし、if文内での処理が非常に短い場合、条件演算子に比べてコード量が多くなることがあります。
複雑な条件式での使用例
複雑な条件式での条件演算子の使用例を紹介します。
例えば、3つの変数a, b, cがあり、その中で最大値を求める場合を考えます。if文を使うと以下のように書くことが出来ます。
if(a > b){
if(a > c){
max = a;
}else{
max = c;
}
}else{
if(b > c){
max = b;
}else{
max = c;
}
}
これを条件演算子で書き直すと以下のようになります。
max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b :c);
これで1行で最大値を求めることが出来ました。ただし、見てわかるif-elseに比べてかなり見づらいと思います。
三項演算子はシンプルな処理だとかなり見やすくなりますが、少しでも複雑になるととたんに見づらくなります。
その場合は無理して条件演算子を使わず、行数が増えてでも可読性重視でif-else文で書くようにしましょう。
そうすることで、不要なバグを生まずにC言語プログラミングをすることができます。
注意点・制限事項
条件演算子を使用する際には、以下の注意点や制限事項があります。
1. 複雑な式での使用には向かない
条件演算子は単純な条件分岐に適していますが、複雑な式での使用には向きません。複数の条件文を組み合わせたり、関数呼び出しを含めると可読性が低下し、バグの原因ともなり得ます。
2. if文よりも短く書ける場合でも必ずしも使う必要はない
if文よりも簡潔に書けることがあっても、可読性や保守性を考えてif文で記述した方が良い場合があります。特に複雑な処理ではif文で明示的に分岐させた方がコード全体の理解度を高められます。
3. 型変換時の挙動に注意する
条件演算子内部では型変換されるため、予期しない挙動を引き起こす可能性があります。例えばint型とchar型を比較した場合、char型からint型へ自動的に拡張されて比較されます。この際文字列リテラル(”A”等)と比較する場合はASCIIコード値で判断されるため意図しない結果となる可能性がある点留意してください。