コンピューティングにおいて、IIf ( Immediate if [1]の略)は、Visual Basicプログラミング言語とColdFusion Markup Language(CFML)のいくつかのエディション、およびスプレッドシートで、最初のパラメータの評価に基づいて2番目または3番目のパラメータを返す関数です。これは条件式の例であり、条件文に似ています。
構文
IIf 関数の構文は次のとおり です。
IIf (式、真部分、偽部分)
次の 3 つのパラメータはすべて必須です。
- e expr は評価される式です。
- truepart は、 expr
IIfの評価が true を返す場合に関数が返すものを定義します。 - falsepart は、 expr
IIfの評価が false を返す場合に関数が返すものを定義します。
多くの言語には、同じ目的を達成するための演算子があり、一般的には条件演算子(または、より正確には三項演算子) と呼ばれます。最もよく知られているのは、C、C++、および関連言語で使用される?:です。後で説明するように、IIf 関数の問題の一部は、条件演算子では発生しません。これは、言語がオペランドの型を自由に調べ、オペランドの評価を遅らせることができるためであり、単にライブラリ関数に渡すだけではないからです。
例
これらの例では、数式を評価し、結果に応じて 2 つの文字列のいずれかを返します。
result = IIf (5 < 10, "はい、そうです" , "いいえ、違います") ' "はい、そうです" を返します
result = IIf (2 + 2 = 5, "Correct", "Wrong" ) ' "Wrong" を返します
批判
効率
はライブラリ関数であるためIIf、常に関数呼び出しのオーバーヘッドが必要になりますが、条件演算子ではインライン コードが生成される可能性が高くなります。
さらに、その引数のデータ型はVariantです。関数が他の型 (変数またはリテラル) の引数で呼び出されると、これらを に変換するための追加のオーバーヘッドが発生しますVariant。引数の型をチェックし、同じ型でない場合はそのうちの 1 つを変換するための追加のオーバーヘッドが発生することもあります。
副作用
IIfライブラリ関数であるため、別の問題が発生します。C 派生の条件演算子とは異なり、実際に返されるものに関係なく、 true 部分とfalse 部分の両方が評価されます。次のコード スニペットでは、
値 = 10 結果 = IIf(値 = 10, TrueFunction , FalseFunction )
TrueFunction は呼び出される関数ですが、 TrueFunctionとFalseFunction のIIf両方を呼び出します。同様に、
a = 10 b = 0結果= IIf ( b <> 0 , a / b , 0 )
ゼロ除算を避ける意図があるかもしれませんが、bがゼロのときは常にエラーが発生します。これは、スニペットのコードが次のように実行されるためです。
a = 10 b = 0 _temp1 = b <> 0 _temp2 = a / b ' b = 0 の場合はエラー_temp3 = 0 _temp1の場合は結果= _temp2それ以外の場合は結果= _temp3終了
この問題によりIIf()、呼び出しは条件演算子よりも有用性が低くなります。この問題を解決するために、Microsoft の開発者は[2]組み込み関数への変換を検討しました。これが実現していれば、コンパイラは関数呼び出しをインライン コードに置き換えることで、
型推論とショート サーキットをIIf実行できたはずです。
IIf の代替案
Visual Basicでは、式が真か偽かに基づいてアクションを評価して実行する方法は IIf だけではありません。
次の例では IIf を使用します。
結果 = IIf (x = y, 値1, 値2)
標準的な条件文を使用して、次のように記述することもできます。
x = yの場合、結果=値1 、そうでない場合、結果=値2 、終了
上記の例では、IIf がtruepart パラメータとfalsepartパラメータの両方を評価する問題も解消されます。
Visual Basic 2008 (VB 9.0) では、単に「If」と呼ばれる真の条件演算子が導入され、この問題も解消されました。その構文は、IIf 関数の構文に似ています。
結果= If ( x = y ,値1 ,値2 )
他のプログラミング言語でのIIf
$iif()mIRCスクリプト
にも同様の構文で存在します。
エイリアス testiif {
%テスト = 0
echo -a $iif(1,$testiif2,$testiif2) %testiif 実行
%testiif の設定を解除
}
エイリアス testiif2 { inc %testiif | $!iif のテストを返す: }
呼び出すと、/testiif「testing $iif: 1 execute(s)」と出力されます。mIRC は、どちらも事前評価しないため、VB
よりも$iifC のように動作します。?:IIf()
IIF()dBaseおよびxBase (1992 以前)
の関数です。
iif()は、 Oxygeneのコンパイラマジック関数でもあります。これは実際の関数ではなく、コンパイル時に条件文に展開されます。
var someString := iif ( someInt > 35 , 'Large' , 'Small' ) ;
この例では、「someString」という名前の新しい強力な型の文字列が作成され (型推論を使用)、iif関数はブール式の結果に応じてそれを埋めます。
SQL Server 2012 以降では、IIF() 関数 ( Transact-SQL ) が実装されています。
DECLARE @ a int = 45 ; DECLARE @ b int = 40 ; SELECT IIF ( @ a > @ b , 'TRUE' , 'FALSE' ) AS Result ;
C(およびその派生言語)およびPerlの IIf は?: 条件演算子です。
printf ( "数値%dは%sは偶数です" , num , num % 2 ? " ではありません" : "" );
Pythonの IIf :
パリティ = n % 2の場合は「奇数」 、それ以外の場合は「偶数」
パリティ: どちらかが 奇数か? n [ '奇数][ '偶数]
参考文献
- ^ 「IIf() (Immediate If) 関数の使用方法」 2004-06-08 . 2007-05-09に閲覧。
- ^ Paul Vick (2006-12-29). 「IIF、真の三項演算子と後方互換性」。2007-02-01に閲覧。
外部リンク
- IIf の MSDN ドキュメント
