为啥 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 语法,因为; 表示语句结束。一般while 循环检查表达式并执行里面的语句列表。

    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) 不需要? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 nodejs 中的睡眠不能按预期工作

为啥在 Javascript 中不鼓励在 while 语句中赋值?

javascript基础-02

VueJS Conditional Props and CSS:如何在一行文本的末尾有条件地显示 svg?

php学习笔记-do while循环

机器视觉 while算子