web-dev-qa-db-fra.com

Si (condition) essayez {...} légal en C ++?

Par exemple:

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

En d'autres termes, est-il légal de mettre le try-block juste après la condition if?

44
Davit Tevanian

La syntaxe d'un bloc try (qui est un instruction en C++) est

try compound-statement handler-sequence

Et la syntaxe de if est:

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

où:

statement-true - toute instruction (souvent une instruction composée), qui est exécutée si la condition est évaluée à true
statement-false - toute instruction (souvent une instruction composée), qui est exécutée si la condition est fausse

Alors oui, votre code est un code légal dans C++.

statement_true dans votre cas est un bloc try.

En termes de légalité, il est similaire à:

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

Mais votre code n'est pas très lisible et peut être victime de certains pièges C++ lorsqu'un else est ajouté. Il est donc conseillé d'ajouter explicitement {...} après if dans votre cas.

77
Mohit Jain

est-il légal de placer le bloc d'essai juste après la condition if?

C'est légal. Votre code est identique à (et mieux à écrire comme):

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

Donc, si la condition est false alors la try-catch le bloc ne sera pas exécuté. Si c'est ce que vous attendez, ça va.

40
songyuanyao

Oui. Les accolades d'un if sont facultatives. Imaginez que vous avez {} autour du try { .. } catch { .. }.

Il peut vous intéresser de savoir que c'est ce qui se passe lorsque vous écrivez if/else if/else; C++ n'a pas réellement else if … donc ça:

if (A) {

}
else if (B) {

}

est en fait analysé comme ceci:

if (A) {

}
else
   if (B) {

   }

c'est ça:

if (A) {

}
else {
   if (B) {

   }
}
22

C'est bien formé. try-block s sont instruction s selon [ stmt.stmt]/1 et les instructions s suivent if (…) selon [stmt.select ]/1 .

9
Columbo