Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;如果;不带花括号的块将生成后续的;否则,如果;嵌套_C++_C_If Statement_Nested If - Fatal编程技术网

C++ &引用;如果;不带花括号的块将生成后续的;否则,如果;嵌套

C++ &引用;如果;不带花括号的块将生成后续的;否则,如果;嵌套,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”块提供大括号,那么在它里面只考虑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 << "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
{

cout
else
语句总是附加到最近的
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”,它的下一行一直是“如果有的话”,它后面的行是同一语句的一部分,这是重要的,行计数不属于这个,就像你自己指出的,缩进也没有。