跳进循环

时间:2010-05-27 13:04:14

标签: c

C语言允许跳转循环。这样做的用途是什么?

  if(n > 3) {

    i = 2;
    goto inner;
  }

   /* a lot of code */

   for(i = 0; i < limit ;i ++) {

    inner:
    /* ... */
   }

3 个答案:

答案 0 :(得分:2)

这当然是一个值得怀疑的结构。依赖于这种行为的设计可能是一种糟糕的设计。

您已将其标记为C ++,但C ++(智能,IMO)不允许您跳转到在for语句的第一部分中声明变量的循环内: / p>

int main()
{
    int q = 5;

    goto inner;

    for (int i = 0; i < 4; i++)
    {
        q *= 2;
inner:
        q++;
        std::cout << q << std::endl;
    }    
}

g ++输出:

l.cpp: In function ‘int main()’:
l.cpp:12: error: jump to label ‘inner’
l.cpp:7: error:   from here
l.cpp:9: error:   crosses initialization of ‘int i’

循环之前初始化i 允许程序编译正常(如预期的那样)。

奇怪的是,使用gcc -std=c99进行编译(并使用printf代替)不会给出错误,而在我的计算机上,输出为:

6
13
27
55

如果i初始化循环之外,就会出现这种情况。这可能导致人们相信在编译期间int i = 0可能只是“拉出”循环初始值设定项,但如果尝试在循环外部使用i仍然超出范围。

答案 1 :(得分:2)

如果您曾使用汇编程序(ASM)进行编码,那么您就会知道GOTO非常标准,并且实际上是必需的。 C语言的设计非常接近ASM,而实际上并不是ASM。因此,我想是因为这个原因保留了“GOTO”。

虽然,我承认GOTO通常是一个“坏主意,mmmkay?”在C和任何其他更高级语言的程序流控制方面。

答案 2 :(得分:0)

来自http://en.wikipedia.org/wiki/Duff%27s_device

  

在计算机科学中,Duff的设备是一个串行拷贝的优化实现,它使用一种广泛应用于汇编语言的技术来进行循环展开。

...

  

合理的原因   
能够在C中合法地跳入循环的中间。