【问题标题】:Tricky for Loop [closed]棘手的循环[关闭]
【发布时间】:2012-08-07 14:44:50
【问题描述】:

一个C语言的for循环问题困扰我。

当我写的时候:

#include<conio.h>
#include<stdio.h>
main()
{
    int i = 0;
    for( ; i ; )
    {
        printf("In for Loop");
    }
    getch();
}

输出:无打印。

代码被执行,但 printf 语句由于条件而没有打印。好的,这里没问题。

但是当我写这段代码时:

#include<conio.h>
#include<stdio.h>
main()
{
    for( ; 0 ; )
    {
        printf("In for Loop");
    }
    getch();
}

输出:在 for 循环中。

我的 for 循环被执行了 1 次,但实际上它一定不能被执行。我不知道为什么? stackoverflow的编码器/程序员/黑客可以帮助我吗?请解释一下为什么我的 for 循环只给出一次这个输出。

【问题讨论】:

  • 我无法重现此行为。使用 g++ 编译不带标志。
  • 第二个循环中没有为我打印任何内容。使用苹果 LLVM 3.1
  • 你是如何编译你的程序的?另外:如果您粘贴 整个 程序的第二个版本,而不是只是循环,那就太好了。
  • 无法在 gcc 和 linux 上重现问题。

标签: c for-loop infinite-loop


【解决方案1】:

您编写的内容不应打印任何内容,但我怀疑导致问题的 实际 第二种情况代码(不是您输入的内容)是:

for( ; 0 ; );     // <==== note the trailing semicolon there.
{
    printf("In for Loop");
}

这种情况下for循环不执行空语句,然后{ }代码执行一次。

编辑:如果这不是问题,请将显示问题的完整程序直接粘贴到您的问题中。

EDIT2:

以下最小可编译示例不打印任何内容:

#include <cstdio>

int main()
{
    for( ; 0 ; )
    {
        std::printf("In for Loop");
    }
}

【讨论】:

  • 每个程序员一生中至少会遇到一次这个问题
  • 是的。我会在这个上赌钱,不仅因为它会描述行为,而且正如@akappa 所说,每个人都至少做过一次。 (如果你发现空的for 循环很有用,你也至少会做一次相反的事情)。
  • 当我需要一个空的 for 循环时,我仍然使用大括号和一个大注释说明它是一个空循环体。
  • @MohdIftekharQurashi 你不会在编码中犯任何愚蠢的错误吗?你会是全世界唯一的人。
【解决方案2】:

两种方式都不应该输出任何东西。

【讨论】:

    【解决方案3】:

    我无法在我的机器上复制这种行为,使用 gcc 编译。这两个程序是:

    #include <iostream>
    int main()
    {
      for( ; 0 ; )
      {
        std::cout << "Here I am!";
      }
      std::cout << "End of the program.";
    }
    

    输出

    End of Program
    

    也一样

    #include <iostream>
    int main()
    {
      int i = 0;
      for( ; i ; )
      {
        std::cout << "Here I am!";
      }
      std::cout << "End of Program";
    }
    

    这是我们期望发生的,因为读取为循环继续条件的 0 被评估为 false,因此永远不会进入循环。

    【讨论】:

    • 但是真的相信我。我的 turbo c++ 3.0 给了我我的输出。您的 gcc 可能会按预期给出正确的答案。
    • @MohdIftekharQurashi 该死的,那是一个非常古老的编译器。它靠煤运行吗?
    • @MohdIftekharQurashi 这是 TurboC++-3.0 中的一个错误。 See here你应该选择更好的编译器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多