[解決済み] 式と文の比較
質問
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はすべて構文的な文を持たない言語であり、式しか持たない。 クラス構造化されたループや条件式も式とみなされ、値を持つが、あまり面白い値ではない。
関連
-
[解決済み] O(N log N)の複雑さ - 線形に似ている?
-
[解決済み] Mac OS X で DYLD_LIBRARY_PATH を使ってもいいのでしょうか?また、それを使った動的ライブラリ検索アルゴリズムはどうなっていますか?
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] 引数とパラメータの違いは何ですか?
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] 関数は return 文を1つだけ持つべきですか?
-
[解決済み] Pythonの "with "文は何のために作られたのですか?
-
[解決済み】ビットシフト(bit-shift)演算子とは、どのようなもので、どのように機能するのですか?
-
[解決済み】ループや関数をサポートする言語で「goto」の正当な使用例はあるのか?
-
[解決済み] スタックオーバーフローを引き起こす最短のコードは何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン