嵌套默认的while和for循环

时间:2016-02-21 21:20:57

标签: c++ nested-loops

我很好奇在for循环的主体中默认嵌套是什么,而在没有括号的情况下是while循环。

while (condition) //without brackets
if (condition)
else

for (condition) 
if (condition)
else

while (condition)
for (condition)
if (condition
else

我知道,如果没有括号,if循环将会嵌套一个else。 while循环会发生什么?它会是一样的吗?还有,包括一段时间和一个for循环的条件?会不会像

那样
while (condition) {
   for (condition) {
       if (condition)
       else
   } // for
} //while

如果for循环中有另一组if和else会发生什么?

会被忽略吗?
for (condition)
    if (condition)
    else 
if (condition)
else

我应该注意其他任何情况吗?

6 个答案:

答案 0 :(得分:4)

while (condition)适用于下一个声明。通常我们使用复合语句,即用大括号括起来的一行或多行代码:

while (condition)
{
/* code goes here */
}

但声明不一定是复合声明:

while (condition)
    std::cout << "I'm still in the condition.\n";

有时声明可能更复杂:

while (condition)
    if (some_other_condition)
        /* some code here */
    else
       /* some other code here */

并且语句可以是循环语句:

while (condition)
    while (another_condition)
        while (yet_another_condition)
            /* whew, we got here! */

答案 1 :(得分:3)

关键是所有循环都可能遍历控制块,可能是:

  1. 单个控制块(例如语句)或
  2. 通过{...}将多个控制块分组到一个控制块。
  3. 在你的情况下,

    while (condition)
    for (condition)
    if (condition)
    else
    

    if...else形成一个控制块,for也是如此;因此,这与

    完全相同
    while (condition) {
        for (condition) {
            if (condition) {
               ...
            } else {
               ...
            }
        }
    }
    

答案 2 :(得分:1)

在你的所有例子中,都没有一个微妙的混淆点。只有一种方法可以解释其中的任何一种,以便它可以编译。自己尝试一下:在每个代码片段中放置花括号(&#39; {&#39;&amp;&#39;}&#39;)并尝试赋予它2种不同的含义。你不可能做到这一点。

答案 3 :(得分:0)

循环和条件表达式没有特定的嵌套规则。你必须记住,如果你不使用大括号,循环只执行一个语句。

一般来说,总是使用大括号是个好主意。

答案 4 :(得分:0)

两个迭代语句都定义为

while ( condition ) statement
                    ^^^^^^^^^
for ( for-init-statement conditionopt; expressionopt) statement
                                                      ^^^^^^^^^ 

其中语句是包含复合语句或空语句的任何语句。

所以例如在这个结构中

while (condition) //without brackets
if (condition) statement
else statement
语句是if-else语句

if (condition) statement
else statement

您可以将它括在大括号中,使包含单个if-else语句的复合语句

while (condition) //without brackets
{
if (condition) statement
else statement
}

然而效果会相同。

在这个结构中

while (condition)
for (condition)
if (condition) statement
else statement

while循环将for循环作为其语句,而if-else又作为自己的语句。你可以写例如

while (condition)
{
    for (condition)
    {
        if (condition) statement
        else statement
    }
}

但是这两个复合语句只包含一个语句。所以这两个结构是等价的。

答案 5 :(得分:0)

没有歧义;让我们查看实际的语法(C ++11§A.5):

whilefor位于 iteration-statement

  

iteration-statement:
while ( 条件 ) 声明
{{ 1}}   声明 do 表达式 while (
) for-init-statement 条件<子>选择 的;   表达 opt for ( 声明

(每行是一个替代模式,它满足第一行冒号前面的术语;斜体中的单词是对其他语法规则的引用; opt 标记可选术语)

)if / if位于 selection-statement 下:

  

选择陈述:
else 条件 if ( 陈述
{{ 1}} 条件 )   声明 if ( 声明
) 条件 else 声明

现在,您可以看到它们都需要一个,单个,通用的语句”来执行,而没有明确提到大括号;反过来,语句定义为:

  

声明:
标签声明
attribute-specifier-seq opt   表达式语句
attribute-specifier-seq opt   复合语句
attribute-specifier-seq opt    selection-statement
attribute-specifier-seq opt    iteration-statement
attribute-specifier-seq opt    jump-statement
declaration-statement attribute-specifier-seq opt   尝试块

让我们忘记 attribute-specifier-seq opt ;回到家的观点是,语句可以是上面的任何switch ( / ) / while,还有其他一些东西,包括< em>复合语句,即大括号:

  

复合语句:
for statement-seq opt if
   statement-seq:
声明
statement-seq 声明

(这是一种正式的方式,可以说你可以在一个或多个语句中加入大括号内)

现在,凭借这些知识,我们可以通过机械思考解析你的例子:

{
  • }中的内容for (condition) if (condition) doA(); else doB(); if (condition) doC(); else doD(); 后需要语句;让我们试着解析下面的内容:

    • 有一个for; ()要么只想要语句语句,后跟if和另一个语句;让我们看看:

      • if表达式声明
      • else跟随
      • doA()表达式声明

      因此整个else是一个陈述,特别是选择陈述

    好的,我们有完整的语句来提供doB()的循环体,因此if (condition) doA(); else doB();语句已完成;

  • 然后,我们有一个for,其解析如上

    • for表达式声明
    • if-else跟随
    • doC()表达式声明

因此,最终的“支撑”解释是

else