Подтвердить что ты не робот

Является ли (условие) попыткой {...} законным в С++?

Например:

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

Другими словами, правильно ли положить try-блок сразу после условия if?

4b9b3361

Ответ 1

Синтаксис блока try (который является 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. Таким образом, желательно добавить явный {...} после if в вашем случае.

Ответ 2

Можно ли поставить блок try сразу после условия if?

Это законно, ваш код такой же, как (и лучше писать как):

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

Итак, если условие false, то блок try-catch не будет выполнен. Если это то, что вы ожидаете, это прекрасно.

Ответ 3

Да. Скобки if являются необязательными. Представьте, что у вас есть {} вокруг try { .. } catch { .. }.

Вам может быть интересно узнать, что это происходит, когда вы пишете if/else if/else; На С++ фактически нет else if & hellip; так что:

if (A) {

}
else if (B) {

}

фактически анализируется следующим образом:

if (A) {

}
else
   if (B) {

   }

что и есть:

if (A) {

}
else {
   if (B) {

   }
}

Ответ 4

Он хорошо сформировался. try-blocks - это утверждения в соответствии с [stmt.stmt]/1, а операторы следуют if (…) согласно [stmt.select]/1.