C语言允许跳转循环。这样做的用途是什么?
if(n > 3) {
i = 2;
goto inner;
}
/* a lot of code */
for(i = 0; i < limit ;i ++) {
inner:
/* ... */
}
答案 0 :(得分:2)
这当然是一个值得怀疑的结构。依赖于这种行为的设计可能是一种糟糕的设计。
您已将其标记为C ++,但C ++(智能,IMO)不允许您跳转到在for语句的第一部分中声明变量的循环内: / p>
g ++输出: 在int main()
{
int q = 5;
goto inner;
for (int i = 0; i < 4; i++)
{
q *= 2;
inner:
q++;
std::cout << q << std::endl;
}
}
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中合法地跳入循环的中间。