三項演算子 ?:

三項演算子の一般的な形式は次の通りです。

1 ?式 2 : 式 3

1 番目のオペランド(式 1 )には bool 型の値の結果を持つ任意の式を使用出来ます。結果が true の場合、2 番目のオペランドによって設定された演算子、つまり「式 2 」が実行されます。

1 番目のオペランドが false の場合、3 番目のオペランド(式 3 )が実行されます。2 番目と 3 番目のオペランド、つまり「式 2 」と「式 3 」は同じ型の値を返し、これは void 型であってはいけません。条件演算子の実行結果は、式 1 の結果に応じて、式 2 または式 3 の結果となります。

//--- 一日の始値と終値の差を正規化
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

これは下記と同じです。

  double true_range;
  if(High==Low)true_range=0;               // 高/安値が等しい場合
  else true_range=(Close-Open)/(High-Low); // 範囲が null でない場合

 

演算子の使用制限 #

この演算子は、「式 1 」の値に基づいて「式 2 」または「式 3 」の値を返さなければなりません。これらの式には、いくつかの制限があります。

  1. ユーザ定義型基本データ型列挙を混用してはいけません。ポインタにはNULLを使用出来ます。
  2. 値が基本型であれば、一番大きい型のオペレータが使用されます(型キャストをご参照ください)。
  3. 値のいずれかが列挙型で 2 つ目が数値型の場合、列挙型は int 型に置き換えられ、2 番目のルールが適用されます。
  4. 両方の値が列挙型の場合は、その型が同一である必要があり、演算子は列挙型となります。

ユーザ定義型(クラスまたは構造体)の制約事項は下記です。

  1. 型は同一であるか 2 つ目が  1 つ目からの派生型である必要があります。
  2. 型が同一(または継承)でない場合、子の型は暗黙的に親にキャストされ、演算子は親の型になります。
  3. オブジェクトとポインタを混用してはいけません。式は両方ともオブジェクトまたはポインタでなければいけません。ポインタにはNULL が利用出来ます。

注意事項

条件演算子の結果の型はプログラムのコンパイル時に定義されているので、条件演算子をオーバーロードされた関数の引数として使用する場合はご注意ください。この型は「式 2 」と「式 3 」の型のうち大きい方の型として定義されています。

例:

void func(double d) { Print("double argument: ",d); }
void func(string s) { Print("string argument: ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
void OnStart()
 {
  func(Expression2);
  func(Expression3);
 
  func(Expression1?Expression2:Expression3);   // 文字列への暗黙的キャストに警告
  func(!Expression1?Expression2:Expression3); // 文字列への暗黙的キャストに警告
 }
 
//   結果:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

参照

変数の初期化変数のアクセス権スコープとライフタイムオブジェクトの作成と解徐