1. 程式人生 > >簡單點,switch-case的結構簡單點~ C語言學習(4)

簡單點,switch-case的結構簡單點~ C語言學習(4)

前言

最近將程序看完了,但是感覺自己理解的還不是很全面,執行緒看不進去,就無聊看了後面的訊號,看到了裡面要用函式指標,自己對它一直是一知半解,翻看《C和指標》,想到了一些很有趣的東西。簡化繁複的switch-case結構。

函式指標

C程式在呼叫函式時,都有一個函式入口,怎麼找到這個入口呢,通過指標,每個函式名在被使用時都是由編譯器轉化為函式指標,從而找到函式的位置。

switch-case的麻煩

書上舉了一個例子,一個使用switch-case結構的計算器的程式

#include<stdio.h>

double add(double a, double b){
    return
a+b; } double sub(double a,double b){ return a-b; } double mul(double a, double b){ return a*b; } double my_div(double a, double b){ return a/b; } int main(void){ double a,b,result; char opera; scanf("%lf%c%lf",&a,&opera,&b); switch(opera) { case
'+': result = add(a,b); break; case '-': result = sub(a,b); break; case '*': result = mul(a,b); break; case '/': result = my_div(a,b); break; } printf("%lf %c %lf = %lf\n",a,opera,b,result); return
0; }

執行四種運算就要有4個case,然而實際程式要實現的功能往往很多,有沒有更簡潔的形式呢?
書上使用了轉換表,通過函式指標陣列實現

//函式指標陣列初始化
double (*oper_fun[])(double a, double b) = {add, sub, mul, my_div};
//從鍵盤讀入要運算的a,b只後直接計算結果
result = oper_fun[i](a,b);

問題在於通過陣列元素,即函式與下標是一一對應的,比如上邊+就對應0,減就對應1,如何建立這樣的對映呢?
我的解決方法是通過一個字串常量來實現。這個常量與之前的指標陣列是相同的,完整程式碼如下

#include<stdio.h>
#include<string.h>

double add(double a, double b){
    return a+b;    
}
double sub(double a,double b){
    return a-b;
}
double mul(double a, double b){
    return a*b;    
}
double my_div(double a, double b){
    return a/b;
}

double (*oper_fun[])(double a, double b) = {add, sub, mul, my_div};

int main(void){

    double a,b,result;
    char opera;
    int i;

    scanf("%lf%c%lf",&a,&opera,&b);
    /* 使用一個與指標陣列一一對應的字串常量,遍歷字串,找到呼叫函式的下標*/
    for(i = 0; "+-*/"[i] != opera && i < strlen("+-*/"); i++);

    if(i == strlen("+-*/")){
        printf("error\n");
        return 0;
    }
    result = oper_fun[i](a,b);

    printf("%lf %c %lf = %lf\n",a,opera,b,result);
    return 0;
}

不足

函式指標陣列中的所指向的函式型別要相同,返回值與形參都要相同,所以對執行的函式要做到結構同一。