没有大括号的for循环语法是什么?

8
for (int y = 0; y < GameBoard.GameBoardHeight; y++)
        for (int x = 0; x < GameBoard.GameBoardWidth; x++)
        {
            if (GetSquare(x, y) == "Empty")
            {
                 RandomPiece(x, y);
            }
        }

第一个for循环没有大括号,而下一行甚至不是一个带有分号的语句。它只是一个for循环。
这是怎么回事?

如果我们只需要执行一行代码,那么这是可以做到的。 - Hiren Soni
6个回答

9
MSDN:for循环会重复执行一个语句或一段语句,直到指定的表达式评估为false。
重点是“执行一个语句或一段语句”的部分。你示例中的嵌套for循环是一个语句,因为有{ }成对出现,从而包含了一段语句。
因此,如果每次嵌套操作仅作为单个语句编写,则应编写如下内容:
for (int y = 0; y < GameBoard.GameBoardHeight; y++)
    for (int x = 0; x < GameBoard.GameBoardWidth; x++)
        if (GetSquare(x, y) == "Empty")
            RandomPiece(x, y);

或者作为每个嵌套操作的块语句:
for (int y = 0; y < GameBoard.GameBoardHeight; y++)
{
    for (int x = 0; x < GameBoard.GameBoardWidth; x++)
    {
        if (GetSquare(x, y) == "Empty")
        {
            RandomPiece(x, y);
        }
    }
}

4
没有大括号的for循环体只是下一条语句。在这种情况下,第二个for循环是第一个for循环体的语句。
C# 4.0规范中的语法(第8节和8.8.3节)如下:
for-statement:
    for ( for-initializer; for-condition; for-iterator) embedded-statement

embedded-statement:
    block
    empty-statement
    expression-statement
    selection-statement
    iteration-statement
    jump-statement
    try-statement
    checked-statement
    unchecked-statement
    lock-statement
    using-statement 
    yield-statement

因此,for循环的主体被定义为一个embedded-statement。当您在循环体周围看到大括号时,这是block,它是embedded-statement的第一选择。将另一个for循环作为embedded-statement是适用于iteration-statement(第8.8节)的选项之一。


3

第一个for循环的下一条语句是第二个for循环,所以即使您的语法像这样编写,您的程序也可以正常运行:

for (int y = 0; y < GameBoard.GameBoardHeight; y++)
        for (int x = 0; x < GameBoard.GameBoardWidth; x++)        
            if (GetSquare(x, y) == "Empty")            
                 RandomPiece(x, y);

3

把需要迭代的语句放在花括号中。如果循环中只有一条语句,则可以省略花括号。

无论if、for或while语句体中只包含单个语句,始终应使用开放和关闭括号。

括号可以改善代码的一致性和可读性。更重要的是,当向仅包含单个语句的语句体中插入附加语句时,很容易忘记添加花括号,因为缩进会给出强烈(但误导的)结构指导。

for(int i = 0; i < 10; ++i) { Console.WriteLine(i) }

注意:在循环结束后,如果没有使用大括号,那么只有紧跟在for循环语句后面的第一条语句才会被循环执行。

更多信息请参见:http://www.dotnetperls.com/omit-curly-brackets


2

for循环体可以包含没有大括号的语句(例如循环、条件语句)。


2

for循环也是一种语句。所以它是合法的C#代码。控制流构造(至少从C继承来的那些)可以有单个语句或多个语句的块:

for (...) statement
for (...) { statement* }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接