2016-07-04 13 views
5

言語の標準は言う:C++の「宣言と初期化」文は式ですか?

[注:第5条には、構文を定義評価の順序、および表現をexpressions.58の意味 が計算を指定する演算子と オペランドのシーケンスです。式は の値になり、副作用を引き起こす可能性があります。 - 終了ノート]

たとえば、私は以下のコードを持っています:

int i=1; 
A obj; 

したがって、上記の両方のステートメントを "式"としてカウントしますか?

stackoverflowの一部の人が「int i = 1;」と言っています。式ではありません。これは私にとって非常に奇妙です。

(1)初期化は「計算」の一種ですが、そうですか?だから、それは "表現"とみなされるべきですか?

(2)obj; // ctorを呼び出します。 ctorは一種の計算なので、 "式"と見なすべきですか?

+0

[C++の式と式ステートメントは何ですか?](http:// stackoverflow。com/questions/7479946/whats-an-expression-and-expression-statement-in-c) –

+0

簡単な経験則は、式にはセミコロンがないことです。セミコロンを追加すると、それらをステートメントに変換します。また、式は括弧で囲み、別の式の中で使うことができます。 'x =(int i = 1;)'と書くことはできません。 –

+0

文法をチェックして、ここから抜粋しました:https://github.com/o11c/chintzy/blob/master-py/chintzy/_std/cxx14.py#L559 – o11c

答えて

6

標準の非規範的注記は、表現の概念を動機づけるためのものですが、実際の定義ではありません。 の定義は、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 

標準を読むときには、「表現」の意味を理解するためにコンテキストを考慮する必要があります。

+0

宣言は式ではありません。いくつかの "完全な式"は式ではありません。標準では、完全表現を意味するたびに「完全表現」を使用する必要があります。 –

+0

実際には、A(i);は宣言です。 –

+0

@VaughnCato私の悪い、修正されます。 – Brian

関連する問題