# If you are bored with if-then-else, just switch

In C, the `switch` statement is used to perform different actions based on the value of an expression. It provides a convenient way to handle multiple conditions in a concise and readable manner. Here's a detailed explanation with a code sample:

```c
#include <stdio.h>

int main() {
    // Declare a variable
    int choice;

    // Prompt user for input
    printf("Enter a number (1-3): ");
    scanf("%d", &choice);

    // Switch statement
    switch (choice) {
        // Case 1
        case 1:
            printf("You selected option 1.\n");
            // Additional statements for case 1
            break; // The 'break' statement is important to exit the switch block

        // Case 2
        case 2:
            printf("You selected option 2.\n");
            // Additional statements for case 2
            break;

        // Case 3
        case 3:
            printf("You selected option 3.\n");
            // Additional statements for case 3
            break;

        // Default case (optional)
        default:
            printf("Invalid choice.\n");
            // Additional statements for the default case
            break;
    }

    return 0;
}
```

Explanation:

1. **Declaration and Input**: First, we declare an integer variable `choice` to store the user's input. We then prompt the user to enter a number (1-3) and store it in the `choice` variable using `scanf`.
    
2. **Switch Statement**: The `switch` statement is used to evaluate the value of the `choice` variable. The value inside the parentheses of `switch` is the expression that is being tested.
    
3. **Cases**: Each `case` represents a possible value of the expression. In this example, we have cases for 1, 2, and 3. If the value of `choice` matches any of these cases, the corresponding block of code is executed.
    
4. **Break Statement**: After each case block, a `break` statement is used to exit the `switch` statement. This is important because it prevents the code from falling through to the next case. Without `break`, all the subsequent cases would be executed until a `break` is encountered.
    
5. **Default Case (Optional)**: The `default` case is optional and is executed if none of the cases match the value of the expression. It is like an "else" statement in an `if-else` structure.
    

The `switch` statement provides a clean and efficient way to handle multiple conditions based on the value of an expression. Each case block contains the code to be executed for a specific value, and the `break` statement ensures that only the relevant block is executed.

If you omit the `break` statement in a `switch` case, a phenomenon known as "fall-through" occurs. Fall-through means that control will "fall through" to the next case, and subsequent case blocks will be executed until a `break` statement is encountered or until the end of the `switch` statement. Here's an example with an explanation:

```c
#include <stdio.h>

int main() {
    int choice;

    printf("Enter a number (1-3): ");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            printf("You selected option 1.\n");
            // No break here, so it falls through to the next case

        case 2:
            printf("You selected option 2.\n");
            // No break here, so it falls through to the next case

        case 3:
            printf("You selected option 3.\n");
            // No break here, so it continues to execute the next case

        default:
            printf("This is the default case.\n");
            break;
    }

    return 0;
}
```

Explanation:

1. **User Input and Switch Statement**: The program prompts the user for input and uses a `switch` statement to evaluate the value of `choice`.
    
2. **Fall-Through**: In each `case` block, there is no `break` statement. As a result, if the user enters, for example, `1`, the program will print "You selected option 1." and then continue to execute the code in the next case without checking its condition.
    
3. **Output**: If the user enters `1`, the output will be:
    
    ```plaintext
    You selected option 1.
    You selected option 2.
    You selected option 3.
    This is the default case.
    ```
    
4. **Default Case**: The `default` case is executed because control falls through from the previous cases. If there were a `break` after each case, only the relevant block of code would be executed.
    

Using fall-through can be intentional in some cases when you want multiple cases to share the same code. However, it's important to use it judiciously and document it well, as it can make the code less readable and may lead to unexpected behavior if not handled carefully.

Cases can be combined in a `switch` statement by intentionally omitting the `break` statement between cases. This allows multiple cases to share the same block of code. Here's an example with a detailed explanation:

```c
#include <stdio.h>

int main() {
    int choice;

    printf("Enter a number (1-3): ");
    scanf("%d", &choice);

    switch (choice) {
        // Combining cases 1 and 2
        case 1:
        case 2:
            printf("You selected option 1 or 2.\n");
            // No break, so it falls through to the next case

        case 3:
            printf("You selected option 3.\n");
            // No break here, so it continues to execute the next case

        default:
            printf("This is the default case.\n");
            break;
    }

    return 0;
}
```

Explanation:

1. **User Input and Switch Statement**: The program prompts the user for input and uses a `switch` statement to evaluate the value of `choice`.
    
2. **Combining Cases 1 and 2**: In this example, cases 1 and 2 are intentionally combined by omitting the `break` statement after case 1. If the user enters either 1 or 2, the program will execute the code for both cases.
    
3. **Fall-Through**: Since there is no `break` after case 2, control falls through to the code for case 3.
    
4. **Output**: If the user enters `1`, the output will be:
    
    ```plaintext
    You selected option 1 or 2.
    You selected option 3.
    This is the default case.
    ```
    
5. **Default Case**: The `default` case is executed if none of the specific cases match. The `break` statement at the end ensures that the `switch` statement is exited.
    

Combining cases can be useful when you want multiple cases to share the same code. However, it should be done intentionally and documented to make the code more readable and understandable. It's crucial to be aware of the fall-through behavior and use it only when it serves a specific purpose in your code.

The `switch` statement is designed to work with integral types, such as integers (int), characters (char), and enumerated types. The expression within the `switch` statement must evaluate to an integral value.

The following data types are generally allowed in a `switch` statement:

1. **int and its variations** (short int, long int, etc.):
    
    ```c
    int number;
    switch (number) {
        // cases...
    }
    ```
    
2. **char and its variations**:
    
    ```c
    char letter;
    switch (letter) {
        // cases...
    }
    ```
    
3. **Enumeration types (enum)**:
    
    ```c
    enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
    enum Day today;
    switch (today) {
        // cases...
    }
    ```
    

It's important to note that the `switch` statement doesn't work with floating-point types, strings, or other non-integral types. If you need to perform a multi-way branch based on non-integral values, you would typically use a series of `if-else` statements or other control flow constructs.
