do while 循环中的 continue 语句

Posted

技术标签:

【中文标题】do while 循环中的 continue 语句【英文标题】:continue statement in a do while loop 【发布时间】:2020-09-29 13:03:04 【问题描述】:
#include <stdlib.h>
#include <stdio.h> 
enum false, true; 
    
int main() 
 
   int i = 1; 
   do
    
      printf("%d\n", i); 
      i++; 
      if (i < 15) 
        continue; 
    while (false); 
      
   getchar(); 
   return 0; 
 

在这段代码中执行continue 语句后会发生什么?

控件去哪了?

【问题讨论】:

@FredLarson continue 将被执行,因为2 &lt; 15 为真。 那个(有效的)结构很容易通过执行程序来检查。 如果你想使用falsetrue(和bool),你可以#include &lt;stdbool.h&gt; 【参考方案1】:

下一个语句将是while (false);,它结束了do-while 循环,因此之后它执行getchar();

一般:

do

    ...
    statements
    ...

    continue;   // Act as "GOTO continue_label"

    ...
    statements
    ...

continue_label:
 while (...);

如果你想尝试一下,你可以使用这个代码:

int i = 0;
do

    printf("After do\n");
    ++i;
    if (i < 2) 
    
        printf("Before continue\n");
        continue;
    
    printf("Before while\n");
 while(printf("Inside while\n") && i < 2);

输出+cmets解释:

After do              // Start first loop
Before continue       // Execute continue, consequently "Before while" is not printed
Inside while          // Execute while
After do              // Start second loop
Before while          // Just before the while (i.e. continue not called in this loop)
Inside while          // Execute while

【讨论】:

【参考方案2】:

ISO/IEC 9899:2011, 6.8.6.2 继续声明

[...]

(2) continue 语句导致跳转到循环继续 最小的封闭迭代语句的一部分;也就是说,对 循环体的结尾。更准确地说,在每个陈述中

while (/* ... */) 
/* ... */
continue;
/* ... */
contin: ;


do 
/* ... */
continue;
/* ... */
contin: ;
 while (/* ... */);

for (/* ... */) 
/* ... */
continue;
/* ... */
contin: ;

[...] 相当于goto contin;

在这段代码中执行 continue 语句后会发生什么?控件去哪儿了?

到循环结束,即代码中的while ( false ),将退出循环。

【讨论】:

【参考方案3】:

来自here:

continue 语句将控制权传递给 最近的封闭 do, for, while statement 它出现在其中, 绕过doforwhile 语句中的任何剩余语句 身体

因为其中最接近的是while(false) 语句,所以执行流程继续到该语句,并退出循环。

即使continuewhile(false) 之间还有其他语句也是如此,例如:

int main() 
 
   int i = 1; 
   do
    
      printf("%d\n", i); 
      i++; 
      if (i < 15) 
        continue;          // forces execution flow to while(false)
      printf("i >= 15\n"); // will never be executed
    while (false); 
   ...  

这里的continue; 语句意味着它后面的printf 语句将永远不会被执行,因为执行流程会继续到最近的循环结构之一。同样,在这种情况下while(false)

【讨论】:

【参考方案4】:

当您使用 continue 语句时,循环内的其他语句将被跳过并且控制转到下一个迭代,在您的情况下是“条件检查”(在 for 循环的情况下,它转到第三个for 循环的语句,其中通常对变量进行递增/递减)。由于条件为“假”,迭代停止。

【讨论】:

以上是关于do while 循环中的 continue 语句的主要内容,如果未能解决你的问题,请参考以下文章

C语言基础:循环结构(循环类型(while,do...while,for,嵌套循环),循环控制语句(break,continue,goto),无线循环(死循环))

[转帖]shell 循环语句for/do/done和while/do/done以及break,continue

shell-跳出循环break和continue

Java中的结构语句

Java基础第4天+switch语句for,while,do...while循环语句break,return,continue控制跳转语句

break和continue的区别