C++ &引用;如果;不带花括号的块将生成后续的;否则,如果;嵌套
好的,如果没有为“if”块提供大括号,那么在它里面只考虑1条语句。e、 gC++ &引用;如果;不带花括号的块将生成后续的;否则,如果;嵌套,c++,c,if-statement,nested-if,C++,C,If Statement,Nested If,好的,如果没有为“if”块提供大括号,那么在它里面只考虑1条语句。e、 g if(..) statement_1; statement_2; 无论选项卡如何,只有语句_1在if块内被考虑 以下代码与此不符: int main () { if(false) // outer - if if(false) // nested - if cout << "false false\n"; else if(true) cout <<
if(..)
statement_1;
statement_2;
无论选项卡如何,只有语句_1
在if
块内被考虑
以下代码与此不符:
int main ()
{
if(false) // outer - if
if(false) // nested - if
cout << "false false\n";
else if(true)
cout << "true\n";
}
int main()
{
if(false)//外部-if
if(false)//嵌套的-if
cout行为实际上并没有什么不同,它是完全一致的:整个内部if
块——包括else if
——被视为一个块
这是解析中的经典歧义,称为:当语法写在正常的BNF中时,有两种有效的解析方法:
尾随的else
要么是外部块的一部分,要么是内部块的一部分
大多数语言通过(任意)决定解析器贪婪地匹配块来解决歧义,即else
[if
]被分配给最接近的if
它不应该打印任何内容。这与此等效,因为第二个if/else if是属于第一个if的一个块:
if(false) {
if(false) // nested - if
cout << "false false\n";
else if(true)
cout << "true\n";
}
if(false){
if(false)//嵌套的-if
cout因为else
实际上是与内部if
分组的,而不是外部的。它实际上被解析为
int main ()
{
if(false) // outer - if (never gets executed)
{
if(false) // nested - if
{
cout << "false false\n";
} else if(true) {
cout << "true\n";
}
}
}
int main()
{
if(false)//外部-if(从不执行)
{
if(false)//嵌套的-if
{
coutelse
语句总是附加到最近的if
上。如果没有嵌套的分支if
本身就不会形成有意义的语句,所以解析器继续运行。从C解析器的角度来看,这是很自然的
解析器在解析if语句时,首先解析条件表达式,然后解析条件之后的第一条语句,然后查找else关键字,如果else出现,则解析第二条(可选)语句
但是,第一条语句也是if语句,因此解析器递归地调用“if解析器”(在测试else关键字之前!)。此递归调用完全解析内部if-else语句(包括else),并将标记位置移到整个代码片段的“末尾”之外
任何实现替代行为的尝试都应该涉及“外部”和“内部”if解析器之间的额外通信:外部解析器应该通知“内部”不要贪婪(即不要吃else语句)。这会增加语言语法的额外复杂性。正确,现在的问题是。。why@iammilind为什么?“为什么”if(…)else
是一条语句。仅此而已。外部的if
后面是一条语句,该语句仅在else
内部的if
处结束。这与正则表达式相同-将a/b/c
与(.*)/(.*)匹配
,组1应该是a
,组2应该是b/c
,还是组1应该是a/b
,组2应该是c
?这是后者,因为正则表达式是“贪婪的”,c解析器也是如此。@glglglglgl FYI插入了“因为。。。“只是在Iamilind的评论之后。起初我只是说它是等效的,因为我认为这是显而易见的,但正如你从投票中看到的,它需要进一步澄清:)链接和最后的“贪婪”行说明了一切。这是一段时间以来我见过的最快的+10!“大多数语言”?你知道另一种语言吗(好吧,除了强制括号或结尾语法,它们是避免使用delse的方法,而不是解决歧义的方法)?否则意味着您必须检查还有多少个等待处理(例如,在if-else中,它将与第二个if匹配,而在if-else中,它将与第一个if匹配)@AProgrammer我不知道任何其他语言,我只是想掩饰一下。我确信至少有一些实验性语言的做法有所不同,因为.python使用缩进来解决这个问题(这是一种“结束语法”?:)我不明白为什么这是一个问题,因为我在C++中的时间我从来没想到过这个奇怪的地方。嵌套的“if”,它的下一行一直是“如果有的话”,它后面的行是同一语句的一部分,这是重要的,行计数不属于这个,就像你自己指出的,缩进也没有。