条件演算子は、多くのプログラミング言語でサポートされています。この用語は通常?:、C、C++、C#、JavaScript では を指します。ただし、Java では、この用語は&&およびを指すこともあります||。
&& および ||
Javaなどの一部のプログラミング言語では、条件演算子という用語は短絡ブール演算子 &&とを指します||。2番目の式は、最初の式が式全体の値を決定するのに不十分な場合にのみ評価されます。[1]
ビット演算子との違い
&は、多くのプログラミング言語で使われるビット演算子|です。主な違いは、ビット演算は 2 進数の個々のビットに対して実行されるのに対し、条件演算子は論理演算に対して実行されることです。また、ビット演算子の前後の式は常に評価されます。
if (式1 ||式2 ||式3 )
式 1 が true の場合、式 2 と 3 はチェックされません。
if (式1 |式2 |式3 )
これは、式 1 が true であっても、式 2 と 3 をチェックします。
短絡演算子は、不必要な計算を回避することで実行時間を短縮できます。また、式 1 がオブジェクトが有効かどうかをチェックするときに Null 例外を回避することもできます。
Javaでの使用法
クラス ConditionalDemo1 {
public static void main ( String [] args ) { int value1 = 1 ; int value2 = 2 ; if (( value1 == 1 ) && ( value2 == 2 )) System.out.println ( " value1 is 1 AND value2 is 2" ) ; if ( ( value1 == 1 ) || ( value2 == 1 ) ) System.out.println ( " value1 is 1 OR value2 is 1" ) ; } }
「?:」
ほとんどのプログラミング言語では、?:は条件演算子と呼ばれます。これは三項演算子の一種です。ただし、ほとんどの場合、三項演算子は?:を指します 。これは、3つのオペランドを取る唯一の演算子だからです。[2]
「?:」の通常の使用法
?:条件式で使用されます。プログラマーは条件演算子を使用してif-then-else式をより簡潔に書き直すことができます。[3]
構文
条件?式1 :式2
条件:ブール値として評価される式。
式 1、式 2: 任意の型の値を持つ式。
条件が true と評価された場合、式 1 が評価されます。条件が false と評価された場合、式 2 が評価されます。
これは次のように読み替える必要があります: 「条件が真の場合、式 1 の値を結果に代入します。それ以外の場合は、式 2 の値を結果に代入します。」
関連プロパティ
条件演算子は右結合であり、演算は右から左にグループ化されます。たとえば、a ? b : c ? d : eという形式の式は、a ? b : (c ? d : e)として評価されます。[2]
言語別の例
ジャワ
クラス ConditionalDemo2 {
public static void main ( String [] args ) { int value1 = 1 ; int value2 = 2 ; int result ; boolean someCondition = true ; result = someCondition ? value1 : value2 ;
システム.out.println (結果) ; } }
この例では、someConditionが true であるため、このプログラムは画面に「1」を出力します。コードが読みやすくなる場合は、if-then-else ステートメントの代わりに ?: 演算子を使用します。たとえば、式がコンパクトで副作用 (割り当てなど) がない場合などです。
C++
#include <iostream>
int main () { int x = 1 ; int y = 2 ; std :: cout << ( x > y ? x : y ) << " は 2 つのうち大きい方です。" << std :: endl ; }
C++ の 2 番目と 3 番目のオペランドに適用されるルールがいくつかあります。
- 両方のオペランドが同じ型の場合、結果はその型になります
- 両方のオペランドが算術型または列挙型の場合、通常の算術変換(標準変換で説明)が実行され、共通の型に変換されます。
- 両方のオペランドがポインタ型の場合、または一方がポインタ型でもう一方が0に評価される定数式の場合、ポインタ変換が実行され、共通型に変換されます。
- 両方のオペランドが参照型の場合、参照変換が実行され、共通型に変換されます。
- 両方のオペランドがvoid型の場合、共通型はvoid型となる。
- 両方のオペランドが同じユーザー定義型の場合、共通型はその型になります。[4]
C#
// 条件 ? first_expression : second_expression;
static double sinc ( double x ) { return x != 0.0 ? Math . Sin ( x ) / x : 1.0 ; }
C# の 2 番目と 3 番目のオペランド x と y には、いくつかのルールが適用されます。
- x が型 X を持ち、y が型 Y を持つ場合:
- X から Y への暗黙的な変換が存在するが、Y から X への変換は存在しない場合、Y は条件式の型になります。
- Y から X への暗黙的な変換が存在するが、X から Y への変換は存在しない場合、X は条件式の型になります。
- そうでない場合、式の型を判別できず、コンパイル時エラーが発生します。
- x と y のどちらか一方だけに型があり、 x と y の両方が暗黙的にその型に変換可能な場合、その型が条件式の型になります。
- それ以外の場合、式の型を決定できず、コンパイル時エラーが発生します。[2]
JavaScript
var age = 26 ; var drink = ( age >= 21 ) ? "ビール" : "ジュース" ; console . log ( drink ); // "ビール"
JavaScript の条件演算子は、次のブラウザと互換性があります。
Chrome、Edge、Firefox(1)、Internet Explorer、Opera、Safari、Android Webview、Android版Chrome、Edge Mobile、Android版Firefox(4)、Android版Opera、iOS版Safari、Samsung Internet、Node.js。[5]
条件連鎖における特別な使用法
三項演算子は右結合なので、if ... else if ... else if ... else チェーンと同様に、次のように「連鎖」することができます。[4]
言語別の例
JavaScript
関数の例( … ) { return条件1 ?値1 :条件2 ?値2 :条件3 ?値3 :値4 ; }
// 以下と同等:
関数の例( … ) { if (条件1 ) {戻り値1 ; } else if (条件2 ) {戻り値2 ; } else if (条件3 ) {戻り値3 ; } else {戻り値4 ; } }
C++ の
const double a =式1 ? a1 :式2 ? a2 :式3 ? a3 : /*それ以外の場合*/ a4 ;
// 以下と同等:
double a ; if (式1 ) a = a1 ; else if (式2 ) a = a2 ; else if (式3 ) a = a3 ; else /*それ以外の場合*/ a = a4 ;
代入式における特別な使用法
条件演算子はC/C++でL値を生成し、別の値を割り当てることができますが、この手法があまり知られていないという理由だけでも、大多数のプログラマーはこれを非常に悪いスタイルだと考えています。[6]
C++ の
(( foo ) ? bar : baz ) = frink ;
// 次と同等:
if ( foo ) bar = frink ; else baz = frink ;
参照
- ?:、コンピュータプログラミングにおける条件演算子
- 三項演算
- ビット演算子
- 短絡ブール演算子
- オペレーター(プログラミング)
参考文献
- ^ 「等価演算子、関係演算子、条件演算子 (Java™ チュートリアル > Java 言語の学習 > 言語の基礎)」。docs.oracle.com。2019年 4 月 29 日閲覧。
- ^ abc BillWagner. 「?: 演算子 - C# リファレンス」。docs.microsoft.com 。 2019 年 4 月 29 日閲覧。
- ^ 「Java の ?: 演算子」www.cafeaulait.org . 2019 年 4 月 29 日閲覧。
- ^ ab mikeblome. 「条件演算子: ?」. docs.microsoft.com . 2019 年 4 月 29 日閲覧。
- ^ 「条件(三項)演算子 - JavaScript」。developer.mozilla.org 。 2019年4月29日閲覧。
- ^ 「条件演算子」. wiki.c2.com . 2019年4月29日閲覧。
