条件文(コンピュータプログラミング)
コンピュータ サイエンスにおいて、条件文(つまり、条件文、条件式、条件構造) は、条件と呼ばれるブール式の値に応じて異なる計算やアクションを実行したり、異なる値を返したりするプログラミング言語構造です。
条件文は通常、選択的に命令を実行することによって実装されます。動的ディスパッチは通常、条件文として分類されませんが、実行時に選択肢を選択する別の方法です。
用語
条件文は副作用のために実行される命令型構造ですが、条件式は値を返します。多くのプログラミング言語 (C など) には、明確な条件文と条件式があります。純粋な関数型プログラミングでは、条件式には副作用はありませんが、条件式を持つ多くの言語 (Lisp など) は、条件付きの副作用をサポートしています。
もし~ならば(~そうでなければ)
if–then
or構文if–then–else
は多くのプログラミング言語で使用されています。構文は言語によって異なりますが、基本構造 (疑似コード形式) は次のようになります。
If (ブール条件) Then (結果的に) それ以外 (代替) 終了条件
例えば:
在庫=0の場合 メッセージ=新商品を注文する それ以外 メッセージ=在庫あり 終了条件
上記のコード例では、(ブール条件)で表された部分は条件式 を構成し、本質的な価値True
(たとえば、値またはのいずれかで置き換えられるFalse
) を持ちますが、本質的な意味はありません。対照的に、この式If
とThen
それを囲む および 、およびその後に続く の組み合わせは条件文を構成し、本質的な意味 (たとえば、一貫した論理規則を表現する) を持ちますが、本質的な価値はありません。
インタープリタがを見つけるとIf
、ブール条件(たとえば、x > 0
変数 x には 0 より大きい数値が含まれている)を想定し、その条件を評価します。条件が の場合true
、 に続く文がthen
実行されます。それ以外の場合、実行は、else
ブロック(通常はオプション)内の次の分岐、または分岐がない場合はelse
の後の分岐のいずれかで続行されますend If
。
どちらかの分岐が実行された後、制御はの後のポイントに戻りますend If
。
歴史と発展
初期のプログラミング言語、特に1980 年代の家庭用コンピュータでのBASICの一部の方言では、文には文 (分岐命令に相当)しか含めることができませんでした。このため、読みにくいプログラミング スタイルであるスパゲッティ プログラミングが生まれ、このスタイルのプログラムはスパゲッティ コードと呼ばれていました。その結果、文内の文ブロックに (事実上) 任意の文を置くことができる構造化プログラミングが普及し、ほとんどの BASIC プログラミング界でも標準となりました。このようなメカニズムと原則は、より古いがより高度なALGOLファミリーの言語に基づいており、 PascalやModula-2などの ALGOL 系言語は、長年にわたり現代の BASIC バリアントに影響を与えてきました。文内の文のみを使用して、スパゲッティ コードではなく、構造化プログラミング言語で記述されたプログラムと同様に構造化され読みやすいプログラムを作成することは可能ですが、構造化プログラミングではこれがより容易になり、強制されます。上記の例のような構造化ステートメントは、構造化プログラミングの重要な要素の 1 つであり、 C、Java、JavaScript、Visual Basicなどのほとんどの一般的な高水準プログラミング言語に存在します。
if–then
GOTO
if
GOTO
if–then
if–then–else
「ぶら下がりelse」問題
キーワードは、その前のelse
特定のステートメントをターゲットにするように作成されていますが、ネストされたステートメントの場合、 ALGOL 60などの従来のプログラミング言語では、どの特定のステートメントをターゲットにするかを定義するのに苦労しました。どのステートメントがどのステートメントであるかの明確な境界がなければ、キーワードは、解析時にネスト内の先行する任意のステートメントをターゲットにする可能性があります。
if–then
if–then
else
if–then
もしaならば bならばs、そうでなければs2
次のように解析できる
もしaならば(もしbならばs)そうでなければs2
または
もしaならば(もしbならばs、そうでなければs2)
else
は、 が最初のif
と 2 番目ののどちらに関連付けられているかによって異なりますif
。これは、ぶら下がり else問題として知られており、言語に応じてさまざまな方法で解決されます (通常はend if
文または{...}
括弧を使用)。
それ以外の場合
を使用するとelse if
、複数の条件を組み合わせることができます。真であると判明した最初の条件に続くステートメントのみが実行されます。他のすべてのステートメントはスキップされます。
if条件then -- ステートメント elseif条件then -- その他のステートメント elseif条件then -- その他のステートメント; ... else -- その他のステートメント。end if ;
たとえば、ある商品に最大 30% の割引を提供するショップの場合:
割引が11%未満の場合 印刷(30ドルを支払う必要があります) そうでなければ割引<21% 印刷(20ドルを支払う必要があります) それ以外の場合、割引<31% 印刷(10ドルを支払う必要があります) 終了の場合;
上記の例では、割引が 10% の場合、最初の if ステートメントは true と評価され、「30 ドルを支払う必要があります」が出力されます。最初の if ステートメントの下にある他のすべてのステートメントはスキップされます。
たとえば、Adaelseif
言語の 文は、単に の構文糖衣にfollowed byを加えたものです。Ada での違いは、 の代わりにを使用すれば、必要なのは 1 つだけであるということです。PHPは、中括弧またはコロン構文にキーワードboth [1]を使用します。Perlは、複数のand文に必要な多数の中括弧を回避するためにキーワード を提供します。Pythonでは、構造は中括弧ではなくインデントによって示されるため、 and を繰り返し使用すると、条件ごとにインデントを増やす必要があるため、特別なキーワードが使用されます。Visual Basic などの BASIC の実装の一部[ 2] でも が使用されます。同様に、初期の UNIX シェル (後に POSIX シェル構文[3]にまとめられました) も elif を使用しますが、区切り方法としてスペース、改行、またはその両方を選択できます。
else
if
end if
elseif
else
if
elseif
elsif
if
else
elif
else
if
ElseIf
ただし、 Simula、Pascal、 BCPL 、Cなど、 Algol から直接派生した多くの言語では、このelse if
構造の特別な構文は存在せず、Java、ECMAScriptなど、 C の多くの構文派生語にも存在しません。これが機能するのは、これらの言語では、任意の単一のステートメント (この場合は...) をブロックで囲むことなく条件文に続けることができる
ためです。if cond
この設計選択には、わずかな「コスト」が伴います。各ブランチは、実質的にネスト レベルを追加します。これにより、コンパイラ (またはコンパイラを作成する人) の作業が複雑になります。コンパイラは、任意の長さのチェーンを再帰的に
else if
分析して実装する必要があるためです。else if
条件文のシーケンス内のすべての項が単一の式の値をテストする場合 (例: if x=0
... else if x=1
... else if x=2
...)、代替手段としてswitch 文(case 文または select 文とも呼ばれる) を使用できます。逆に、switch 文がない言語では、一連のelse if
文によってこれらを作成できます。
If-then-else 式
多くの言語は、if 文に似ていますが、結果として値を返すif 式をサポートしています。したがって、これらは true 式 (値に評価される) であり、文 (値のコンテキストでは許可されない場合があります) ではありません。
アルゴル家
ALGOL 60およびALGOLファミリーの他のメンバーでは、if–then–else
次の式が許可されます。
myvariable := x > 20 の場合は 1、それ以外の場合は 2
Lisp方言
Lispの方言にはScheme、Racket、Common Lisp が あり、そのうち最初のものは ALGOL に大きく影響を受けています。
;; Scheme
( define myvariable ( if ( > x 12 ) 1 2 )) ; 'x'の値に応じて、'myvariable'に1または2を割り当てます
;; Common Lisp
( let (( x 10 )) ( setq myvariable ( if ( > x 12 ) 2 4 ))) ; 'myvariable'を2に代入する
ハスケル
Haskell 98ではif式のみが存在し、if文はなく、else
すべての式は何らかの値を持たなければならないため、この部分は必須です。[4]他の言語では条件文で表現されるロジックは、再帰関数では通常パターンマッチングで表現されます。
Haskellは遅延評価なので、 ifなどの制御構造を通常の式として記述することができます。遅延評価とは、if関数が条件と適切な分岐のみを評価できることを意味します(厳密な言語では3つすべてを評価するでしょう)。これは次のように記述できます。[5]
if' :: Bool -> a -> a -> a if' True x _ = x if' False _ y = y
C系言語
Cおよび C 系言語には、次のようなテンプレートで記述できる関数を持つ条件式用の 特殊な三項演算子( ? :) があります。
condition ? evaluated-when-true : evaluated-when-false
つまり、C のような言語では、if 文とは異なり、式にインライン化できます。
my_variable = x > 10 ? "foo" : "bar" ; // C言語のような言語の場合
これは、Algol ファミリーの if-then-else式(ステートメントとは対照的) に似ています (Ruby や Scala などでも同様です)。
if ステートメントを使用して同じことを実現するには、(一般的なレイアウト規則では) 複数のコード行が必要になり、「my_variable」を 2 回記述する必要があります。
if ( x > 10 ) my_variable = "foo" ; else my_variable = "bar" ;
明示的なif/then文の方が読みやすく、三項演算子よりも効率的なコードにコンパイルできると主張する人もいます[6]。一方、簡潔な表現の方が、繰り返しを含む複数行にわたる文よりも読みやすいと主張する人もいます。
x = TextWindow.ReadNumber () If ( x > 10 ) Then TextWindow.WriteLine ( "変数の名前は「foo」です。" ) Else TextWindow.WriteLine ( "変数の名前は「bar」です。" ) EndIf
まず、ユーザーがプログラムを実行すると、カーソルが表示され、読者が数字を入力するのを待ちます。その数字が 10 より大きい場合は、「変数の名前は 'foo' です。」というテキストが画面に表示されます。数字が 10 より小さい場合は、「変数の名前は 'bar' です。」というメッセージが画面に表示されます。
ビジュアルベーシック
Visual Basicおよび他のいくつかの言語では、条件式として使用できる という関数IIf
が提供されています。ただし、true と false の両方の分岐が常に評価されるため、これは true 条件式のようには動作しません。どちらか一方の結果が破棄され、もう一方の結果が IIf 関数によって返されるだけです。
Tcl
Tcl では はif
キーワードではなく関数です(Tclではコマンドまたは と呼ばれますproc
)。例えば
if { $x > 10 } { puts "Foo!" }
という名前の関数を呼び出しif
、2 つの引数を渡します。最初の引数は条件で、2 番目の引数は true ブランチです。両方の引数は文字列として渡されます (Tcl では中括弧内のすべてが文字列です)。
上記の例では、関数を呼び出す前に条件が評価されません。代わりに、関数の実装はif
条件を文字列値として受け取り、この文字列を呼び出し元のスコープ内の式として評価する責任があります。[7]
このような動作は、uplevel
およびexpr
コマンドを使用することで可能になります。
- Uplevelを使用すると、新しい制御構造をTclプロシージャとして実装することができます(たとえば、uplevelを使用してwhile構造をTclプロシージャとして実装することができます)。[8]
は実際には関数なのでif
、値も返します。
- コマンドからの戻り値は実行された本体スクリプトの結果、または式のいずれもゼロ以外で本体Nがない場合は空の文字列になります。[9]
さび
Rustでは、if
は常に式です。 は、実行されるブランチの値に評価されます。()
ブランチが実行されない場合は、ユニット型に評価されます。 ブランチが戻り値を提供しない場合は、()
デフォルトで に評価されます。if
式の型がコンパイル時にわかっていることを保証するには、各ブランチが同じ型の値に評価される必要があります。 このため、のない は常にデフォルトでに評価されるため、else
他のブランチが に評価されない限り、ブランチは事実上必須です。 [10]()
if
else
()
// x の値に応じて、my_variable に何らかの値を割り当てます。let
my_variable = if x > 20 { 1 } else { 2 } ;
// このバリアントは 1 と () の型が異なるためコンパイルされません。let
my_variable = if x > 20 { 1 } ;
// 必要ない場合は値を省略できます
if x > 20 { println! ( "x is greater than 20" ); }
ガード条件文
Edsger Dijkstraのガード付きコマンド言語( GCL)は、ブール値のガード(条件に対応) とそれに対応するステートメントで構成されるコマンドのリストとして条件付き実行をサポートします。GCL では、ガードが true であるステートメントのうち 1 つだけが評価されますが、どのステートメントが評価されるかは任意です。このコードでは、
G0 → S0の場合 □ G1 → S1 ... □ グン → スン フィ
G iはガードであり、 S iはステートメントです。ガードがどれも真でない場合、プログラムの動作は未定義です。
GCL は主にプログラムの推論を目的としていますが、同様の表記法がConcurrent Pascalやoccamでも実装されています。
算術if
Fortran 77まで、Fortran言語には、引数eがe < 0、e = 0、e > 0のいずれであるかに応じて3つのラベルのいずれかにジャンプする算術if文がありました。これはFortranで最も古い条件文でした。[11]
構文
IF ( e )ラベル1 、ラベル2 、ラベル3
ここで、e は任意の数値式です (必ずしも整数である必要はありません)。
セマンティクス
これは、 e が1 回だけ評価される このシーケンスと同等です。
IF ( e.LT.0 ) GOTOラベル1 IF ( e.EQ.0 ) GOTOラベル2 IF ( e.GT.0 ) GOTOラベル3
文体論
算術if は非構造化制御文であり、構造化プログラミングでは使用されません。
IF
実際には、ほとんどの算術ステートメントは、1 つまたは 2 つのラベルを持つ次のステートメントを参照すること
が確認されています。
これは、 IBM 704コンピュータ上の Fortran のオリジナル実装における唯一の条件付き制御ステートメントでした。そのコンピュータでは、テストおよび分岐オペコードには、これら 3 つの状態に対応する 3 つのアドレスがありました。他のコンピュータでは、最後の算術演算に関連付けられた正、ゼロ、負、偶数、オーバーフロー、キャリーなどの「フラグ」レジスタがあり、「アキュムレータが負の場合に分岐」、次に「アキュムレータがゼロの場合に分岐」などの命令を使用します。式は1 回だけ評価され、整数演算などオーバーフローが発生する可能性がある場合には、オーバーフロー フラグまたはキャリー フラグも考慮されることに注意してください。
Smalltalk でのオブジェクト指向実装
他の言語とは対照的に、Smalltalkでは条件文は言語構造ではなく、クラス内でBoolean
2つのパラメータ(両方ともクロージャ)を取る抽象メソッドとして定義されています。Boolean
には2つのサブクラス(True
とFalse
)があり、どちらもメソッドを定義し、True
最初のクロージャのみを実行し、False
2番目のクロージャのみを実行します。[12]
var = 条件
ifTrue: [ 'foo' ]
ifFalse: [ 'bar' ]
JavaScript
JavaScript は、C言語と同様の if-else ステートメントを使用します。ブール値は、予約済みのifキーワードと左中括弧の間の括弧内で受け入れられます。
if ( Math . random () < 0.5 ) { console . log ( "表が出ました!" ); } else { console . log ( "裏が出ました!" ); }
上記の例では、0 から 1 の間のランダムな浮動小数点値が 0.5 より大きい場合にMath.random() < 0.5
出力する条件文を使用しています。この文では、これを使用して、コンソールに出力するか、またはに出力するかをランダムに選択します。以下に示すように、else 文と else-if 文は、前の文の中括弧の後に、必要な回数だけ連鎖させることもできます。
true
You got Heads!
You got Tails!
var x = Math.random (); if (x < 1/3) { console.log ( " 1人が勝ちました!" ) ; } else if (x < 2/3) { console.log ( " 2人が勝ちました! " ) ; } else { console.log ( " 3人が同点です! " ) ; }
ラムダ計算
ラムダ計算では、if-then-else 条件の概念は次の式を使用して表現できます。
真 = λx. λy. x 偽 = λx. λy. y もしそうでなければ = (λc. λx. λy. (cxy))
- true は最大 2 つの引数を取り、両方が指定されると (カリー化を参照)、指定された最初の引数を返します。
- false は最大 2 つの引数を取り、両方が指定されると (カリー化を参照)、指定された 2 番目の引数を返します。
- ifThenElse は最大 3 つの引数を取り、すべての引数が提供されると、2 番目と 3 番目の引数の両方を最初の引数に渡します (これは、2 つの引数を指定して結果を生成する関数です)。ifThenElse は引数として true または false のみを取るものと想定されます。どちらも、指定された 2 つの引数を優先する単一の引数に投影し、その引数を返します。
注: ifThenElse に左条件と右条件として 2 つの関数が渡される場合、実際に選択した関数を呼び出すには、ifThenElse の結果に空のタプル () も渡す必要があります。そうしないと、ifThenElse は呼び出されずに関数オブジェクトを返すだけです。
定義なしで数値を使用できるシステム (Lisp、従来の紙の数学など) では、上記は次のような単一のクロージャとして表現できます。
(( λtrue. λfalse. λifThenElse. ( ifThenElse true 2 3 ) )( λx. λy. x )( λx. λy. y )( λc. λl. λr. c l r ))
ここで、true、false、ifThenElse はそれぞれの定義にバインドされ、ブロックの最後にスコープに渡されます。
これに対する実用的な JavaScript の類似性 (厳密さのために単一変数の関数のみを使用) は次のとおりです。
var computingResult = (( _true => _false => _ifThenElse => _ifThenElse ( _true )( 2 )( 3 ) )( x => y => x )( x => y => y )( c => x => y => c ( x )( y )));
上記の多変数関数を使用したコードは次のようになります。
var computingResult = (( _true , _false , _ifThenElse ) => _ifThenElse ( _true , 2 , 3 ) )(( x , y ) => x , ( x , y ) => y , ( c , x , y ) => c ( x , y ));
数値を想定するシステムを使用しない前述の例の別のバージョンを以下に示します。
最初の例では最初の分岐が実行されていることを示しており、2 番目の例では 2 番目の分岐が実行されていることを示しています。
(( λtrue. λfalse. λifThenElse. ( ifThenElse true ( λFirstBranch. FirstBranch ) ( λSecondBranch. SecondBranch )) )( λx. λy. x )( λx. λy. y )( λc. λl. λr. c l r ))
(( λtrue. λfalse. λifThenElse. ( ifThenElse false ( λFirstBranch. FirstBranch ) ( λSecondBranch. SecondBranch )) )( λx. λy. x )( λx. λy. y )( λc. λl. λr. c l r ))
Smalltalk は、真偽の表現に同様の考え方を採用しており、True と False は、ifTrue/ifFalse メッセージに異なる応答をするシングルトン オブジェクトです。
Haskell はブール型にまさにこのモデルを使用していましたが、執筆時点では、ほとんどの Haskell プログラムが構文糖衣「if a then b else c」構造を使用しており、これは ifThenElse とは異なり、別の関数にラップするか、このページの Haskell セクションに示されているように再実装しない限り構成されません。
case 文と switch 文
スイッチ文(一部の言語ではケース文または多方向分岐) は、特定の値を指定された定数と比較し、最初に一致した定数に従ってアクションを実行します。通常、一致が見つからない場合に実行されるデフォルトのアクション ('else'、'otherwise') が用意されています。スイッチ文を使用すると、ルックアップ テーブルなどのコンパイラ最適化が可能になります。動的言語では、ケースは定数式に限定されず、パターン マッチングにまで拡張されることがあります。右側のシェル スクリプトの例では、'*)' がデフォルトのケースを任意の文字列に一致する正規表現として実装しています。
パスカル: | C : | シェルスクリプト: |
---|---|---|
case someChar of 'a' : actionOnA ; 'x' : actionOnX ; 'y' , 'z' : actionOnYandZ ; else actionOnNoMatch ; end ;
|
switch ( someChar ) { case 'a' : actionOnA ; break ; case 'x' : actionOnX ; break ; case 'y' : case 'z' : actionOnYandZ ; break ; default : actionOnNoMatch ; }
|
case $someChar in a ) actionOnA ; ;; x ) actionOnX ; ;; [ yz ] ) actionOnYandZ ; ;; * ) actionOnNoMatch ;; esac
|
パターンマッチング
パターン マッチングは、 if-then-elseおよびcaseステートメントの両方の代替として考えることができます。これは、Wolfram Language、MLなど、関数型プログラミング機能を備えた多くのプログラミング言語で利用できます。以下は、 OCaml言語で記述された簡単な例です。
フルーツを次の ものと
一致させます| 「リンゴ」 -> パイを焼く | 「ココナッツ」->団子餅を焼く| 「バナナ」->混ぜる;;
パターン マッチングの威力は、アクションだけでなく値もデータのパターンに簡潔に一致させることができることです。以下は、これらの両方の機能を示す Haskellで記述された例です。
マップ_ [] = []マップf ( h : t ) = f h :マップf t
このコードは関数mapを定義します。この関数は、最初の引数 (関数) を 2 番目の引数 (リスト) の各要素に適用し、結果のリストを返します。2 行は、この場合に考えられる 2 種類の引数 (リストが空の場合 (空のリストを返すだけ) と、リストが空でない場合) に対する関数の 2 つの定義です。
パターン マッチングは厳密に言えば常に選択構造であるわけではありません。Haskell では、常に一致することが保証される選択肢を 1 つだけ記述できるためです。この状況では、パターン マッチングは選択構造として使用されているのではなく、単に名前を値にバインドする方法として使用されています。ただし、パターン マッチングが利用可能な言語では、パターン マッチングは選択構造として頻繁に使用されます。
ハッシュベースの条件文
Python、Perl、PHP、Objective-Cなど、連想配列やそれに匹敵するデータ構造を持つプログラミング言語では、条件付き代入を実装するためにそれらを使用するのが慣用的です。[13]
pet = input ( "名前を付けたいペットの種類を入力してください: " )
known_pets = {
"Dog" : "Fido" ,
"Cat" : "Meowsles" ,
"Bird" : "Tweety" ,
}
my_name = known_pets [ pet ]
匿名関数を持つ言語、またはプログラマが名前付き関数を変数参照に割り当てることができる言語では、ハッシュをディスパッチ テーブルとして使用することで条件付きフローを実装できます。
予測
条件分岐命令の代替手段は、プレディケーションです。 プレディケーションは、制御フローを変更する代わりに、命令を条件付きで実行できるようにするアーキテクチャ機能です。
選択システム相互参照
この表は、各言語の最新の言語仕様を参照しています。仕様がない言語については、公式にリリースされた最新の実装を参照しています。
プログラミング言語 | 構造化されている場合 | スイッチ–選択–ケース | 算術if | パターンマッチング[A] | ||
---|---|---|---|---|---|---|
それから | それ以外 | そうでなければ | ||||
エイダ | はい | はい | はい | はい | いいえ | いいえ |
オーストラリア | いいえ | はい | はい | はい | いいえ | いいえ |
Bashシェル | はい | はい | はい | はい | いいえ | はい |
C、C++ | いいえ | はい | 不要[B] [C] | フォールスルー | いいえ | いいえ |
C# | いいえ | はい | 不要[B] [C] | はい | いいえ | いいえ |
コボル | 不要 | はい | 不要[C] | はい | いいえ | いいえ |
エッフェル | はい | はい | はい | はい | いいえ | いいえ |
ファ# | はい | はい | はい | 不要[D] | いいえ | はい |
フォートラン90 | はい | はい | はい | はい | はい[G] | いいえ |
行く | いいえ | はい | 不要[C] | はい | いいえ | いいえ |
ハスケル | はい | 必要 | 不要[C] | はい、でも不要です[D] | いいえ | はい |
ジャワ | いいえ | はい | 不要[C] | フォールスルー[14] | いいえ | いいえ |
ECMAScript ( JavaScript ) について | いいえ | はい | 不要[C] | フォールスルー[15] | いいえ | いいえ |
マセマティカ | いいえ | はい | はい | はい | いいえ | はい |
オベロン | はい | はい | はい | はい | いいえ | いいえ |
パール | いいえ | はい | はい | はい | いいえ | いいえ |
PHP の | いいえ | はい | はい | フォールスルー | いいえ | いいえ |
Pascal、Object Pascal ( Delphi ) | はい | はい | 不要 | はい | いいえ | いいえ |
パイソン | いいえ | はい | はい | いいえ | いいえ | はい |
クイックベーシック | はい | はい | はい | はい | いいえ | いいえ |
ルビー | はい | はい | はい | はい | いいえ | はい[H] |
さび | いいえ | はい | はい | 不要 | いいえ | はい |
スカラ | いいえ | はい | 不要[C] | フォールスルー[要出典] | いいえ | はい |
構文 | はい[F] | はい | はい | はい[F] | いいえ | いいえ |
迅速 | いいえ | はい | はい | はい | いいえ | はい |
Tcl | いいえ | はい | はい | はい | いいえ | はい |
Visual Basic、クラシック | はい | はい | はい | はい | いいえ | いいえ |
ビジュアルベーシック | はい | はい | はい | はい | いいえ | いいえ |
Windows PowerShell | いいえ | はい | はい | フォールスルー | いいえ | いいえ |
- ^これは、正規表現のサポート などの単なる文字列パターン マッチングのサポートとは対照的に、プログラミング言語における明確な条件付き構造としてのパターン マッチングを指します。
- 1 2 #ELIF ディレクティブは、コンパイル前にコードを変更したり、他のファイルをインクルードしたりするために使用されるプリプロセッササブ言語で使用されます。
- 1 2 3 4 5 6 C ファミリーの言語、および COBOL と Haskell でよく見られる は、言語機能ではなく、特定のソース コード レイアウトと組み合わされた、ネストされた独立したif then elseステートメントのセットです。ただし、これは、これらの言語では明確な else-if 構造が実際には必要ないことを意味します。
else if
- 1 2 Haskell と F# では、同じタスクをパターン マッチングで実行できるため、個別の定数選択構造は必要ありません。
- ^ Ruby
case
構造では、正規表現マッチングは条件付きフロー制御の選択肢の 1 つです。例については、この Stack Overflow の質問を参照してください。 - 1 2 SQL には、両方の役割を果たす 2 つの類似した構造があり、どちらもSQL-92で導入されました。「検索された」式はのように機能し、「単純な」式はswitch ステートメントのように機能します。詳細と例については、「Case (SQL)」を参照してください。
CASE
CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END
if ... else if ... else
CASE
CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END
- ^
if
Fortran 90 では 算術演算は廃止されています。 - ^ パターンマッチングはRuby 3.0で追加されました。[16]一部のパターンマッチング構造はまだ実験段階です。
参照
- 分野(コンピュータサイエンス)
- 条件付きコンパイル
- 実行の選択を行う別の方法としての動的ディスパッチ
- 歴史と歴史的参照のためのマッカーシー形式主義
- 名前付き条件
- 関係演算子
- テスト (Unix)
- ヨーダの条件
- 条件付き移動
参考文献
- ^ PHP elseif 構文
- ^ Visual Basic ElseIf 構文
- ^ POSIX標準シェル構文
- ^ Haskell 98 言語とライブラリ: 改訂版レポート
- ^ 「HaskellWiki における If-then-else 提案」
- ^ 「効率的な C のヒント #6 – 三項演算子は使用しないでください « Stack Overflow」。Embeddedgurus.com。2009 年 2 月 18 日。2012年 9 月 7 日閲覧。
- ^ 「新しい制御構造」。Tclerのwiki 。2020年8月21日閲覧。
- ^ 「uplevel マニュアルページ」 www.tcl.tk . 2020 年8 月 21 日閲覧。
- ^ 「if マニュアルページ」 www.tcl.tk . 2020 年8 月 21 日閲覧。
- ^ 「if および if let 式」 。2020年11 月 1 日閲覧。
- ^ 「American National Standard Programming Language FORTRAN」 1978-04-03. 2007-10-11時点のオリジナルよりアーカイブ。2007-09-09閲覧。
- ^ 「VisualWorks: Conditional Processing」 2006-12-16. 2007-10-22 時点のオリジナルよりアーカイブ。2007-09-09に取得。
- ^ 「Python で switch/case 文を実装する方法」。2015 年 1 月 20 日時点のオリジナルよりアーカイブ。2015 年 1 月 19 日閲覧。
- ^ Java.sun.com、Java 言語仕様、第 3 版。
- ^ Ecma-international.org Archived 2015-04-12 at the Wayback Machine ECMAScript 言語仕様、第 5 版。
- ^ 「パターンマッチング」。Ruby 3.0 のドキュメント。