標準の非規範的注記は、表現の概念を動機づけるためのものですが、実際の定義ではありません。 式の定義は、5節の残りの部分で与えられる言語文法で与えられます。式は、リテラル、変数名、関数名などの特定の端末から構築されます。演算子および関係演算子。
宣言と式は別個の構文エンティティであるため、C++プログラム内で見つかる宣言は決して式ではなく、の逆もあります。一見すると、違いはかなり分かります。何かを宣言すれば宣言です。
1; // expression statement
int i = 1; // declaration statement that declares `i`
A(i, 42); // expression statement that creates an A object
A a(i); // declaration statement that declares an A object (named a)
宣言は式を評価することができますが、宣言は式ではありません。あなたは、クラス型のオブジェクトの宣言がコンストラクタ呼び出しを引き起こす可能性があることを正しく指摘します。それでも構文的には宣言であり、式ではありません。
しかし、別の意味では、という表現がという表現になります。つまり、式内の評価の順序付けに関する規則も宣言に適用されます。たとえば、int
の後置インクリメントの副作用は、フル・エクスプレッションの終了前のある時点で発生するというルールがあります。そのようなルールの目的のため
f(i++) + g(); // i may be incremented before or after g() is called...
h(); // but definitely before h() is called.
、単一の変数の宣言および初期化は、フル発現であると考えられます。クラス型の変数の場合、コンストラクタ呼び出しはその式の一部です。
int i = 1; // this declaration evaluates a full-expression
// whose effect is to initialize `i` to 1
int j = f(i++) + g(), k = h(); // two separate full-expressions;
// i is incremented before h() is called
標準を読むときには、「表現」の意味を理解するためにコンテキストを考慮する必要があります。
[C++の式と式ステートメントは何ですか?](http:// stackoverflow。com/questions/7479946/whats-an-expression-and-expression-statement-in-c) –
簡単な経験則は、式にはセミコロンがないことです。セミコロンを追加すると、それらをステートメントに変換します。また、式は括弧で囲み、別の式の中で使うことができます。 'x =(int i = 1;)'と書くことはできません。 –
文法をチェックして、ここから抜粋しました:https://github.com/o11c/chintzy/blob/master-py/chintzy/_std/cxx14.py#L559 – o11c