不明白这个无限循环

时间:2018-03-07 22:16:21

标签: c while-loop infinite-loop do-while

有人可以用外行的话向我解释这段代码会发生什么变化吗?我理解这是一个用于获取第一个字符然后丢弃剩余输入的函数,但我对最后一个while循环感到困惑。当我用谷歌搜索它时,我发现了非常复杂的解释,这些解释在我脑海中浮现。有一种解释是有意义的,但它是一个汇编代码解释,处理存储器中堆栈的输入,然后我的豌豆大脑麻木了。

int get_First(void)
{
     int ch, garbage;

     do
     {
          ch = getchar();
     }while(isspace(ch));

    while((garbage = getchar()) != '\n' && garbage != EOF)
                ;
    return ch;
}

5 个答案:

答案 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,则会导致错误。