我很好奇在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
我应该注意其他任何情况吗?
答案 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)
关键是所有循环都可能遍历控制块,可能是:
{...}
将多个控制块分组到一个控制块。在你的情况下,
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):
while
和for
位于 iteration-statement
iteration-statement:
while (
条件)
声明
{{ 1}} 声明do
表达式while (
)
for-init-statement 条件<子>选择子> 的; 表达 optfor (
声明
(每行是一个替代模式,它满足第一行冒号前面的术语;斜体中的单词是对其他语法规则的引用; 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 optif
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