表現と文の違い 質問する

表現と文の違い 質問する

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

表現の適切な定義とその違いを知っている人はいますか?

ベストアンサー1

式:値を評価するもの。例: 1+2/x
ステートメント:何かを実行するコード行。例: GOTO 100

FORTRAN のような初期の汎用プログラミング言語では、その区別は極めて明確でした。FORTRAN では、ステートメントは実行の 1 つの単位、つまり実行する 1 つのことです。ステートメントが「行」と呼ばれなかった唯一の理由は、ステートメントが複数の行にまたがることがあったためです。式だけでは何もできず、変数に割り当てる必要がありました。

1 + 2 / X

これは FORTRAN ではエラーです。何もしないからです。この式で何かを行う必要があります。

X = 1 + 2 / X

FORTRAN には、今日知られているような文法はありませんでした。その概念は、バッカス・ナウア記法 (BNF) とともに、Algol-60 の定義の一部として発明されました。その時点で、意味の区別 (「値を持つ」と「何かを行う」) は構文に定められていました。つまり、1 種類のフレーズは式であり、もう 1 種類のフレーズはステートメントであり、パーサーはそれらを区別できました。

後の言語の設計者は、その区別を曖昧にしました。つまり、構文式で何かを行うことを許可し、値を持つ構文ステートメントを許可したのです。現在も残っている最も初期の人気言語の例は C です。C の設計者は、式を評価して結果を捨てることができても害はないことに気付きました。C では、すべての構文式は、末尾にセミコロンを追加するだけでステートメントにすることができます。

1 + 2 / x;

は、まったく何も起こらないにもかかわらず、完全に正当なステートメントです。同様に、C では、式に副作用があり何かが変わる可能性があります。

1 + 2 / callfunc(12);

callfunc何か役に立つかもしれないから。

あらゆる式を文​​として認めるのであれば、式の中に代入演算子(=)を認めるのも同じです。そのため、Cでは次のようなことができます。

callfunc(x = 2);

これは式 x = 2 を評価し(2 の値を x に割り当て)、その値(2)を関数に渡しますcallfunc

この式と文のあいまいさは、すべてのC派生言語(C、C++、C#、Java)で発生しています。これらの言語には、まだ文( などwhile)が残っていますが、ほとんどすべての式を文として使用できます(C#では、代入、呼び出し、増分、および減分式のみが文として使用できます。スコット・ウィズニエフスキーの回答)。

2つの「構文カテゴリ」(文や式などの専門用語)があると、作業が重複する可能性があります。たとえば、Cには2つの条件文形式があります。文形式は

if (E) S1; else S2;

そして表現形式

E ? E1 : E2

また、存在しない重複が求められることもあります。たとえば、標準 C では、ステートメントのみが新しいローカル変数を宣言できますが、この機能は非常に便利なので、GNU C コンパイラは、式でもローカル変数を宣言できるようにする GNU 拡張機能を提供しています。

他の言語の設計者はこのような重複を好まず、式が値だけでなく副作用も持つ場合、文と式の構文上の区別はそれほど役に立たないことに早くから気付き、その区別をなくしました。Haskell、Icon、Lisp、ML はすべて構文上の文を持たない言語で、式しかありません。クラス構造のループや条件付きフォームも式と見なされ、値を持ちますが、あまり興味深いものではありません。

おすすめ記事