3

Cの「if」ステートメントが式ではない理由は何ですか? 'if' 式の代わりに三項演算子が C に追加されたのはなぜですか?

技術的な理由がありますか、それとも単に歴史的な決定ですか?

編集者: より明確にするために、次のような 'if' 式を想像しました。結果が使用されない場合は、ステートメントのように動作する可能性がありますが、結果が必要な場合は、次のelse分岐が必要です。同じ戻り値の型。

ここで、結果があいまいであることがわかります。実際、これは表現とステートメントの奇妙なハイブリッドであるため、明確な分離が優れています。

4

2 に答える 2

9

C は命令型言語であり、数学ではなくモデリング マシンであり、すべての関数に値があるからです。

if 式には、必須の else 式 (または必須の例外スロー) が必要です。これは、使用した分だけ支払うパフォーマンス指向およびマシン指向のプログラミング言語にはうまく適合しません。


(補足) 標準では、if 式が代入の右側にない場合、else 部分はオプションになると規定できます。ただし、これは C の文法をより複雑にします。

2 番目の制限: 式内では、他の式のみを使用できます。たとえば、次のことはできません。

int i = if (foo) { for (int x=4; x; --x) {}; 42 } else bar;

原則的には可能ですが、それは C の美しいミニマルな文法の一部を奪うことになると思います。単純な式とコード ブロックのルールを拡張する必要があり、解析中により多くのコンテキストを記憶する必要があるなどです。(/サイドノート)


C++ の三項演算子 (注: C++ ) はまさにそれを行います: 式であるため、else-part を要求するか、例外をスローします:

int foo = frob ? bar : throw "crap";

それは基本的に if-else-です。Python は、次の言語に置き換えられた言語の例?:ですif/else

foo = frob if bar else 42

あなたが説明しているのは、実際には 2 つのことです。If ステートメントと if 式です。どちらも C です。どちらも明確な特徴があります。そして、どういうわけか、if ステートメント if 式の両方がではない理由を尋ねます。

于 2013-02-22T13:22:44.117 に答える
0

if は次のように定義されます。

"if" <whitespace> "(" <whitespace> <expression> <whitespace> ")" <whitespace> <statement>

したがって、条件が満たされた場合、ステートメントを受け入れます。それが式の場合、何かを返す必要があるため、一般的なステートメントではなく、他の式しか実行できません。実際、?: は条件式のみを実行できますが、ステートメントは実行できません。

于 2013-02-22T13:24:17.017 に答える