A switch compares one expression against several constant cases.

switch `switch (value)` selects a matching `case` label.
break `break` exits the switch after the selected case is handled.

Switch Statement

level
switch_statement.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int level = 2;
    const char *label = "unknown";

    switch (level) {
        case 1:
            label = "low";
            break;
        case 2:
            label = "medium";
            break;
        case 3:
            label = "high";
            break;
        default:
            label = "other";
            break;
    }

    printf("level=%s\n", label);
    return 0;
}
#include <stdio.h>

int main(void) {
    int level = 1;
    const char *label = "unknown";

    switch (level) {
        case 1:
            label = "low";
            break;
        case 2:
            label = "medium";
            break;
        case 3:
            label = "high";
            break;
        default:
            label = "other";
            break;
    }

    printf("level=%s\n", label);
    return 0;
}
#include <stdio.h>

int main(void) {
    int level = 3;
    const char *label = "unknown";

    switch (level) {
        case 1:
            label = "low";
            break;
        case 2:
            label = "medium";
            break;
        case 3:
            label = "high";
            break;
        default:
            label = "other";
            break;
    }

    printf("level=%s\n", label);
    return 0;
}
  1. level ← 2, label ← unknown

    3int main(void) {4    int level→ 2 = 2; //@level=1, 35    const char *label→ unknown = "unknown";
  2. switch (level)

    7switch (level2) {8    case 1:
  3. label ← medium

    10    break;11case 2:12    label→ medium = "medium";13    break;
  4. label = "medium";

    11case 2:12    label = "medium";13    break;14case 3:
  5. printf("level=%s ", label);

    22    printf("level=%s\n", labelmedium);23    return 0;24}
    outputlevel=medium
  1. level ← 1, label ← unknown

    3int main(void) {4    int level→ 1 = 1;5    const char *label→ unknown = "unknown";
  2. switch (level)

    7switch (level1) {8    case 1:
  3. label ← low

    7switch (level) {8    case 1:9        label→ low = "low";10        break;
  4. label = "low";

    8case 1:9    label = "low";10    break;11case 2:
  5. printf("level=%s ", label);

    22    printf("level=%s\n", labellow);23    return 0;24}
    outputlevel=low
  1. level ← 3, label ← unknown

    3int main(void) {4    int level→ 3 = 3;5    const char *label→ unknown = "unknown";
  2. switch (level)

    7switch (level3) {8    case 1:
  3. label ← high

    13    break;14case 3:15    label→ high = "high";16    break;
  4. label = "high";

    14case 3:15    label = "high";16    break;17default:
  5. printf("level=%s ", label);

    22    printf("level=%s\n", labelhigh);23    return 0;24}
    outputlevel=high

Follow the Cases

  1. level starts as 2.
  2. label starts as unknown.
  3. switch (level) checks the case labels.
  4. case 2 matches and sets label to medium.
  5. break exits the switch, so the program prints level=medium. | level | matching case | label | | --- | --- | --- | | 2 | case 2 | medium | | 1 | case 1 | low | | 3 | case 3 | high |

Exercise: switch_statement.c

Reproduce level=medium, then use the pinned level variants 1 and 3 to predict level=low and level=high.