我记得有一次我看到有人写这样的C ++代码:
if (something is true)
for (int i = 0; i < max; i++) {
//do something
line 1;
line 2;
line 3;
....
....
}
else
....
它的工作原理与以下代码相同:
if (something is true) { //note the bracket here
for (int i = 0; i < max; i++) {
//do something
line 1;
line 2;
line 3;
....
....
}
}
else
....
我想知道编译器是否将for
循环块视为嵌套在if
子句中的一行?括号内的多行代码是否总是被视为一行?我不太明白编译器如何解析和分析它。
答案 0 :(得分:5)
这确实是正确的代码,虽然它可能很容易混淆读者。 if
- 语句将第一个以下语句视为then
语句。 {}
之间的代码通常被视为块或复合语句,包含其中的语句。类似地,for
语句被认为是一个语句,包括循环体,它是跟随它的第一个语句(并且可以再次是一个块)。
答案 1 :(得分:2)
你的第一个案例运行正常,因为没有括号的if
语句将下一个语句(for
循环)视为要执行的主体的一部分。 for循环的主体是循环本身的一部分。
如果循环本身没有括号,那么只会执行循环的第一个语句。
答案 2 :(得分:2)
它们不是真正的“线条”,而是陈述。比如你的
line 1;
line 2;
line 3;
可以改写为和以下一样有效:
line 1; line 2; line 3;
因此,编译器并不是真正关注行而是查看语句。
语法定义的单个语句被认为(稍微简化):
1)一个简单的语句以分号结尾(如上所述)
OR
2)作为一个语句块,它是括号{}
中的一个或多个简单语句。
答案 3 :(得分:2)
{}
定义了compound statement或阻止。
随着控制结构的引入,我们将不得不这样做 引入一个新概念:复合语句或块。一个街区是一个 由所有C ++分隔的分号(;)分隔的语句组 语句,但在括在大括号中的块中组合在一起:{}:
来自cplusplus.com:Control Structures
if
控制结构定义如下:
if (condition) statement
statement
可以定义为单个指令/语句,或compound statement
。无论哪种方式,它都是下一个要执行的陈述。
for (;;) statement
是一种特殊类型的控制结构,称为迭代结构。
因此,
//The control structure is going to apply to the next statement
if (condition)
for (;;) //This for loop is the next statement. It applies to the next statement.
{
//The next statement is a compound statement.
}
答案 4 :(得分:0)
如果if语句后面没有括号,如果条件为真,它将只处理下一行。由于下一行是for语句,因此将其视为一个命令。