【问题标题】:Will this for loop run infinitely?这个 for 循环会无限运行吗?
【发布时间】:2014-12-17 07:33:03
【问题描述】:

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

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

问题是这个for循环会运行多少次,给出的答案是不确定的 谁能解释一下循环将如何执行

【问题讨论】:

  • 提示:如果scanf() 失败了怎么办?那你检查返回值了吗?
  • 代码无法编译(int main有问题)
  • 是的,我忘记写return语句了。谢谢

标签: c for-loop scanf


【解决方案1】:

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

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

【讨论】:

  • 嘿嘿我还有这个疑问scanf()的原型是int scanf(const char * format, ...); 它从stdin读取数据并存储格式说明符指定的格式的附加参数指定的位置中的数据,并返回成功读取的项目数。因此,即使在上述情况下它正在读取一个字符,它也会将该字符存储为一个整数,我猜它可能会返回 0 或其他任何内容,但它会读取字符而不是它,那么为什么循环在读取字符时停止?
  • @RohitSaluja 在scanf() 中有一个叫做匹配序列的东西,你传递的数据和值被扫描到的数据类型应该是相同的,否则你可能会看到一些东西被写入变量,但是C 标准说使用 wronf 格式说明符会导致未定义的行为,必须在代码中避免。因此 scanf() 将返回发生的成功匹配数,并且由于格式说明符错误,这种情况下没有发生成功的转换。如果这回答了您的问号,则表示已回答
  • 但是为什么如果我使用类似
    int i,p; p=scanf("%c",&i); printf("p的值 = %d\n",p);在这里,如果我输入 i 作为整数或什至作为字符 p 总是返回 1 为什么会这样?
  • @RohitSaluja 是的,这很好,因为 .. 输入即使是整数也被存储为字符,如果您传递的值是 5,那么它将被存储为 '5' .. 转换因为 5 是一个有效字符而通过了,你明白了吗? ASCII 值为 53
  • @RohitSaluja 我不是专家.. :) :)
【解决方案2】:

scanf 将返回成功输入获取的编号。如果输入正确,则条件将为真,因此它会无限期地继续运行。

要使条件为假,您可以提供整数值以外的输入。那个时候 scanf 将返回零。这样循环就结束了。

【讨论】:

    【解决方案3】:

    这里,不定的意思是不能定义(未知),不代表无限(只是为了清除)。因为,这里循环运行的次数取决于给定的输入。如果给出正确的输入(整数),则循环继续运行。如果给出了错误的输入,即非整数,则控制跳出循环。所以你不能对所有场景都有一个单一的答案,因此它是不确定的。

    【讨论】:

      【解决方案4】:

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

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

      for ( clause-1 ; expression-2 ; expression-3 ) 声明

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

      在您的情况下,expression-2scanf("%d",&i)scanf() 的返回值将被考虑用于评估 expression-2

      根据scanf()man page

      返回值

      ...返回成功匹配和分配的输入项的数量,可以少于提供的数量,如果早期匹配失败,甚至为零。

      所以,在你的情况下,

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

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

      【讨论】:

        【解决方案5】:

        接受回答后


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

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-09
          • 2016-05-01
          • 2022-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多