Hello, I was working on a ARM project with my Keil toolchain, and by chance I just found that the following code is working (see case 2); I tested it in the ARM simulator using different values for alfa and beta. Someone knows where can I find more detailed explanation about this behaviour of C language (K&R say nothing about "case" into "if"...)? Thanks in advance. Bruno
char alfa; char beta; char zeta; int main (void) { while (1) { switch (alfa) { case 0: zeta = 17; break; case 1: zeta = 91; break; case 2: if (beta == 1) { case 3: zeta = 38; break; case 4: zeta = 47; } break; } } }
Note that if you look at switch as a computed goto, the code will logically perform this:
switch (alfa) { case 0: zeta = 17; break; case 1: zeta = 91; break; case 2: if (beta != 1) break; case 3: zeta = 38; break; case 4: zeta = 47; }
In other worlds, case 2 will have a conditional break.
The main difference will however be the extra block scope in the original post, for example affecting lifetime of auto variables.
Shouldn't that be
switch (alfa) { case 0: zeta = 17; break; case 1: zeta = 91; break; case 2: if (beta == 1) zeta = 38; break; case 3: zeta = 38; break; case 4: zeta = 47; }
No, I intentionally reversed the condition, to make the code conditionally fall through to the next case value, just as the OP code does.
For production code that lets a case value fall through to the next, a comment should always be added to make sure other readers knows that the break wasn't forgotten.