C/C++三項演算子(?:)に関する興味深い所見と注意点
三項演算子とは
C/C++における三項演算子は、if...else文の代わりに使用できる条件演算子で、「?:」という記号で表されます。「?」がif部分に相当し、「:」がelse部分に相当します。この記事では、実際のコード例を通して、三項演算子の型変換に関する興味深い挙動を3つのケースに分けて解説します。
例1:正常にコンパイルできるケース
以下のプログラムはエラーなくコンパイルできます。これは、三項式の戻り値の型がfloat型(第2オペランド exp2 の型)とみなされ、第3オペランド exp3(int型のリテラル0)がfloat型へ暗黙的に変換可能だからです。
#include <iostream>
using namespace std;
int main(){
int test1 = 0;
float fvalue = 3.111f;
cout<< (test1 ? fvalue : 0) << endl;
return 0;
}
例2:コンパイルエラーになるケース
次のプログラムはコンパイルできません。その理由は、コンパイラが三項式の共通する戻り値の型を特定できず、exp2(char配列)とexp3(int)の間に暗黙的な型変換が存在しないためです。なお、括弧を省略すると演算子の優先順位の関係で意図しない解釈になる可能性もあるため、三項演算子を使う際は括弧で明示的に囲むことが推奨されます。
#include <iostream>
using namespace std;
int main(){
int test1 = 0;
cout<< test1 ? "A String" : 0 << endl;
return 0;
}
例3:実行時に失敗するケース
最後のプログラムは、コンパイルできる場合もありますが、実行時に失敗します。三項式の戻り値の型はchar*型に限定される一方で、式自体はintを返すためです。具体的には、プログラムは実行時にアドレス0番地(ヌルポインタ)にある文字列を出力しようとし、結果としてクラッシュします。
#include <iostream>
using namespace std;
int main(){
int test1 = 0;
cout << (test1 ? "A String" : 0) << endl;
return 0;
}
まとめ
これらの例から、三項演算子では exp2 が出力型として扱われ、exp3 は実行時に exp2 の型へ変換されることが分かります。変換が暗黙的に可能な場合、コンパイラは変換用のコードを自動的に挿入します。一方、変換が不可能な場合はコンパイルエラーが発生します。しかし、万が一コンパイラがこの種のエラーを見逃した場合、プログラムは実行時に失敗する恐れがあるため、三項演算子を使用する際はオペランド同士の型の一貫性に十分注意しましょう。
-
C/C++における三項演算子「? :」の使い方と仕組みを解説
三項演算子とは?「?」演算子は、3つのオペランド(被演算子)を必要とすることから三項演算子と呼ばれています。表記は「? :」という形で、「条件演算子」とも呼ばれます。この演算子を使うことで、コードの行数を削減でき、処理の効率も向上します。基本構文C言語における三項演算子の構文は以下の通りです。式1 ? 式2 : 式3まず式1が評価され、その結果が真(非ゼロ)であれば式2が、偽(ゼロ)であれば式3が実行されます。サンプルコード1#include <stdio.h> int main() { int a = -1; double b = 26.4231; in
-
C/C++の三項演算子(条件演算子)の基本と使い方
3つのオペランド(被演算子)を必要とする演算子は「三項演算子」と呼ばれます。C言語では ? : の記号で表され、「条件演算子」とも呼ばれています。三項演算子を使うと、コードの行数を削減でき、簡潔で読みやすいプログラムを書くことができます。三項演算子の構文式1 ? 式2 : 式3まず式1が評価され、その結果が真(非ゼロ)であれば式2が実行され、偽(ゼロ)であれば式3が実行されます。if-else文を1行で書けるため、簡単な条件分岐に便利です。C言語での三項演算子の例サンプルコード1#include <stdio.h> int main() { int a = -1;