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
while
和 for
的大括号仅在语句主体包含多个语句时才需要,但通常始终使用它,因为它可以防止引入错误向主体添加语句(参见防御性编程实践)。
例如最近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 */ }
本身就是一个语句。
为了必须阅读代码的人的利益,风格指南可能会要求所有 if
、for
、while
{}
。
因为 while 循环 在你的例子中只有 只有 1 个语句 然后它 不需要 { } 但仍然 正确 。如果 while 循环有 2 个或更多语句,它必须有 { } 否则这个循环将只执行 你的第一个语句。你可以参考这个while loop in C++
我知道 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
while
和 for
的大括号仅在语句主体包含多个语句时才需要,但通常始终使用它,因为它可以防止引入错误向主体添加语句(参见防御性编程实践)。
例如最近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 */ }
本身就是一个语句。
为了必须阅读代码的人的利益,风格指南可能会要求所有 if
、for
、while
{}
。
因为 while 循环 在你的例子中只有 只有 1 个语句 然后它 不需要 { } 但仍然 正确 。如果 while 循环有 2 个或更多语句,它必须有 { } 否则这个循环将只执行 你的第一个语句。你可以参考这个while loop in C++