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

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

最佳答案

是的,你跳过了两个 m = 0m < 5 ,这是应该的。

for (A; B; C)
    D;

相当于

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

无法将控制转移到 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

关于c - 使用 goto 语句强制执行至少一次 for 循环迭代的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37619907/

相关文章:

loops - 如何解决此错误?帕斯卡

c - fflush() 在悬挂指针方面做了什么?

c - 我们需要在 switch 语句后面添加一些东西吗

C - 找出数字的 a^2+b^2

在c中将摩尔斯电码转换为英语

c++ - 我真的需要为const对象实现用户提供的构造函数吗?

c - malloc 如何使用严格的别名 - 它只能在单个编译单元内被违反吗?

c++ - GCC 和自定义指针中 libstdc++ 的 basic_string 实现

c# - 我们可以使用 "goto"关键字来结束线程吗?

VBA "Compile Error: Label not defined"