1. Introduction
The switch statement is C's multi-way branching construct, offering a cleaner alternative to a long else-if ladder when a single integer-valued expression must be compared against several constant values. It is widely used for menu-driven programs, state machines, and command dispatchers.
Cricket analogy: A switch statement is like an umpire's signal system for dismissals — instead of a long chain of "is it bowled? is it caught? is it lbw?" checks, one glance at the raw signal jumps straight to the right call, used for umpiring decision trees and match state tracking.
Unlike if-else, which can test any boolean expression, switch compares one controlling expression against a set of case labels, each of which must be a constant integer expression known at compile time.
Cricket analogy: Unlike if-else, which can test any condition like "is the required run rate above 10," a switch only compares one value, like the dismissal type code, against fixed labels such as bowled, caught, or run-out that must be known before the match even starts.
2. Syntax
switch (expression) {
case constant1:
statement(s);
break;
case constant2:
statement(s);
break;
...
default:
statement(s);
}3. Explanation
The expression in a switch must evaluate to an integer type (int, char, or an enum — never float, double, or a string). Each case label must be a constant expression (a literal, a #defined constant, or an enumerator) whose value is known at compile time; using a variable as a case label is a compile-time error, and duplicate case values are also a compile-time error.
Cricket analogy: The switch expression must be an integer-like value, such as a dismissal code (int) or a single-letter result (char), never a decimal run rate; case labels must be fixed constants like a #define'd OUT value, and using a variable player score as a label, or listing the same dismissal code twice, is a compile-time error.
Execution jumps directly to the case label matching the value of expression. From that point, statements execute sequentially through subsequent case labels — this is called 'fall-through' — until a break statement is reached or the switch block ends. This is a fundamental difference from if-else: switch does NOT automatically stop after one matching case; the programmer must explicitly place break at the end of each case to prevent falling into the next one.
Cricket analogy: Execution jumps straight to the matching dismissal case, like "caught," but without a break statement it keeps falling through into "run-out" and "stumped" cases too, unlike if-else which stops automatically — the scorer must explicitly place a break after recording each dismissal type.
The optional default label runs when no case matches the expression's value. default does not have to be the last label physically, but placing it last is the near-universal convention for readability; if default is not last, cases below it are still checked, and control can still fall through into or out of the default block.
Cricket analogy: The default label is like the umpire's fallback "unclear signal, consult third umpire" ruling used when no listed dismissal type matches; it's conventionally placed last in the rulebook, but even if listed earlier, dismissal types below it are still checked and play can fall through into or out of it.
Intentional fall-through is a legitimate technique: multiple case labels with no code and no break between them 'stack' together to share one block of statements, e.g. grouping vowels: case 'a': case 'e': case 'i': case 'o': case 'u': printf("vowel"); break;.
Cricket analogy: Intentional fall-through is like stacking multiple dismissal codes — bowled, caught, and stumped — with no separate ruling between them so they all share one outcome: "batsman is out," just as case 'a': case 'e': ... printf("vowel"); break; groups vowels under one shared action.
Forgetting break is the single most common switch bug: without it, execution silently falls through into the next case's statements even though its label didn't match, often producing extra unintended output. Always add break at the end of every case unless the fall-through is deliberate and, ideally, commented as such (e.g. // fall through).
Since C99/C11, variable declarations are allowed inside a switch body, but a case label cannot jump past an initializer without wrapping that case in its own block { } — otherwise some compilers reject it or the variable is left uninitialized when jumped to directly. When a case needs local variables, enclose its statements in braces: case 1: { int temp = 5; ... break; }.
4. Example
#include <stdio.h>
int main(void) {
char grade = 'B';
switch (grade) {
case 'A':
printf("Excellent!\n");
break;
case 'B':
printf("Well done\n");
break;
case 'C':
case 'D':
printf("You passed\n"); // intentional fall-through: C and D share this block
break;
case 'F':
printf("Better luck next time\n");
break;
default:
printf("Invalid grade\n");
}
int day = 3;
switch (day) {
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
default:
printf("Some other day\n");
break;
}
return 0;
}5. Output
Well done
Wednesday6. Key Takeaways
- switch compares an integer-type expression (int, char, or enum) against constant case labels — never float, double, or string.
- Each case value must be a compile-time constant, and duplicate case values are a compile-time error.
- Without a break, execution falls through into the next case's statements — this is the default behaviour, not an error.
- Stacking case labels with no statements between them is a valid way to share one block across multiple values.
- default runs when no case matches; it is conventionally placed last but is not required to be.
- Wrap a case's statements in braces if it declares its own local variables to avoid scope and initialization issues.
Practice what you learned
1. What data types can the controlling expression of a switch statement have in standard C?
2. What happens if a `break` statement is omitted at the end of a matched case?
3. Which of the following is NOT allowed as a case label in standard C?
4. In `switch(x) { case 1: case 2: printf("low"); break; case 3: printf("high"); break; }`, what prints when x is 1?
5. Is it a compile-time error to have two case labels with the same constant value in one switch?
Was this page helpful?
You May Also Like
if-else in C
Learn C's if, if-else, and else-if ladder with syntax, dangling-else pitfalls, nested examples, and exam-style practice questions.
Loops in C (for, while, do-while)
Complete guide to C loops — for, while, and do-while — with syntax, execution order, examples, and exam-focused comparisons.
Enumerations (enum) in C
Learn C enumerations: syntax, default integer values, custom value assignment, and best practices with examples.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics