使用函数指针数组替换 switch case

现在有下面这样一段switch case代码

void start() {printf("System started\n");}
void stop() {printf("System stopped\n");}
void restart() {printf("System restarted\n");}
void shutdown() {printf("System shut down\n");}

switch (command) {
    case 1:
        start();
        break;
    case 2:
        stop();
        break;
    case 3:
        restart();
        break;
    case 4:
        shutdown();
        break;
    default:
        printf("Unknown command\n");
}

虽然这段代码很直观,但如果命令种类增多,switch-case 语句将变得更加复杂且难以管理。每次增加新命令,都需要修改 switch-case 语句,可能会导致维护上的困难。

现在,我们使用函数指针数组来重构上述代码。通过将每个操作的函数指针存储在数组中,我们可以使用简单的数组索引来调用函数,而不需要编写多个 case 分支。 

typedef void (*CommandFunc)();
void start() {printf("System started\n");}
void stop() {printf("System stopped\n");}
void restart() {printf("System restarted\n");}
void shutdown() {printf("System shut down\n");}

// 函数指针数组
CommandFunc commands[] = {
    start,
    stop,
    restart,
    shutdown
};

if(command > 0 && (command <= sizeof(commands) / sizeof(CommandFunc)))
    commands[command - 1];
else
    printf("Unknown command\n");

通过使用函数指针数组,代码的结构更加清晰,添加新功能时只需要增加新的函数并将其指针添加到数组中,无需修改核心逻辑。能让代码更加简洁高效。

当我们需要根据不同的输入值执行不同的操作时,常用的方式是使用Switch Case语句,但是当需要判断的情况较多时,Switch Case语句的代码量会较大,可读性也有所下降。此时,可以使用函数指针数组来代替Switch Case语句,代码会更加简洁、易读。 下面是一个使用函数指针数组代替Switch Case的示例: ```c #include <stdio.h> void func1() { printf("You chose option 1.\n"); } void func2() { printf("You chose option 2.\n"); } void func3() { printf("You chose option 3.\n"); } int main() { int option; void (*func_ptr_arr[])(void) = {func1, func2, func3}; printf("Enter an option (1-3): "); scanf("%d", &option); if (option >= 1 && option <= 3) { (*func_ptr_arr[option-1])(); } else { printf("Invalid option.\n"); } return 0; } ``` 在上面的示例中,我们首先定义了三个函数`func1()`、`func2()`和`func3()`,分别对应三个选项。然后,我们定义了一个函数指针数组`func_ptr_arr`,它包含了三个函数指针,分别指向三个函数。 在主函数中,我们首先读取用户输入的选项,然后判断选项是否合法。如果合法,就通过函数指针数组调用对应的函数。如果不合法,则输出错误信息。 需要注意的是,函数指针数组中的函数指针要与函数的返回类型和参数列表完全匹配。在调用函数指针时,我们使用函数指针的间接调用操作符`*`,并且在函数名后面加上了一对小括号`()`,这表示对函数指针所指向的函数进行调用。 使用函数指针数组代替Switch Case语句可以使代码更加简洁、易读,而且可以方便地添加、修改和删除选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值