1

これは C++ のフォローアップであり、'if' 式での変数宣言です。

if( int x = 3 && true && 12 > 11 )
    x = 1;

ルールは(私が知る限り)次のとおりです。

  1. 式ごとに宣言できる変数は 1 つだけです
  2. 変数宣言は式の最初になければなりません
  3. 直接初期化構文ではなく、コピー初期化構文 を使用する必要があります
  4. 宣言を括弧で囲むことはできません

この答えによれば、1と2は理にかなっていますが、3と4の理由はわかりません。他の人はできますか?

4

1 に答える 1

1

C++03 標準では、選択ステートメントを次のように定義しています。

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condituion ) statement
condition:
    expression
    type-specifier-seq attribute-specifieropt declarator = initializer-clause

C++11 では、さらに次の規則が追加されています。

condition:
    type-specifier-seq attribute-specifieropt declarator braced-init-list

一般に、条件の中に入れる宣言は、実際には、後で使用するために名前を付けた条件式の値を保持するだけであることを意味します。つまり、次のコードです。

if (int x = 3 && true && 12 > 11) {
    // x == 1 here...

xとして評価されます: 3 && true && (12 > 11).

質問に戻る:

3) C++11 では、そのような場合に (ブレース初期化子を使用して) 直接初期化を使用できるようになりました。

if (int x { 3 && true && 12 > 11 }) {

4) 次の:if ((int x = 1) && true)は、 の「式または宣言のいずれか」という規則に適合しないため、上記の定義によれば意味がありませんcondition

于 2011-10-21T07:20:44.383 に答える