Skip to main content

How To Think Like a Computer Scientist C++ Edition The Pretext Interactive Version

Section 13.2 switch statement

It’s hard to mention enumerated types without mentioning switch statements, because they often go hand in hand. A switch statement is an alternative to a chained conditional that is syntactically prettier and often more efficient. It looks like this:
switch (symbol) {
case '+':
    perform_addition();
    break;
case '*':
    perform_multiplication();
    break;
default:
    cout << "I only know how to perform addition and multiplication" << endl;
    break;
}
This switch statement is equivalent to the following chained conditional:
if (symbol == '+') {
    perform_addition();
}
else if (symbol == '*') {
    perform_multiplication();
}
else {
    cout << "I only know how to perform addition and multiplication" << endl;
}
The break statements are necessary in each branch in a switch statement because otherwise the flow of execution “falls through” to the next case.

Note 13.2.1.

Be sure to incorporate a break statment into each branch so that the flow of execution stops after that branch.
Without the break statements, the symbol + would make the program perform addition, and then perform multiplication, and then print the error message. Occasionally this feature is useful, but most of the time it is a source of errors when people forget the break statements.
Listing 13.2.1. Take a look at this active code that allows you to choose your starter Pokemon. If you change the value of type, it will change the Pokemon you choose. Notice how if you don’t assign type to a valid type, it outputs the default message. Try taking out the break statements in each case. What happens if you run the code with type as ‘g’ afterwards?
switch statements work with integers, characters, and enumerated types. For example, to convert a Suit to the corresponding string, we could use something like:
switch (suit) {
case CLUBS:     return "Clubs";
case DIAMONDS:  return "Diamonds";
case HEARTS:    return "Hearts";
case SPADES:    return "Spades";
default:        return "Not a valid suit";
}
In this case we don’t need break statements because the return statements cause the flow of execution to return to the caller instead of falling through to the next case.
In general it is good style to include a default case in every switch statement, to handle errors or unexpected values.

Checkpoint 13.2.1.

Checkpoint 13.2.2.

Which one of the following types do NOT work with switch statement?
  • ints
  • We can use ints with switch statements.
  • chars
  • We can use chars with switch statements.
  • strings
  • Switch statements only work on integral values, so we cannot use strings with switch statements!
  • enumerated types
  • We can use enumerated types with switch statements.

Checkpoint 13.2.3.

What is the correct output of the code below?
int main() {
  int num = 2;

  switch (num) {
  case 1:
    cout << 1;
    break;
  case 2:
    cout << 4;
  case 3:
    cout << 9;
    break;
  default:
    cout << "Invalid num! Please try again.";
    break;
  }
}
  • Incorrect! Try running it with the active code.
  • 49
  • Case 2 doesn’t end with a break statement, so case 3 also runs!
  • 49Invalid num! Please try again.
  • Where do we encounter a break statement?
  • Invalid num! Please try again.
  • Is 2 one of the invalid numbers?
  • Code will not run.
  • There is no reason why the code wouldn’t run.

Checkpoint 13.2.4.

What is the correct output this time?
int main() {
  int num = 1;

  switch (num) {
  case 1:
    cout << 1;
    break;
  case 2:
    cout << 4;
  case 3:
    cout << 9;
  default:
    cout << "Invalid num! Please try again.";
  }
}
  • The first statement ends with a break, so only 1 will print!
  • 149
  • Where do we encounter a break statement?
  • 149Invalid num! Please try again.
  • Is 1 one of the valid numbers? Where do we encounter a break statement?
  • Invalid num! Please try again.
  • Is 1 one of the invalid numbers?
  • Code will not run.
  • There is no reason why the code wouldn’t run.

Checkpoint 13.2.5.

And finally, what about this time?
int main() {
  int num = 2;

  switch (num) {
  case 1:
    cout << 1;
    break;
  case 2:
    cout << 4;
  case 3:
    cout << 9;
  default:
    cout << "Invalid num! Please try again.";
  }
}
  • Where do we / don’t we encounter a break statement?
  • 49
  • Where do we / don’t we encounter a break statement?
  • 49Invalid num! Please try again.
  • Notice that 2 is not an invalid number, but since we are missing break statements, multiple branches execute.
  • Invalid num! Please try again.
  • Is 2 one of the invalid numbers?
  • Code will not run.
  • There is no reason why the code wouldn’t run.
You have attempted 1 of 4 activities on this page.