这个for循环会无限运行吗?

时间:2014-12-17 07:33:03

标签: c for-loop scanf

我对c编程有一些经验,但有时一些书的作者只是提出了一些奇怪的句法问题,我们永远不会在实际编程中使用它,类似于我坚持一个这样的问题虽然给出了答案,但我是无法理解答案。这是下面的代码

int main
{
int i;
for(;scanf("%d",&i);printf("%d",i)){
     ;
    }
}

问题是这个for循环运行多少次,给出的答案是无限期的 任何人都可以解释循环将如何执行

5 个答案:

答案 0 :(得分:6)

scanf返回成功读取的元素数,在这种情况下,如果它读取整数并继续打印它将为1。

我们假设您在此处传递了一个字符,然后scanf()失败并退出for循环

答案 1 :(得分:3)

Scanf将返回成功输入get的号码。如果正确输入输入,则条件为真,因此它将继续以无限期运行。

要使条件为假,您可以输入除整数值以外的输入。那个时间scanf将返回零。所以循环结束。

答案 2 :(得分:2)

在这里,无限期意味着它无法定义(未知),它并不意味着无限(只是为了清除事物)。因为,这里循环运行的次数取决于给定的输入。如果给出了正确的输入,这是一个整数,则循环继续运行。如果给出了错误的输入,即非整数,则控制跳出循环。因此,您无法针对所有情况获得单一答案,因此它是无限期的。

答案 3 :(得分:1)

没有。这不是一个无限的for循环。

根据for循环的语法,来自n1256 TC3 C99的第6.8.5.3节

  

子句-1 ; 表达式-2 ; 表达式-3 声明

     

表现如下:表达式表达式-2是控制表达式   在每次执行循环体之前进行评估....

在您的情况下, expression-2 scanf("%d",&i),并且scanf()的返回值将被视为 expression-2 的评估

根据scanf()

man page
  

返回值

     

...返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

所以,在你的情况下,

  • 直到时间scanf()成功,它将number of input items successfully matched,即1TRUE值,for循环 将继续执行。

  • 如果scanf()失败[例如:输入char值],则返回 scanf()的值将为0 [匹配失败],循环将为 终止。

答案 4 :(得分:0)

接受回答后


是的,这可能是一个无限循环。

scanf()返回此处成功扫描的字段数(0或1)或IO错误或文件结束时的EOF

退出循环的唯一方式是输入非数字输入,例如" xyz"。

如果用户关闭stdinscanf()将返回EOFEOF是负值(不是0)。因此循环将继续调用scanf(),继续接收EOF,直到程序被终止。

#include <stdio.h>

int main(void) {
  int i;
  for (; scanf("%d", &i); printf("%d", i)) {
    ;
  }
  return 0;
}