问题描述
我在想:
他们做的事情完全一样吗?对表达式调用 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);
更具表现力和清晰。