在C++中,if (condition) try {...} 这样的语法是否合法?

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

换句话说,把try语句块放在if条件语句之后是合法的吗?


是的,这是非法的。try块应该在if语句内部。但为什么不使用try测试条件呢? - franklin
58
不,这不是违法的。 - Columbo
5
没错,这不是违法的。在 C 和 C++ 中,真正子句的括号是可选的;而且如果()后面跟着的是真正子句,那么就会被认为是一个条件语句,一个在try-clause之后的catch-clause就与该try-clause相关联了。但是许多公司的样式指南仍然会抨击您不使用括号。 - Blair Houghton
3
int main() try {} catch(...){} 也是合法的。 - nwp
合法,但应缩进,因为try和catch都受if条件限制。 - edc65
显示剩余3条评论
4个回答

77
一个 try 块的语法(在 C++ 中是一个语句)为:
try compound-statement handler-sequence

“if”的语法如下:
attr(optional) if ( condition ) statement_true      
attr(optional) if ( condition ) statement_true else statement_false     

在哪里:
statement-true - 任何语句(通常是复合语句),如果条件求值为真则执行
statement-false - 任何语句(通常是复合语句),如果条件求值为假则执行
所以,是的,你的代码是合法的C++代码。
在你的情况下,statement_true 是一个 try 块。
在法律上,它类似于:
if (condition) for(...) {
    ...
}

但是,您的代码不太易读,并且在添加 else 时可能会受到一些 C++ 陷阱的影响。因此,在您的情况下,建议在 if 后面添加明确的 {…}。

46
如果不是语法,还有什么能决定一段代码是否合法呢? - Mohit Jain
6
@AngelusMortis,我并不是试图证明你错了。我只是提出了自己的观点,以期讨论并了解你对如何使这个答案更具信息性的看法。 - Mohit Jain
9
实际上,C++语言并非完全由其语法规范确定。例如,int x; int x;是语法允许但实际上是不合法的简单例子。 - MSalters
4
他问是否合法,这意味着它必须被语法所允许,并且没有被其他规则禁止。语法描述了有效的C++程序集的超集。但当然要证明一个否定是困难的。 - MSalters
1
@MohitJain:我认为你从标准中引用的内容,然后声称“在你的情况下,statement_true是一个try块”,缺乏证据,因为引用并没有说明try块是否是statement_true。它只是说if块可以根据statement_true来定义,但它并没有定义statement_true是什么,对吧?从这个意义上讲,你从标准中引用的内容对于你的声明来说是毫无意义和不相关的,因为你没有将标准中所有必要的文本连接起来支持你的声明。 - Nawaz
显示剩余10条评论

40

把try块放在if条件语句之后是否合法?

是合法的。您的代码与以下代码相同(并且更好地编写为):

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

所以如果条件为false,那么try-catch块将不会被执行。如果这是您预期的结果,那就没问题。


4
如果您删去最外层的 {} 大括号,等式的等价性就会变得显而易见。 - Leo Heinsaar
1
我同意。只是去掉大括号后,很明显原问题中的 if 语句与之前完全相同,不计空格。没有大括号,你的格式化显示表明在 if 语句之后紧接着放置一个 try-catch 块并没有什么“神奇”的地方。 - Leo Heinsaar
8
只要我们在推广良好的编程风格,代码难道不应该坚持一种大括号风格吗?或者这是为了让每个人都感到同样的不满意?;) (注:原文中“;)”表示嘻嘻一笑的表情符号) - user2005819
我不确定我同意这是更好或更易读的。这更传统,当然,但 ops 的方式更像一个英语句子,而这读起来像代码。也许是苹果和橙子,但在我看来同样可读,同样正确。这就像带有单个短语句的块。我赞成将该语句放在同一行并摆脱大括号。如果都在同一行,你必须是盲人才不会意识到如果想要添加一些内容到块中,需要添加大括号,而且我相信大多数 IDE 会为您插入大括号(不过不要引用我)。 - Kraiden

22

是的,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) {

   }
}

2
闪电打击 :p - Angelus Mortis
2
C++ 实际上没有 else if。哇塞! - Derek 朕會功夫
@Derek朕會功夫,某些語言中可能會有明確的elseif標記,但在這裡並沒有。else if結構中的if部分是一個全新的語句,這導致了一些有趣的代碼誤解,因為它無法被識別為一個整體。 - Corey
1
@Corey 是的,这就是我的答案所说的。 - Lightness Races in Orbit
@BarryTheHatchet 这就是为什么我选择评论而不是回答的原因 :) - Corey

9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接