C language allows jumping inside loop. What would be the use of doing so?
if(n > 3) {
i = 2;
goto inner;
}
/* a lot of code */
for(i = 0; i < limit ;i ++) {
inner:
/* ... */
}
C language allows jumping inside loop. What would be the use of doing so?
if(n > 3) {
i = 2;
goto inner;
}
/* a lot of code */
for(i = 0; i < limit ;i ++) {
inner:
/* ... */
}
It's certainly a questionable construct. A design that depends on this behavior is probably a poor design.
You've tagged this as C++, but C++ (intelligently, IMO) doesn't allow you to jump inside a loop where a variable was declared in the first part of the for statement:
int main()
{
int q = 5;
goto inner;
for (int i = 0; i < 4; i++)
{
q *= 2;
inner:
q++;
std::cout << q << std::endl;
}
}
g++ output:
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’
Initializing i
before the loop allows the program to compile fine (as would be expected).
Oddly, compiling this with gcc -std=c99
(and using printf
instead) doesn't give an error, and on my computer, the output is:
6 13 27 55
as would be expected if i
were initialized outside the loop. This might lead one to believe that int i = 0
might be simply "pulled out" of the loop initializer during compilation, but i
is still out of scope if tried to use outside of the loop.
If you've ever coded in Assembler (ASM), then you'll know that GOTOs are pretty standard, and required, actually. The C Language was designed to be very close to ASM without actually being ASM. As such, I imagine that "GOTO" was kept for this reason.
Though, I'll admit that GOTOs are generally a "bad idea, mmmkay?" in terms of program flow control in C and any other higher level language.
From http://en.wikipedia.org/wiki/Duff%27s_device
In computer science, Duff's device is an optimized implementation of a serial copy that uses a technique widely applied in assembly language for loop unwinding.
...
Reason it works
The ability to legally jump into the middle of a loop in C.