为啥 while(condition);末尾需要分号,但 while(condition) 不需要? [关闭]
Posted
技术标签:
【中文标题】为啥 while(condition);末尾需要分号,但 while(condition) 不需要? [关闭]【英文标题】:Why do while(condition); needs semicolon at the end of it but while(condition) doesn't? [closed]为什么 while(condition);末尾需要分号,但 while(condition) 不需要? [关闭] 【发布时间】:2013-02-05 01:32:17 【问题描述】:将;
放在while
的末尾或不将它放在do while
循环的末尾总是有问题。那么是什么原因呢?为什么
int numItemsToProcess = 3;
while(numItemsToProcess > 0)
// process an item
numItemsToProcess--;
最后不需要;
,但是
do
numItemsToProcess --;
while (numItemsToProcess > 0);
有吗?
也许原因不是太重要。但是当你知道原因时,你会记得把;
放在哪里。
【问题讨论】:
因为C或C++的语法是这么定义的。 有一种情况需要在
之后放置;
- 它是类/结构/联合声明。另一方面,您必须在每个语句之后放置;
@BasileStarynkevitch:这不是答案。 Joachim Pileborg 发布了答案。你的只是噪音,阻碍了好奇心。 “因为规范这么说herp derp”答案很糟糕。显然,每条规则都有一个原因。
@BasileStarynkevitch ~> 但我认为它不是随机选择的 :)
@EdS。可悲的是,C 和 C++ 标准远远不够理性。为什么标准采用某种语法不一定有一个合乎逻辑的解释。或者也许曾经有一个,但你必须做编程语言考古并找到 BCPL 语言或类似语言的基本原理。
【参考方案1】:
除了块语句之外,你在所有语句之后都加了分号。这就是你将它放在do while
中的while
之后而不是while ...
中的块之后的原因。
您还可以使用它来终止几乎所有的声明。目前我能想到的唯一例外是函数体,以及 C++ 中的 namespace
体。
【讨论】:
【参考方案2】:它们是两种不同的循环结构。你只需要记住。
将它们视为单行:
do one_thing while( condition );
do stuff while( condition );
和
while( condition ) one_thing;
while( condition ) stuff
这些表达式的末尾都需要分号,除了最后一个,大括号在逻辑上表示表达式的结尾(想想if
语句)。
【讨论】:
或do stuff while(condition);
哦,谢谢 =) 老实说,我从来没有使用过这种结构。我最好更新一下。
是的。 “东西”只需要是一个声明。它不一定需要是复合语句(也称为“块”)。【参考方案3】:
因为这是一个标准。 参考The ISO C++ standard第128页 还有 这是因为 while 语句在 do-while 循环中是有效的。
int x = 10;
int y = 10;
do
while(x > 0)
x--;
while(x = y--);
因为您要结束语句。 语句以块(由花括号分隔)结束, 或用分号。 “do this while this”是一条语句,不能以块结尾(因为它以“while”结尾), 所以它需要一个分号,就像任何其他语句一样。
【讨论】:
其他答案解释了标准背后的逻辑。也许你也可以提供你的看法? 这不是“ISO C++ 标准”。那就是 C++11 标准的Final Committee Draft。该草案与最终的 C++11 标准文档之间存在许多差异。我相信最接近最终文件的公开草稿是N3337。 我认为是N3485【参考方案4】:这背后的原因如下
While 条件:- While 条件具有类似的签名
while (expression)
statement
While 循环根据提供给它的表达式执行。如果表达式为真,那么写在 while 中的语句将执行,否则不执行。您也可以在while (expression);
之后标记;
,但它只会立即完成while
语法,因为;
表示语句结束。一般whil
e 循环检查表达式并执行里面的语句列表。
Do While 条件:- Do while 有类似的签名
do
statement
while (expression);
do-while
是一个有趣的循环。不管while
中的expression
是真还是假,do
后面的语句都会执行至少一个。 do while
的流程表示do
后面的语句将执行一次,然后检查while
条件。如果while
条件为真,则将再次执行do
之后的语句。之所以在do ... while (expression);
的末尾有;
是因为这里while
被视为一个语句,因为它的主体在它之上。在 C++ 中,每条语句都必须以 ; 结尾,所以 do while
以 ;
结尾。
【讨论】:
'while
被视为语句'不正确。整个do ... while ()
是一个声明。以上是关于为啥 while(condition);末尾需要分号,但 while(condition) 不需要? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Javascript 中不鼓励在 while 语句中赋值?