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

Grz*_*ski 20 c goto language-lawyer

免责声明:我知道这是模糊的,我不会这样编程.我知道首选的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;
}
Run Code Online (Sandbox Code Playgroud)

mol*_*ilo 21

是的,你跳了两m = 0m < 5,这是理所应当的.

for (A; B; C)
    D;
Run Code Online (Sandbox Code Playgroud)

相当于

{
    A;
  loop:
    if (B)
    {
        D;
        C;
        goto loop;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有办法将控制转移到A和之间的点B.

循环的语义与这个"纯goto"版本完全相同:

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
Run Code Online (Sandbox Code Playgroud)


P.P*_*.P. 6

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

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

从C11草案,§6.8.6.1goto声明:

goto语句导致无条件跳转到封闭函数中指定标签前缀的语句.

唯一的例外是:

goto语句中的标识符应命名位于封闭函数中某处的标签.goto语句不应从具有可变修改类型的标识符范围之外跳转到该标识符的范围内.

  • 你能解释一下这个例外的含义吗? (4认同)