使用goto语句强制for循环的至少一次迭代的有效性

时间:2016-06-03 17:03:15

标签: c language-lawyer goto

免责声明:我知道这是不明确的,我不会这样编程。我知道首选的do-while声明,而不是那个,问题更多的是关于特定语言结构的有效性。

goto总是应该省略for循环的条件表达式吗?根据我的观察,它跳过了第一个(即初始化)和第二个表达式。这总是会以这种方式发生,还是纯粹依赖于编译器?

#include <stdio.h>

int main(void)
{
    int m = 5;

    goto BODY;
    for (m = 0; m < 5; m++)
        BODY: puts("Message"); // prints "Message" once

    printf("m = %d\n", m); // prints m = 6

    return 0;
}

6 个答案:

答案 0 :(得分:21)

是的,您正跳过m = 0m < 5,这是应该的。

for (A; B; C)
    D;

相当于

{
    A;
  loop:
    if (B)
    {
        D;
        C;
        goto loop;
    }
}

无法将控件转移到AB之间的某个位置。

你的循环的语义就像这样#34;纯goto&#34;版本:

int m = 5;
goto BODY;
m = 0;
loop:
if (m < 5) 
{
  BODY: puts("Message"); // prints "Message" once
   m++;
   goto loop;
}
printf("m = %d\n", m); // prints m = 6

答案 1 :(得分:6)

  

goto总是应该省略for的条件表达式   循环?

是。 goto跳转始终是无条件跳转,执行将从标签开始执行。

从C11草案,§6.8.6.1goto语句

  

goto语句导致无条件跳转到语句   在封闭函数中以命名标签作为前缀。

唯一的例外是:

  

goto语句中的标识符应指定位于的标签   在封闭功能的某个地方。 goto语句不得跳转   来自具有可变修改的标识符范围之外的   键入到该标识符范围内。

答案 2 :(得分:4)

代码中的goto语句导致无条件跳转到for循环内的语句。当执行该语句时,程序的流程应该依赖于条件表达式在循环中。所以,跳过循环内部的初始化。

答案 3 :(得分:2)

您应该使用do/while循环,例如,如果您有以下for循环:

for(A ; B ; C)
{
     D;
}

您应该使用以下do / while循环:

A;
do
{
     D;
     C;
}while(B);

将强制进行第一次迭代。

修改

请参阅chux的评论:如果D;包含continue,这种方式无法使用,您需要采用其他方式

编辑II

当问题被编辑时,这个答案不再是问题的直接答案,但我不会删除它,因为它可能对某人有帮助......

答案 4 :(得分:2)

C编程中的goto语句提供了一个无条件跳转来自&#39; goto&#39;在同一函数中使用带标签的语句。

请注意无条件一词。

所以是的,它应该省略for循环的条件表达式。

答案 5 :(得分:2)

这在c中是完全合法的。只要你不跳过自动变量的任何声明或初始化,跳进for循环就没有错。

在这种情况下,m增加一次,并且由于满足停止条件,循环终止。