1. ホーム
  2. language-agnostic

[解決済み] 式と文の比較

2022-03-20 22:15:48

質問

C#について質問していますが、他の言語でも同じだと思います。

の良い定義をお持ちの方はいらっしゃいますか? ステートメント また、その違いは何でしょうか?

どのように解決するのですか?

式になります。 ある値に対して評価されるもの。例 1+2/x
ステートメント 何かをするコードの行。例 GOTO 100

FORTRANのような初期の汎用プログラミング言語では、この区別は極めて明瞭だった。FORTRANでは、文は実行の1単位であり、あなたが行うことであった。文が行と呼ばれない唯一の理由は、それが複数の行にまたがることがあったからである。式はそれ自体では何もできない...変数に代入する必要があった。

1 + 2 / X

はFORTRANではエラーになる。なぜなら何もしないからだ。その式で何かをしなければならないのです。

X = 1 + 2 / X

FORTRANは、今日私たちが知っているような文法を持っていなかった。その考えは、Backus-Naur Form(BNF)と共に、Algol-60の定義の一部として発明されたものであった。 その時点では セマンティック この区別(「値を持つ」と「何かをする」の違い)は シンタックス ある種のフレーズは「式」であり、別のフレーズは「文」であり、パーサーはそれらを区別することができるのです。

後の言語の設計者はこの区別を曖昧にしました。構文式に何かをさせることも、構文文に値を持たせることも許したのです。 C言語の設計者は、式を評価してその結果を捨てても害はないことに気づいたのです。C言語では、すべての構文式は、最後にセミコロンを付けるだけで文にすることができる。

1 + 2 / x;

は、まったく何も起こらないにもかかわらず、完全に正当な文です。 同じように、C言語では、式に 副作用 -何かを変えることができる。

1 + 2 / callfunc(12);

なぜなら callfunc は何か役に立つことをするかもしれません。

どんな式でも文にできるようにしたら、式の中で代入演算子(=)を使えるようにしてもいいかもしれません。だから、C言語では次のようなことができる。

callfunc(x = 2);

これは、x = 2 という式を評価し(x に 2 という値を代入し)、その値(2)を関数 callfunc .

このような式と文の曖昧さは、すべてのC言語派生言語(C、C++、C#、Java)でも発生し、いくつかの文(例えば while しかし、ほとんどすべての式を文として使用することができます(C#では、代入、呼び出し、インクリメント、デクリメント式のみが文として使用することができます。 Scott Wisniewskiの回答 ).

2つの構文カテゴリ(ステートメントと表現の技術的な名称)を持つことは、努力の重複を招く可能性があります。 例えば、C言語には2種類の条件式があります。

if (E) S1; else S2;

という表現形式と

E ? E1 : E2

そして時々、人々は 欲しい 例えば、標準的なC言語では、新しいローカル変数を宣言できるのは文だけですが、この機能はとても便利なので GNU Cコンパイラは、式でもローカル変数を宣言できるようにするGNU拡張機能を提供しています。

他の言語の設計者はこのような重複を好まず、式が値だけでなく副作用も持てるなら 構文 ステートメントと式の区別はあまり意味がないので、廃止されました。 Haskell、Icon、Lisp、MLはすべて構文的な文を持たない言語であり、式しか持たない。 クラス構造化されたループや条件式も式とみなされ、値を持つが、あまり面白い値ではない。