这两种清理缓冲区方法是否等效? 我在想:

问题描述

我在想:

他们做的事情完全一样吗?对表达式调用 c = getchar 与使用 do...while 循环执行相同吗?

void clrbuf(void)
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}
void clrbuf(void)
{
    int c;
    do c = getchar(); while (c != '\n' && c != EOF);
}

编辑:c 曾经被输入 char,但人们告诉我 int 是它的合适类型

解决方法

对于初学者来说,变量 c 应该声明为

int c;

因为如果类型 char 的行为与类型 unsigned char 相同,则此条件

c != EOF

永远是真的。

根据 C 标准(7.21 输入/输出

EOF

它扩展为整数常量表达式,类型为 int 和一个负值,由多个函数返回以指示 文件结束,即不再有来自流的输入;

因此,如果类型 char 的行为与类型 unsigned char 相同(这取决于编译器选项),那么在将整数提升为类型 {{1} 之后存储在变量 c 中的值}} 仍然是一个非负值。

第一个while循环

int

可以使用逗号运算符重写,如

while ((c = getchar()) != '\n' && c != EOF);

实际上它由两部分组成:赋值表达式while ( c = getchar(),c != '\n' && c != EOF ); 和条件c = getchar()

如你所见,它等价于 do-while 语句

c != '\n' && c != EOF

但是第一个while循环

do c = getchar(); while (c != '\n' && c != EOF);

更具表现力和清晰。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...