【问题标题】:a case of for loop in cc中for循环的一个案例
【发布时间】:2012-06-15 09:55:39
【问题描述】:

我遇到了以下问题:

下面的for循环会运行多少次-

for(;0;)
 printf("hello");

我执行并运行了 1 次。我无法理解如何?

【问题讨论】:

  • 我会说它没有运行,因为这里的条件是0,在运行里面的代码之前检查。你确定你做得对吗?
  • 请指定您使用的编译器和参数。在我的带有 ms 编译器的机器上,这个循环不会运行
  • 我认为输出是:“hello”
  • 我猜你多了一个分号:for(;0;); printf("hello");
  • 你用的是什么编译器 nishantv

标签: c for-loop


【解决方案1】:

这甚至不会执行 1 次。我猜你的编译器不好?

好的。我认为您正在使用 Turbo C ;-)

编辑:

来自 C99 标准:

6.8.5.3 for 语句 1 语句

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

语句的行为如下: 表达式 expression-2 是 在每次执行 循环体。表达式 expression-3 被评估为 void 每次执行循环体后的表达式。如果第 1 条是 声明,它声明的任何变量的范围都是余数 声明和整个循环,包括其他两个 表达式;它是在第一个之前的执行顺序到达的 控制表达式的评估。如果条款 1 是 表达式,它在第一个表达式之前被评估为 void 表达式 控制表达式的评估.134)

它清楚地表明在执行循环之前首先评估条件。任何符合标准的编译器都不应执行循环 for(;0;) {} 一次。

【讨论】:

  • Turbo C 确实为上面的代码打印了一次“hello”!这可能是OP问的。所以正确答案是“不要使用 turbo C”:)
  • @Neil 为上面的代码打印一次“hello”肯定是错误的,这就是 turbo C 所做的。不要因为你不知道就对我投反对票。
  • @obounaim 是的,我在 turbo c 和 gcc 上运行它。 gcc 工作正常(一次也不打印“hello”)。
  • @nishantv 您无法推断出这样的错误。它根本不符合标准。 Turbo C 是一个旧的 16 位编译器,有很多错误,我认为没有人在开发中使用它。 It's not even good for learning.
  • [discouraging turbo C](http://stackoverflow.com/a/1962710/1275169) 的原因。
【解决方案2】:

您在此处复制的代码不是真正的 .c 文件中的代码,或者您的编译器有问题。

也许你有一个额外的分号?:for(;0;); printf("!"); 将打印一次。

【讨论】:

    【解决方案3】:

    for 循环定义为:

    for(startExpression; testExpression; countExpression)
    {
        block of code;
    }
    
    • startExpression 在代码之前计算;
    • testExpression 在代码之前被评估;
    • countExpression 在代码之后计算;

    解码:

    for(;0;)
    

    意思

    • 没有 startExpression
    • testExpression 评估为假,因此循环退出。

    已编辑以显示正确的循环解码。

    【讨论】:

    • 如果条件为假,则循环不会执行一次。由于条件中的0,您的解码“运行代码”不正确。
    【解决方案4】:

    上面写的代码永远不会进入for循环。

    查看ideonelink上的代码。

    这不是您的源代码中的内容,您可能在for 之后键入了; 而没有注意到它是这样的:

    for(;0;);
    printf("hello");
    

    在这种情况下,您的程序将打印“hello”。

    【讨论】:

      【解决方案5】:

      由于表达式为0,所以它被认为是假的。因此,在这种情况下,循环运行 0 次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        相关资源
        最近更新 更多