如果(条件)在C++中尝试{...}合法吗?

Dav*_*ian 44 c++ exception try-catch language-lawyer

例如:

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

换句话说,将if -block放在if条件之后是否合法?

Moh*_*ain 77

try块的语法(在C++中是一个语句)是

try compound-statement handler-sequence
Run Code Online (Sandbox Code Playgroud)

语法if是:

attr(optional) if ( condition ) statement_true      
attr(optional) if ( condition ) statement_true else statement_false     
Run Code Online (Sandbox Code Playgroud)

哪里:

statement-true- 任何语句(通常是复合语句),如果条件求值为true则执行
statement-false- 任何语句(通常是复合语句),如果条件求值为false则执行

所以,是的,您的代码是合法代码C++.

statement_true在你的情况下是一个try块.

在合法性方面,它类似于:

if (condition) for(...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是你的代码不是很易读,并且在else添加时可能会成为一些C++陷阱的牺牲品.因此,建议增加明确{...}后,if你的情况.

  • @AngelusMortis如果不是语法,还有什么能决定这段代码是否合法? (46认同)
  • @MohitJain:实际上,C++语言并没有完全由其语法指定.例如`int x; int x;`是一个语法允许的简单示例,但仍然是非法的. (9认同)
  • @AngelusMortis我并没有试图证明你错了.我提出我的观点,向前探讨并理解你对如何使这个答案更具信息性的观点. (6认同)
  • 好吧,他询问它是否合法,这意味着它必须由语法_permitted_,_并且不被其他规则禁止.语法描述了有效C++程序的超集.但当然,很难证明是消极的. (4认同)

son*_*yao 40

将if-block放在if条件之后是否合法?

这是合法的.你的代码与(和写作更好)相同:

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

因此,如果条件是false那么try-catch块将不会被执行.如果这是你所期望的,那很好.

  • 只要我们推广好风格,代码不应该坚持一种或另一种支撑方式吗?或者这是否意味着让每个人都同样不满意?;) (8认同)
  • 如果删除最外面的`{`和`}`括号,那么等价变得非常明显. (4认同)

Lig*_*ica 22

是.一个大括号if是可选的.想象一下你{}周围的人try { .. } catch { .. }.

你可能会感兴趣的是,当你写if/ else if/ 时会发生这种情况else; C++实际上没有else if......所以这个:

if (A) {

}
else if (B) {

}
Run Code Online (Sandbox Code Playgroud)

实际上解析为:

if (A) {

}
else
   if (B) {

   }
Run Code Online (Sandbox Code Playgroud)

这是这样的:

if (A) {

}
else {
   if (B) {

   }
}
Run Code Online (Sandbox Code Playgroud)

  • 闪电袭击:p (2认同)
  • 如果`Whoooa,那么C++实际上没有其他东西 (2认同)

Col*_*mbo 9

它结构良好.尝试块 s为语句 S作为每[stmt.stmt]/1,和语句 s的以下if (…)按照[stmt.select]/1.