有人可以用外行的话向我解释这段代码会发生什么变化吗?我理解这是一个用于获取第一个字符然后丢弃剩余输入的函数,但我对最后一个while循环感到困惑。当我用谷歌搜索它时,我发现了非常复杂的解释,这些解释在我脑海中浮现。有一种解释是有意义的,但它是一个汇编代码解释,处理存储器中堆栈的输入,然后我的豌豆大脑麻木了。
int get_First(void)
{
int ch, garbage;
do
{
ch = getchar();
}while(isspace(ch));
while((garbage = getchar()) != '\n' && garbage != EOF)
;
return ch;
}
答案 0 :(得分:4)
while((garbage = getchar()) != '\n' && garbage != EOF)
;
基本上是一个非常压缩的版本:
garbage = getchar();
while ( garbage != '\n' && garbage != EOF )
garbage = getchar();
基本上,读取并丢弃标准输入上的任何字符,直到我们看到信号的换行符或文件结尾。
C条件表达式可以包含赋值:
while ( x = foo() ) // assign result of foo() to x, loop if non-zero
{
// do something
}
由于 lot 的人意外地=
表示==
,因此大多数编译器会在条件表达式中警告分配表达式,除非该表达式包含在括号中:
while ( (x = foo()) ) // assign result of foo() to x, loop if non-zero
{
// do something
}
这告诉编译器"是的,我打算将foo()
的结果分配给x
并根据结果循环,闭嘴。&# 34;
C中的赋值表达式可以作为较大表达式的一部分出现。赋值表达式的结果是在任何适当的转换后存储在目标中的值。因此,赋值表达式的结果也可以与其他东西进行比较,因此您可以编写
while ( (x = foo()) > 0 ) // assign result of foo() to x, loop while result is positive
{
// do something
}
您可以进行多重比较:
while ( (x = foo()) > 0 && x < 100 )
{
// do something
}
&&
操作员强制从左到右评估 - (x = foo()) > 0
将首先评估,为x
分配新值作为副作用。如果结果为非零(x
为正),则将评估x < 100
。同样,它是一种紧凑的写作方式:
x = foo();
if ( x > 0 && x < 100 )
{
// do something
x = foo();
}
答案 1 :(得分:1)
第二个\n
循环继续读取字符,直到它读取换行符(EOF
)或到达文件末尾({{1}})。
答案 2 :(得分:1)
你的第二个while循环没有任何正文,它会连续从标准输入读取。如果按Enter
这是一个新行字符,它将会中断,因为它将继续检查输入的值是否不是换行符而不是文件末尾字符。
答案 3 :(得分:1)
while
循环不是无限循环:它有一个空体但会继续执行它的条件,直到它返回零值。
如果0
的第一个操作数评估为&&
或第二个操作数评估为0
,则条件将评估为0
。
第一个操作数(garbage = getchar()) != '\n
首先从标准输入读取一个字节并将其存储到garbage
并将其与换行符'\n'
进行比较。如果读取的字节确实是换行符,则循环停止,否则garbage
(读取的字节)与EOF
进行比较,如果流位于文件末尾,则循环停止,其中返回值为getchar
是特殊值EOF
。
此while
循环的目的只是消耗当前输入行的其余部分。但请注意,该函数可能会读取一行或多行,直到找到非空格字符。
答案 4 :(得分:0)
此函数首先返回输入中的空格。然后忽略所有内容,直到行尾或文件结束。写得非常糟糕,因为如果行中没有非空格,它将读取下一行,如果空格后的第一个字符为EOF,则会导致错误。