1

概要

この質問は、if ステートメントの条件部分で変数を定義することに関連していますか? .

では、なぜ同じ場所で新しく定義された変数の値を確認できないのでしょうか?


簡単な例

言い換えれば、これは許可されています(リンクされた質問から):

if( int* x = new int( 20 ) ) 
{   
    std::cout << *x << "!\n";
    delete x;
}   

しかし、これはそうではありません:

if( NULL != ( int* x = new int( 20 ) ) )
{   
    std::cout << *x << "!\n";
    delete x;
}   

2番目のものは私に与えます:

test.cpp:xx: error: expected primary-expression before ‘int’
test.cpp:xx: error: expected ‘)’ before ‘int’

質問

そして (おそらく) ここでより重要な質問 - 最初の条件はどのようにif評価されるのですか? 私のテストによると、両方のオプションが同じことを行うようです - false( 0NULL、何でも) に対する暗黙のチェックがあります。しかし、それは標準で保証されていますか?


実際の例

OK、新しい変数をカスタム値と比較することはできませんが、比較することはできfalseます。templateしたがって、ここに実際の例を示します。メソッドを含むクラスがあります: check_class。このメソッドはdynamic_cast、内部ポインタを処理します。今、私はそれを次のように使いたいです:

if( some_class* some_class_ptr = cmd->check_class< some_class >() )
{
     // some_class_ptr is NOT NULL here
}
else if( other_class* other_class_ptr = cmd->check_class< other_class > )
{
    // other_class_ptr is NOT NULL here
}
// ...

これが必要な理由は、ifかなり長くなり、その前にすべての変数を宣言したくないからです。

4

3 に答える 3

3

では、なぜ同じ場所で新しく定義された変数の値を確認できないのでしょうか?

構文で許可されていないためです。条件は、宣言またはのいずれかです。式は名前付き変数を宣言できず、宣言は式として使用できません。

評価された最初の if の状態はどうですか?

変数が初期化され、その値が に変換されboolます。が得られる場合、条件は成功しますtrue

しかし、それは標準で保証されていますか?

はい:

C++11 6.4/3 ステートメント以外のステートメントで初期化された宣言である条件のswitch値は、文脈上 に変換された宣言された変数の値ですbool

于 2013-06-03T08:57:12.623 に答える
3

その理由は言語の文法にあります。簡単に言うと、条件 (および同様の構造体) 内のコードはif、宣言または式のいずれかになります。宣言の場合、宣言されたエンティティを何かと比較する構文はもちろんありません。

式の場合、コード内の他の場所にある他の式と同じです。これを書くことができないのと同じように:

int foo() {
  bar(4 + (int b = 7));
}

同じものを に入れることはできませんif

比較で機能する理由trueは、 内のコードがif宣言の場合、条件が「宣言されたオブジェクトが文脈上 bool に変換されたもの」として評価されるためです。

于 2013-06-03T08:55:53.433 に答える
0

最初の状態はどのようにif評価されますか?

あなたが思うように。以下

if( int* x = new int( 20 ) ) 
{   
    std::cout << *x << "!\n";
    delete x;
}   

と「おおよそ」同等です

{
   int* x = new int( 20 );
   if( x ) 
   {   
       std::cout << *x << "!\n";
       delete x;
   }   
}

テストでif( x )は、式xは暗黙的に に変換されます。これは(または)boolを意味します。if( x != 0 )if( x != NULL )

于 2013-06-03T08:55:27.330 に答える