while 循环如何在没有代码块的情况下工作,难道它不应该仅适用于花括号吗?

How is while loop working without a block of code, shouldn't it work only for curly braces?

我知道 while 循环的主体部分带有两个花括号 { }。我知道 while 循环是如何工作的。但是当我在看一本关于C++的书时,我发现了这段代码:

#include <iostream>
int main()
{
    int sum = 0, value = 0;
    // read until end-of-file, calculating a running total of all values read
    while (std::cin >> value)
        sum += value;   // equivalent to sum = sum + value
    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

但是没有大括号 { } 并且这些代码的工作方式与:

#include <iostream>
int main()
{
    int sum = 0, value = 0;
    // read until end-of-file, calculating a running total of all values read
    while (std::cin >> value){
        sum += value;   // equivalent to sum = sum + value
    }
    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

那么,当我在 While 循环 中省略花括号 { } 时,它是如何实现的?当它在 while 循环中省略花括号时,它是如何工作的?

省略花括号时,循环只执行while之后的语句。

我的建议是始终使用大括号,因为省略大括号会造成混淆,并导致难以察觉的意外错误。

while的语法如下form简化,查看link了解更多信息):

while ( condition ) statement

因此,我们需要在条件部分后提供一个statement

大括号表示一个compound statement(a.k.a块语句)。它是一组零个或多个语句,编译器将其视为单个语句。

如果不需要复合语句,则使用表达式语句 (a.k.a。单行 ).我们用分号 ; 终止表达式语句,而块语句则用右大括号终止。

在示例中,我们可以使用表达式语句:

while (std::cin >> vInside curly braces wealue)
        sum += value; 

some cases中,需要使用大括号来指定程序中的逻辑流,即使我们只使用表达式语句也是如此。此外,有些人认为每次都定期使用花括号明确表示边界是一种良好做法

omitting the curly braces makes the loop work on the first statement after the loop expression. so in your case, it will loop sum+=value.

This also works with if statements:

if(boolExpression)
    doSomething();
doSomethingNotDependendOnBoolExpr();

It is recommended to keep the curly braces. Or - if your codestyle omits them - keep the indendation intact so it is visible what's inside the loop and what is not.

如果你只写一行代码,完全不需要花括号,那么这两种代码都是对的。

当你只有一个语句时,是否加花括号并不重要。 这也适用于 if, while, for, else, ...

但是当你有多个语句并且你没有放置花括号时,只有第一个语句会在循环中执行。

if whilefor 的大括号仅在语句主体包含多个语句时才需要,但通常始终使用它,因为它可以防止引入错误向主体添加语句(参见防御性编程实践)。

例如最近SSH库中存在这样的漏洞:

if (condition)
   statement1;
   statement2;

statement2本来是有条件才执行的,结果无条件执行了

可能原来只有statement1,后来有人加了statement2忘记加大括号了。并且代码以某种方式通过了审查并投入生产并造成了一些损害。

while 语句在 C++ 14 标准中的定义方式如下

while ( condition ) statement

如您所见,可以使用任何语句。例如像

这样的空语句
 while ( condition );
                    ^
                    |
                   null statement

或像

这样的复合语句(甚至可能不包含任何语句)
while ( condition ) {}

因为空语句和复合语句都是语句,对语句的种类没有限制。同样在 C++(与 C 相对)中,声明也是语句。

您应该考虑的是(C++ 14 标准,6.5 迭代语句)

2 The substatement in an iteration-statement implicitly defines a block scope (3.3) which is entered and exited each time through the loop. If the substatement in an iteration-statement is a single statement and not a compound-statement, it is as if it was rewritten to be a compound-statement containing the original statement. [ Example:

while (--x >= 0)
int i;

可以等价改写为

while (--x >= 0) {
int i;
}

语法是while (condition) statement

{ /* seqence-of-statements */ }本身就是一个语句。

为了必须阅读代码的人的利益,风格指南可能会要求所有 ifforwhile {}

因为 while 循环 在你的例子中只有 只有 1 个语句 然后它 不需要 { } 但仍然 正确 。如果 while 循环有 2 个或更多语句,它必须有 { } 否则这个循环将只执行 你的第一个语句。你可以参考这个while loop in C++