簡單點,switch-case的結構簡單點~ C語言學習(4)
阿新 • • 發佈:2019-01-29
前言
最近將程序看完了,但是感覺自己理解的還不是很全面,執行緒看不進去,就無聊看了後面的訊號,看到了裡面要用函式指標,自己對它一直是一知半解,翻看《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;
}
不足
函式指標陣列中的所指向的函式型別要相同,返回值與形參都要相同,所以對執行的函式要做到結構同一。