Why was the switch statement designed to need a break? Why was the switch statement designed to need a break? c c

Why was the switch statement designed to need a break?


Many answers seem to focus on the ability to fall through as the reason for requiring the break statement.

I believe it was simply a mistake, due largely because when C was designed there was not nearly as much experience with how these constructs would be used.

Peter Van der Linden makes the case in his book "Expert C Programming":

We analyzed the Sun C compiler sources to see how often the default fall through was used. The Sun ANSI C compiler front end has 244 switch statements, each of which has an average of seven cases. Fall through occurs in just 3% of all these cases.

In other words, the normal switch behavior is wrong 97% of the time. It's not just in a compiler - on the contrary, where fall through was used in this analysis it was often for situations that occur more frequently in a compiler than in other software, for instance, when compiling operators that can have either one or two operands:

switch (operator->num_of_operands) {    case 2: process_operand( operator->operand_2);              /* FALLTHRU */    case 1: process_operand( operator->operand_1);    break;}

Case fall through is so widely recognized as a defect that there's even a special comment convention, shown above, that tells lint "this is really one of those 3% of cases where fall through was desired."

I think it was a good idea for C# to require an explicit jump statement at the end of each case block (while still allowing multiple case labels to be stacked - as long as there's only a single block of statements). In C# you can still have one case fall through to another - you just have to make the fall thru explicit by jumping to the next case using a goto.

It's too bad Java didn't take the opportunity to break from the C semantics.


In a lot of ways c is just a clean interface to standard assembly idioms. When writing jump table driven flow control, the programmer has the choice of falling through or jumping out of the "control structure", and a jump out requires an explicit instruction.

So, c does the same thing...


To implement Duff's device, obviously:

dsend(to, from, count)char *to, *from;int count;{    int n = (count + 7) / 8;    switch (count % 8) {    case 0: do { *to = *from++;    case 7:      *to = *from++;    case 6:      *to = *from++;    case 5:      *to = *from++;    case 4:      *to = *from++;    case 3:      *to = *from++;    case 2:      *to = *from++;    case 1:      *to = *from++;               } while (--n > 0);    }}