Why was the switch statement designed to need a break?

javascript switch multiple case
can the same case in a switch have two breaks?
switch case in c programming questions
switch case with string in c
break in switch statement
what is the use of default keyword in switch case
switch statement javascript
is break statement necessary in switch case

Given a simple switch statement

switch (int)
{
    case 1 :
    {
        printf("1\n");
        break;
    }

    case 2 : 
    {
        printf("2\n");
    }

    case 3 : 
    {
        printf("3\n");
    }
}

The absence of a break statement in case 2, implies that execution will continue inside the code for case 3. This is not an accident; it was designed that way. Why was this decisions made? What benefit does this provide vs. having an automatic break semantic for the blocks? What was the rationale?

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.

Why do we have to use break in switch?, As for why C was designed that way, it probably stems from the concept of C as "​portable assembly". The switch statement is basically an  The case statements in a switch statements are simply labels. When you switch on a value, the switch statement essentially does a goto to the label with the matching value. This means that the break is necessary to avoid passing through to the code under the next label.

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...

What is the use of a switch case and break statement in the C , A switch statement allows a variable to be tested for equality against a list of values. Each value is called a What is the return type meaning in C, and why do we need it? 2,035 Views What is meant by a switch in C program? 748 Views. When writing switch statements in C++, it seems necessary to include a break after every case. Otherwise, the code will continue to run into the next case. Otherwise, the code will continue to run into the next case.

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);
    }
}

C - switch statement, C - switch statement - A switch statement allows a variable to be tested for case constant-expression : statement(s); break; /* optional */ /* you can have any  Each break statement terminates the enclosing switch statement. Control flow continues with the first statement following the switch block. The break statements are necessary because without them, statements in switch blocks fall through: All statements after the matching case label are executed in sequence, regardless of the expression of subsequent case labels, until a break statement is encountered.

If cases were designed to break implicitly then you couldn't have fallthrough.

case 0:
case 1:
case 2:
    // all do the same thing.
    break;
case 3:
case 4:
    // do something different.
    break;
default:
    // something else entirely.

If the switch was designed to break out implicitly after every case you wouldn't have a choice about it. The switch-case structure was designed the way it is to be more flexible.

switch statement in java, Not every case needs to contain a break. If no break appears, the flow of control will fall through to subsequent cases until a break is reached. A switch statement​  There is no difference if you omit or if you leave the break statement. It is a matter of taste. However, it is good practice to write the break statement for different reasons. Take a look at programmers exchange.

The case statements in a switch statements are simply labels.

When you switch on a value, the switch statement essentially does a goto to the label with the matching value.

This means that the break is necessary to avoid passing through to the code under the next label.

As for the reason why it was implemented this way - the fall-through nature of a switch statement can be useful in some scenarios. For example:

case optionA:
    // optionA needs to do its own thing, and also B's thing.
    // Fall-through to optionB afterwards.
    // Its behaviour is a superset of B's.
case optionB:
    // optionB needs to do its own thing
    // Its behaviour is a subset of A's.
    break;
case optionC:
    // optionC is quite independent so it does its own thing.
    break;

The "switch" statement, let a = 2 + 2 ; switch ( a ) { case 3 : alert ( 'Too small' ) ; break ; case 4 For example, if we want the same code to run for case 3 and case 5 :. b. The switch statement is a compound statement that tests all branches against different variables. c. The switch statement requires compound Boolean expressions as alternatives. d. The switch statement is like a sequence of if statements that compares a single value against several constant alternatives.

switch Statement (C), The switch and case statements help control complex conditional and branching values within the same switch statement can have the same value. Without break , the program continues to the next labeled statement,  Switch statement terminated with the break statement Exploring More of the Switch Statement. The previous sections showed you the bare essentials about the switch statement. But the switch statement is more than just the basics. At times you may need to do more with it than just matching simple strings and numerical values.

Switch statement, In computer programming languages, a switch statement is a type of selection control This article needs additional citations for verification. when a match occurs; a break statement typically follows a case statement to end said statement. The break statement has two separate and distinct uses: exiting a loop, and exiting a switch statement. You cannot use a break anywhere but inside a loop or a switch statement. Exiting a loop. Within any kind of a loop, break causes the loop to exit. There is very little point in having a "bare" break that unconditionally exits a loop. Almost always, the break is embedded in an if statement. For example:

What will happen if break statement is not used in switch case in C?, Switch case statements are used to execute only specific case statements based on the switch expression. If we do not use break statement at the end of each case, program will What is meant by programming language and give some examples? What are all the sections that a C program may have and must have? When working with switch statements, you must also include a break statement at the end of each processing segment. The break statement simply says that the case has been evaluated and handled. If you leave the break statement out, the code continues with the next executable statement in the next case .

Comments
  • Indeed, I think they went for simplicity of implementation. Some other languages supported more sophisticated cases (ranges, multiple values, strings...) at the cost, perhaps, of efficiency.
  • Java probably didn't want to break habits and spread confusion. For a different behavior, they would have to use different semantics. Java designers lost a number of opportunities to break from C, anyway.
  • @PhiLho - I think you're probably closest to the truth with "simplicity of implementation".
  • If you're using explicit jumps via GOTO, isn't it just as productive to just use a series of IF statements?
  • even Pascal implement their switch without break. how could C compiler-coder don't think about it @@
  • I know a lot of people say that, but I think it's not the complete picture; C is also often an ugly interface to assembly antipatterns. 1. Ugly: Statements instead of expressions. "Declaration reflects use." Glorified copy-paste as the mechanism for modularity and portability. Type system way too complicated; encourages bugs. NULL. (Continued in next comment.)
  • 2. Antipatterns: Doesn't provide "clean" tagged unions, one of the two fundamental data-representation idioms of assembly. (Knuth, vol 1, ch 2) Instead, "untagged unions," a non-idiomatic hack. This choice has hobbled the way people think of data for decades. And NUL-terminated strings are just about the worst idea ever.
  • @HarrisonKlaperman: No method of storing strings is perfect. The vast majority of problems associated with null-terminated strings would not occur if routines which accepted strings also accepted a maximum-length parameter, and would occur with routines that store length-marked strings into fixed-sized buffers without accepting a buffer-size parameter. The design of the switch statement where cases are simply labels may seem odd to modern eyes, but it's no worse than the design of the Fortran DO loop.
  • If I decide to write a jump table in assembly, I will take the case value, and magically turn that into the jump table subscript, jump to that location, and execute the code. After that I will not jump into the next case. I will jump to a uniform address that is the exit of all of the cases. The idea that I would jump or fallthough into the body of the next case is silly. There is no use case for that pattern.
  • While nowadays people are used more to clean and self-protecting idos and language features that prevent oneself from shooting into the foot, this is a reminescence from an area where bytes had been expensive (C started back before 1970). if your code needs to fit within 1024 bytes, you will experience heavy preasure to reuse code fragments. Reusing code by starting at different entrypoints sharing the same end is one mechanism for achieving this.
  • I love Duff's Device. So elegant, and wicked fast.