继续声明

问题描述 投票:0回答:2

continue 语句用于跳过迭代,但它并没有像我预期的那样工作。这是我的代码:

int i = 0;
do
{
  if(i== 10)continue;
  printf("\n This is = %d",i);
  
  i++;
} while (i<20);

我的理解是它会跳过

这是 = 10

休息它会打印,但从那时起它就跳过了

这是 = 9 到 19

这是输出

 This is = 0
 This is = 1
 This is = 2
 This is = 3
 This is = 4
 This is = 5
 This is = 6
 This is = 7
 This is = 8

为什么?

另外,当我在这个循环之前添加 for 循环时,它完全被忽略并且没有被执行?

int i = 0;
do
{
  if(i== 10)continue;
  printf("\n This is = %d",i);
  
  i++;
} while (i<20);

for(int a = 0 ; a<20 ; a++)
{
    if(a==10)continue;
    printf("\nHere = %d",a);
}

输出:

 This is = 0
 This is = 1
 This is = 2
 This is = 3
 This is = 4
 This is = 5
 This is = 6
 This is = 7
 This is = 8

为什么?请解释一下。

c infinite-loop do-while continue
2个回答
2
投票

这里发生了一些事情。首先,

printf
格式字符串以换行符开头,但不以换行符结尾。这与通常所做的相反。但由于每个打印的字符串都不以换行符结尾,因此它很可能会被缓冲到下一个换行符为止。所以事实上,它正在打印
" This is = 9"
,但实际上直到下一个换行符才出现,而下一个换行符永远不会出现。

下一个换行符永远不会到来的原因是,一旦

i
10
,它就会进入无限循环。每次执行时,它都会进行比较
i == 10
,这是正确的,因此它立即继续循环,从不执行
i++;
增量。在后一个示例中,永远不会到达
for
循环,因为它陷入了
do
/
while
循环中。

为了解决第一个问题,我建议使用传统的格式字符串,例如

printf("This is = %d\n",i);
当换行符位于末尾时,通常会立即看到
printf
(至少在未重定向到文件时)。或者,您可以在调用
fflush(stdout)
后立即调用
printf
来强制刷新缓冲区。无论你的换行符在哪里,这都会起作用。

第二个问题可以通过在继续之前增加

i
来解决,例如

if (i == 10) {
    i++;
    continue;
}

但是编写循环的更简洁的方法是:

do {
  if (i != 10) {
      printf("This is = %d\n", i);
  }
  i++;
} while (i<20);

这通过避免

continue
来共享两种情况的增量语句。


0
投票

@当

i
在这个 do-while 循环中等于
10

int i = 0;
do
{
  if(i== 10)continue;
  printf("\n This is = %d",i);
  
  i++;
} while (i<20);

然后由于 continue 语句,它看起来像这样

int i = 0;
do
{
  i = 10;
  if(i== 10)continue;
} while (i<20);

int i = 10;
do
{
  if(i== 10)continue;
} while (i<20);

并且你有一个无限循环,因为变量

i
正在被更改

  i++;

被跳过。

由于您有一个无限循环,因此循环后的代码包括 for 语句

for(int a = 0 ; a<20 ; a++)
{
    if(a==10)continue;
    printf("\nHere = %d",a);
}

无法控制。

为了避免这个问题,你可以这样写

int i = 0;
do
{
  if(i== 10)
  {
      ++i;
      continue;
  }
  printf("\n This is = %d",i);
  
  i++;
} while (i<20);

或者写起来会更简单

int i = 0;
do
{
  if(i== 10)continue;
  printf("\n This is = %d",i);
  
} while ( ++i<20);

至于为什么的问题

this is = 9

未打印,那么这是由于 printf 调用中缺少换行符

  printf("\n This is = %d",i);

尝试重写它

  printf("This is = %d\n",i);

即遇到换行符时释放输出缓冲区。这就是所谓的“行缓冲”。

来自 C 标准(7.21.3 文件)

当流是行缓冲时,字符应该是 当换行符时作为块传输到主机环境或从主机环境传输 遇到角色。

© www.soinside.com 2019 - 2024. All rights reserved.