0

我记得有一次我看到有人写这样的 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括号内的多行代码是否可以始终视为一行?我不太明白编译器是如何解析和分析这个的。

4

5 回答 5

5

这确实是正确的代码,尽管它可能很容易使读者感到困惑。-statement将if后面的第一个语句视为它的then语句。之间的代码{}通常被认为是块或复合语句,其中包含语句。类似地,该for语句被认为是一个语句,包括循环体,它是跟随它的第一个语句(并且可以再次是一个块)。

于 2013-09-11T17:27:30.110 回答
2

{}定义复合语句或块。

随着控制结构的引入,我们将不得不引入一个新概念:复合语句或块。块是一组语句,与所有 C++ 语句一样,由分号 (;) 分隔,但组合在一个用大括号括起来的块中:{ }:

来自 cplusplus.com:控制结构

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.
    }
于 2013-09-11T17:42:56.450 回答
2

您的第一个案例运行良好,因为if不带括号的语句将下一个语句(for循环)视为其要执行的主体的一部分。for 循环的主体是循环本身的一部分。

如果循环本身没有括号,则只会执行循环的第一条语句。

于 2013-09-11T17:25:54.450 回答
2

它们不是真正的“线条”,而是陈述。例如你的

line 1;
line 2;
line 3;

可以重写为并且将与以下内容一样有效:

line 1; line 2; line 3;

所以编译器并不是真正看行,而是看语句。

语法定义的单个语句被认为是(有些简化):

1) 以分号结尾的简单语句(如上)

或者

2) 作为一个语句块,它是一个或多个括在括号内的简单语句{}

于 2013-09-11T17:32:57.987 回答
0

是的,如果 if 语句后没有括号,则如果条件为真,它将只处理下一行。由于下一行是一个 for 语句,它把它当作一个命令。

于 2013-09-11T17:26:15.350 回答