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
为什么?请解释一下。
这里发生了一些事情。首先,
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
来共享两种情况的增量语句。
@当
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 文件)
当流是行缓冲时,字符应该是 当换行符时作为块传输到主机环境或从主机环境传输 遇到角色。