web-dev-qa-db-ja.com

if(条件)は、C ++で{...}を有効にしようとしていますか?

例えば:

if (true) try
{
    // works as expected with both true and false, but is it legal?
}
catch (...)
{
    // ...
}

言い換えれば、try-block if条件の直後を置くことは合法ですか?

44
Davit Tevanian

tryブロック(C++では statement )の構文は次のとおりです。

try compound-statement handler-sequence

ifの構文は次のとおりです。

attr(optional) if ( condition ) statement_true      
attr(optional) if ( condition ) statement_true else statement_false     

どこ:

statement-true-条件がtrueと評価された場合に実行される任意のステートメント(多くの場合、複合ステートメント)
statement-false-条件がfalseと評価された場合に実行される任意のステートメント(多くの場合、複合ステートメント)

はい、あなたのコードはC++の正当なコードです。

statement_trueは、tryブロックです。

合法的には、次のようになります。

if (condition) for(...) {
    ...
}

しかし、コードは非常に読みにくく、elseが追加されたときにC++の落とし穴の犠牲になる可能性があります。したがって、明示的に{...}ifの後に追加することをお勧めします。

77
Mohit Jain

if条件の直後にtryブロックを置くことは合法ですか?

合法です。あなたのコードは次と同じです(そして書く方が良いです):

if (true) {
    try
    {
        // works as expected with both true and false, but is it legal?
    }
    catch (...)
    {
        // ...
    }
}

したがって、条件がfalseの場合、try-catchブロックは実行されません。これがあなたが期待するものであれば、それは大丈夫です。

40
songyuanyao

はい。 ifの中括弧はオプションです。 {}の周りにtry { .. } catch { .. }があると想像してください。

if/else if/else;を記述すると、これが起こることを知っておくと興味深いかもしれません。 C++には実際にはelse ifがありません...…

if (A) {

}
else if (B) {

}

実際にこれとして解析されます:

if (A) {

}
else
   if (B) {

   }

これは:

if (A) {

}
else {
   if (B) {

   }
}

整形式です。 try-blocksはstatements [ stmt.stmt]/1 、およびstatementsは、 [stmt.select]に従ってif (…)の後に続きます/ 1

9
Columbo