首页 > 编程笔记 > C语言笔记

C语言default的用法和例子

C语言中的 default 关键字主要用于 switch 语句中,作为默认情况的处理分支。default 为 switch 语句提供了一个兜底的选项,用于处理所有未被其他 case 明确匹配的情况。

在 switch 语句中,default 分支是可选的,但通常建议包含它以处理所有未预期的情况。default 分支通常放在所有 case 分支之后,但实际上它可以放在 switch 语句的任何位置。

下面是一个使用 default 的简单示例:
#include 

int main() {
    int choice = 3;
    
    switch (choice) {
        case 1:
            printf("You selected option 1\n");
            break;
        case 2:
            printf("You selected option 2\n");
            break;
        default:
            printf("Invalid option selected\n");
            break;
    }
    
    return 0;
}
在这个例子中,如果 choice 的值既不是 1 也不是 2,程序将执行 default 分支,输出 "Invalid option selected"。

default 的执行时机

default 分支只有在所有其他 case 都不匹配时才会执行;这意味着即使 default 放在其他 case 之前,它也只会在没有匹配的 case 时才执行。 考虑以下示例:
#include 

int main() {
    int day = 8;
    
    switch (day) {
        default:
            printf("Invalid day\n");
            break;
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
        case 7:
            printf("Sunday\n");
            break;
    }
    
    return 0;
}
输出结果:
Invalid day
尽管 default 放在了最前面,但由于 day 的值为 8,不匹配任何 case,所以最终还是执行了 default 分支。

default 与 break 语句

在 default 分支中,break 语句通常是可选的,因为 default 通常是 switch 语句的最后一个分支。然而,为了保持代码的一致性和可读性,通常建议在 default 分支中也包含 break 语句。 如果 default 不是最后一个分支,且没有使用 break,执行将会“落空”(fall through)到下一个 case。这种行为可能导致意外的结果,因此应当谨慎使用。

default 在错误处理中的应用

default 分支常用于错误处理和异常情况的处理,它可以捕获所有未预期的输入或状态,使程序更加健壮。 看下面这个更复杂的例子,展示了如何使用 default 来处理无效的用户输入:
#include 

int main() {
    char grade;
    printf("Enter your grade (A, B, C, D, or F): ");
    scanf(" %c", &grade);
    
    switch (grade) {
        case 'A':
        case 'a':
            printf("Excellent! Keep up the good work.\n");
            break;
        case 'B':
        case 'b':
            printf("Good job! You're doing well.\n");
            break;
        case 'C':
        case 'c':
            printf("Satisfactory. There's room for improvement.\n");
            break;
        case 'D':
        case 'd':
            printf("Passing, but you need to work harder.\n");
            break;
        case 'F':
        case 'f':
            printf("Failed. Please seek help and try again.\n");
            break;
        default:
            printf("Error: Invalid grade entered. Please enter A, B, C, D, or F.\n");
            break;
    }
    
    return 0;
}
在这个例子中,default 分支处理了所有不是有效成绩的输入,提供了有意义的错误消息。

default 与枚举类型的结合使用

当 switch 语句用于处理枚举类型时,default 分支特别有用,它可以处理可能添加到枚举中的新值,或者捕获由于类型转换可能出现的无效值。 考虑下面的例子:
#include 

enum Days {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

int main() {
    enum Days today = WEDNESDAY;
    
    switch (today) {
        case MONDAY:
        case TUESDAY:
        case WEDNESDAY:
        case THURSDAY:
        case FRIDAY:
            printf("It's a weekday. Time to work!\n");
            break;
        case SATURDAY:
        case SUNDAY:
            printf("It's the weekend. Time to relax!\n");
            break;
        default:
            printf("Error: Invalid day\n");
            break;
    }
    
    return 0;
}
输出结果:
It's a weekday. Time to work!
在这个例子中,虽然我们已经涵盖了枚举 Days 的所有可能值,但保留 default 分支仍然是一个好习惯。如果将来向枚举中添加新的日子,或者由于某些原因 today 变量包含了一个无效值,default 分支可以捕获这些情况。

default 与代码维护

使用 default 分支不仅可以提高程序的健壮性,还能够提高代码的可维护性。当你在开发过程中添加新的 case 时,default 分支可以帮助你捕获可能遗漏的情况。 例如,假设你正在开发一个简单的计算器程序:
#include 

int main() {
    char operator;
    double num1, num2, result;

    printf("Enter an operator (+, -, *, /): ");
    scanf(" %c", &operator);

    printf("Enter two numbers: ");
    scanf("%lf %lf", &num1, &num2);

    switch (operator) {
        case '+':
            result = num1 + num2;
            printf("%.2f + %.2f = %.2f\n", num1, num2, result);
            break;
        case '-':
            result = num1 - num2;
            printf("%.2f - %.2f = %.2f\n", num1, num2, result);
            break;
        case '*':
            result = num1 * num2;
            printf("%.2f * %.2f = %.2f\n", num1, num2, result);
            break;
        case '/':
            if (num2 != 0) {
                result = num1 / num2;
                printf("%.2f / %.2f = %.2f\n", num1, num2, result);
            } else {
                printf("Error: Division by zero\n");
            }
            break;
        default:
            printf("Error: Invalid operator\n");
            break;
    }

    return 0;
}
在这个例子中,default 分支处理了所有非法的运算符输入。如果你决定在将来添加新的运算(比如求幂运算),default 分支可以帮助你捕获尚未实现的新运算符,提醒你更新代码。

推荐阅读