为什么使用do { } while(condition);时需要在末尾加分号,而while(condition) {}不需要?

13

我一直有一个问题,就是在while结尾处是否要放置分号;或者在do while循环的结尾处不要放置分号;。那么原因是什么呢?

int numItemsToProcess = 3;  
while(numItemsToProcess > 0)  
{  
    // process an item  
    numItemsToProcess--;  
} 

不需要在结尾处加上;,但是

do  
{  
    numItemsToProcess --;
} while (numItemsToProcess > 0);  

是吗?也许原因并不太重要。但是当你知道原因后,就可以记住在哪里放置 ;


6
因为C或C++的语法非常明确定义。 - Basile Starynkevitch
1
有一种情况需要在 } 后面加上 ;,那就是类/结构体/联合体的声明。另一方面,在每个语句后面 必须 加上 ; - borisbn
6
@BasileStarynkevitch说的不算是答案。Joachim Pileborg发表了答案。你只是在发出噪音并阻碍好奇心。“因为规范这样说”这样的回答很糟糕。显然,每个规则都有其原因。 - Ed S.
1
@BasileStarynkevitch ~> 但我认为它不是随机选择的 :) - s4eed
@EdS。遗憾的是,C和C++标准远非合理。标准采用某种语法并没有必然的逻辑解释。或者曾经有一个解释,但你要做编程语言考古学,找到BCPL语言或类似语言的基本原理。 - Lundin
4个回答

16

在所有语句中除了块语句,你需要在末尾加上分号。这就是你在 do while 中在while后面放置它的原因,但不是在 while {...} 块之后放置它的原因。

你还可以用它来终止几乎所有的声明。目前我只能想到两个例外:函数体和C++的 namespace 声明。


12

它们是两个不同的循环结构。只需记住即可。

将它们视为单行语句:

do one_thing while( condition );

do { stuff } while( condition );

以及

while( condition ) one_thing;

while( condition ) { stuff }

这些表达式都需要在末尾加上分号,除了最后一个,大括号在逻辑上表示表达式的结束(可以想象一下 if 语句)。


3
或者 在(condition)执行操作; - James McNellis
哦,谢谢 =)说实话,我从来没有使用过那个结构。我最好更新一下。 - paddy
1
是的。"stuff"只需要是一个语句。它不一定要是复合语句(也称为“块”)。 - James McNellis

0

因为这是一个标准。
请参考ISO C++标准第128页
此外,这是因为while语句在do-while循环内是有效的。

int x = 10;
int y = 10;

do 
 while(x > 0)
  x--;
 while(x = y--);

因为你正在结束语句。
语句可以以块(由花括号分隔)或分号结束。"do this while this" 是一个单独的语句,不能以块结束(因为它以 "while" 结尾),所以它需要像其他语句一样加上分号。


1
其他答案已经解释了标准背后的逻辑。也许你也可以提供自己的看法? - dcow
那不是“ISO C++标准”。那是C++11标准的“最终委员会草案”。该草案与最终的C++11标准文件之间存在许多差异。我认为,最接近最终文件的公开草案是N3337 - James McNellis
我认为它是N3485 - ForeverLearning

0

这背后的原因如下

  1. While循环:While循环的语法如下:

    while (表达式) 
       语句
    

While循环根据提供给它的表达式执行。如果表达式为真,则将执行while {}中编写的语句,否则不执行。您还可以在while (expression);之后标记;,但它只会立即完成while语法,因为;表示语句的结束。通常,while循环检查表达式并执行其中的语句列表。

  • Do While condition:Do while循环的语法如下:

    do
        statement
    while (expression);
    
  • do-while 是一个有趣的循环。它有一个特殊之处,即无论 while 中的 expression 是否为真或假,都会执行跟在 do 后面的语句至少一次。 do while 的流程是先执行跟在 do 后面的语句一次,然后检查 while 条件。如果 while 条件为真,则再次执行跟在 do 后面的语句。在 do ... while (expression); 中为什么要在末尾加上 ; 呢?因为这里的 while 被视为一个语句,其主体在其上方。在 C++ 中,每个语句必须以; 结尾,因此 do while; 结束。


    1
    while 被视为语句”是不正确的。整个 do ... while() 是一个语句。 - user207421

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