条件演算子(Delphi)
式(Delphi) への移動
If 条件演算子
構文:
if <BoolExpr> then <thenValue> else <elseValue>
備考:
この条件演算子は、動作が ?: 演算子に似ていますが、構文はより Pascal 指向であり、if-then-else 構造に似ています。
次の例では、2 つのバージョンで使用される、単純な代入式を示しています。最初のバージョンでは従来の文をベースにしており、2 番目のバージョンは if 演算子をベースとしています。
if Left < 100 then
X := 22
else
X := 45;
X := if Left < 100 then 22 else 45;
主な違いは、次のように、演算子を任意の式の一部として使用できることです:
ShowMessage (if Left < 100 then 'Small' else 'Big')
ここでは、古い表現から新しい表現への文法の変化がわかります。
旧:
Expression -> SimpleExpression [ RelOp SimpleExpression ] . . .
新:
Expression -> SimpleExpression [ RelOp SimpleExpression ] . . .
-> IF Expression THEN Expression ELSE Expression
結果の式の型は、パラメータとして渡される2つの型によって決まります。 すべての型の組み合わせが正しいとは限りません。 以下の表は、組み合わせの概要を示しています:
| 型 1 | 型 2 | 結果の型 |
|---|---|---|
| AnsiChar | AnsiChar | AnsiChar |
| AnsiString | AnsiString、AnsiChar | AnsiString |
| 配列 | 配列 | 同じ要素型の配列 |
| ブーリアン型 | ブーリアン型 | 汎用ブーリアン型またはブーリアン型 |
| クラス参照 | クラス参照、nil | 汎用型、基本型、TClass |
| 動的配列 | 動的配列 | 汎用動的配列型 |
| 列挙型 | 列挙型 | 汎用列挙型型 |
| File | File | エラー(File 型への利用ポインタ) |
| インスタンス | インスタンス、nil | 汎用型、基本型、TObject |
| 整数型 | 整数型 | 汎用整数型、または両方の範囲をカバーする型 |
| 整数型 | 実数型 | 実数型 |
| インターフェイス | インターフェイス、nil | 汎用型、基本型、インターフェイス |
| nil | AnsiChar、ShortString、AnsiString、WideChar、WideString | WideChar へのポインタ |
| オブジェクト | オブジェクト | オブジェクト型 |
| AnsiChar へのポインタ | AnsiChar、ShortString、AnsiString リテラル | AnsiChar へのポインタ |
| AnsiChar へのポインタ | WideChar リテラルへのポインタ | WideChar へのポインタ |
| WideChar へのポインタ | AnsiChar、ShortString、AnsiString、WideChar、WideString、UnicodeString | UnicodeString |
| ポインタ型 | ポインタ型 | 汎用ポインタ型、またはポインタ型 |
| 手続き | 手続き | プロシージャ型(同じシグニチャを持つ場合) |
| オブジェクトのプロシージャ | オブジェクトのプロシージャ | オブジェクト型のプロシージャ(同じシグニチャを持つ場合) |
| 実数型 | 実数型 | より高精度を持つ実数型 |
| レコード | レコード | レコード型 |
| プロシージャへのリファレンス 無名メソッド |
プロシージャへのリファレンス 無名メソッド |
プロシージャ型への参照(同じシグニチャを持つ場合) |
| セット | セット | 汎用セット型、またはリスト リテラルの場合には大きなセット型 |
| Short 文字列 | Short 文字列、AnsiChar | より長い Short 文字列 |
| テキスト | テキスト | エラー(Text 型への利用ポインタ) |
| UnicodeString | UnicodeString、WideString、AnsiString、Short string、WideChar、AnsiChar | UnicodeString |
| Variant | Variant | Variant 型 |
| WideChar | WideChar | WideChar |
| WideChar | AnsiChar、AnsiString | UnicodeString |
| WideString | WideString、AnsiString、WideChar、AnsiChar | WideString |
then や else の式は、キャストを使用して、コンパイラによる式の型の評価をガイドできます。
メモ:
2 つの型が一致せず、互換性がない場合、コンパイラは次のようにエラー メッセージを発します: [dcc32 Error] Unit31.pas(38): E2010 Incompatible types: 'string' and 'Integer'
2 つの型が一致せず、互換性がない場合、コンパイラは次のようにエラー メッセージを発します: [dcc32 Error] Unit31.pas(38): E2010 Incompatible types: 'string' and 'Integer'
メモ:
if-then-else 式は if-then-else 文とは異なる点を意識することは大切です。式は単一型を持ちます。 then と else 式の型が異なる場合、式の型はこの 2 つの式の型の共通型になります。これは、最小上界(LUB: Least Upper Bound)型とも呼ばれます。式の中で if-then-else 演算子を使用する場合、他の演算(例:加算)の方が優先度が高いことに注意してください。予期しないエラーを引き起こします。 優先度が低いブール演算子の場合と同様に、括弧を追加して使用してください。