Skip to Content
Course content

12: Control Flow: Switch Statements

Click on the "Edit" button in the top corner of the screen to edit your slide content.

When I first started working with C++, I fell for a very specific trap with switch statements. I assumed they worked exactly like a chain of if/else if blocks—that once the program found a match, it would execute that block and then jump straight to the end of the entire structure. I thought the switch was just a "cleaner" way to write a long list of conditions.

The "It's Just a Shorter If-Else" Trap

To show you why that's dangerous, look at this snippet. Imagine we're writing a simple movement system for a top-down game where the user presses 'W', 'A', 'S', or 'D'.

char input = 'W';

switch (input) {
    case 'W':
        std::cout << "Moving North\n";
    case 'S':
        std::cout << "Moving South\n";
    case 'A':
        std::cout << "Moving West\n";
    case 'D':
        std::cout << "Moving East\n";
}

If you think this behaves like an if/else chain, you'd expect the output to be "Moving North". But run this, and you'll see it prints "Moving North", "Moving South", "Moving West", and "Moving East" all at once. It's a mess. This is because C++ doesn't automatically stop after a match is found; it simply jumps to the matching label and then executes every single line of code following it until it hits the end of the switch or a break statement.

Stopping the Bleed with Break

This behavior is called "fall-through." To stop it, you need to explicitly tell C++ to exit the switch block using the break keyword. In a professional codebase, missing a break is often a bug, but it's a bug that the compiler won't always warn you about.

switch (input) {
    case 'W':
        std::cout << "Moving North\n";
        break; 
    case 'S':
        std::cout << "Moving South\n";
        break;
    case 'A':
        std::cout << "Moving West\n";
        break;
    case 'D':
        std::cout << "Moving East\n";
        break;
}

Now, the logic behaves as intended. Once "Moving North" is printed, the break command tells the CPU, "Okay, we're done here, jump to the closing brace."

Intentional Fall-Through and the Default Safety Net

Now, here is the interesting part: fall-through isn't always a mistake. Sometimes I use it on purpose to handle multiple inputs the same way. For example, if your game supports both 'W' and the Up Arrow (represented here as 'U'), you can stack the cases.

switch (input) {
    case 'W':
    case 'U':
        std::cout << "Moving North\n";
        break;
    case 'S':
    case 'D':
        std::cout << "Moving South\n";
        break;
    default:
        std::cout << "Invalid key pressed!\n";
        break;
}

Notice the default label at the bottom. I always recommend including this. It's your safety net. If the user hits 'X' or 'Q', the switch won't find a matching case, and instead of doing nothing (which can leave your program in an ambiguous state), it hits the default block. Think of it as the final else in an if/else chain.

When to Actually Use a Switch

You might be wondering: "Why bother with this syntax if I have to manually add break everywhere?" The reason is efficiency and clarity. While an if/else chain evaluates conditions one by one, a switch often allows the compiler to generate a "jump table." This means the program can jump directly to the correct case regardless of whether it's the first or the hundredth option, which is significantly faster in performance-critical code.

Just remember the limitation: switch only works with integral types (like int, char, or enum). You can't use it to compare strings or floating-point numbers. For those, you're stuck with if/else.




📋 Practical Task

Exercise: The Retro Arcade Menu Controller

You are building a menu system for a retro arcade machine. The user enters a number (1-4) to select an option. However, the machine has a quirk: options 2 and 3 both lead to the "Settings" menu, but they do so with different welcome messages before jumping to the same shared logic.

Your Task: Write a program that takes an integer input and uses a switch statement to implement the following logic:

  • Case 1: Print "Starting Game..." and break.
  • Case 2: Print "Entering Settings via Quick-Link..." and then intentionally fall through to Case 3.
  • Case 3: Print "Welcome to the Settings Menu!" and break.
  • Case 4: Print "Exiting System..." and break.
  • Default: Print "Invalid Selection. Please try again." and break.

Make sure you demonstrate a clear understanding of where the break goes and where it is omitted to allow the fall-through from Case 2 to Case 3.

Rating
0 0

There are no comments for now.

to be the first to leave a comment.