C 轉(zhuǎn)移表/轉(zhuǎn)換表的深入分析
更新時(shí)間:2013年05月28日 09:49:11 作者:
本篇文章是對(duì)c語(yǔ)言中轉(zhuǎn)移表/轉(zhuǎn)換表進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
個(gè)人實(shí)現(xiàn)例子:
#include <stdio.h>
#include <string.h>
#define M 4
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int (*oper_func[])(int, int) = {
add, sub, mul, div
};
char oper_sequence[M][10] = {
"add", "sub", "mul", "div"
};
int main()
{
char oper[10];
int seq;
int a,b;
int result;
int i;
printf("Operator:");
scanf("%s",oper);
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);
for(i=0; i<M; i++)
{
if(strncmp(oper_sequence[i], oper, 3) == 0)
seq = i;
}
result = oper_func[seq](a, b);
printf("result is %d/n", result);
return 0;
}
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a/b;
}
<<C和指針>>原文:
轉(zhuǎn)換表(jump table)
轉(zhuǎn)移表最好用個(gè)例子來(lái)解釋。下面的代碼段取自一個(gè)程序,它用于實(shí)現(xiàn)一個(gè)袖珍式計(jì)算器。程序的其他部分已經(jīng)讀入兩個(gè)數(shù)(op1和op2)和一個(gè)操作符(oper)。下面的代碼對(duì)操作符進(jìn)行測(cè)試,最后決定調(diào)用哪個(gè)函數(shù)。
switch(oper)
{
case ADD: result=add(op1,op2);break;
case SUB: result=sub(op1,op2);break;
case MUL: result=mul(op1,op2);break;
case DIV: result=div(op1,op2);break;
......
}
對(duì)于一個(gè)新奇的具有上百個(gè)操作符的計(jì)算器,這條switch語(yǔ)句將會(huì)非常之長(zhǎng)。為什么要調(diào)用函數(shù)來(lái)執(zhí)行這些操作呢?把具體操作和選擇操作的代碼分開是一種 良好的設(shè)計(jì)方案。更為復(fù)雜的操作將肯定以獨(dú)立的函數(shù)來(lái)實(shí)現(xiàn),因?yàn)樗鼈兊拈L(zhǎng)度可能很長(zhǎng)。但即使是簡(jiǎn)單的操作也可能具有副作用,例如保存一個(gè)常量值用于以后的 操作。
為了使用switch語(yǔ)句,表示操作符的代碼必須是整數(shù)。如果它們是從零開始連續(xù)的整數(shù),我們可以使用轉(zhuǎn)換表來(lái)實(shí)現(xiàn)相同的任務(wù)。轉(zhuǎn)換表就是一個(gè)函數(shù)指針數(shù)組。
創(chuàng)建一個(gè)轉(zhuǎn)換表需要兩個(gè)步驟。首先,聲明并初始化一個(gè)函數(shù)指針數(shù)組。唯一需要留心之處就是確保這些函數(shù)的原型出現(xiàn)在這個(gè)數(shù)組的聲明之前。
double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);
double (*oper_func[])(double,double)={add,sub,mul,div,...};
初始化列表中各個(gè)函數(shù)名的正確順序取決于程序中用于表示每個(gè)操作符的整型代碼。這個(gè)例子假定ADD是0,SUB是1,MUL是2,接下去以此類推。
第二個(gè)步驟是用下面這條語(yǔ)句替換前面整條switch語(yǔ)句!
result=oper_func[oper](op1,op2);
oper從數(shù)組中選擇正確的函數(shù)指針,而函數(shù)調(diào)用操作符將執(zhí)行這個(gè)函數(shù)。
復(fù)制代碼 代碼如下:
#include <stdio.h>
#include <string.h>
#define M 4
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int (*oper_func[])(int, int) = {
add, sub, mul, div
};
char oper_sequence[M][10] = {
"add", "sub", "mul", "div"
};
int main()
{
char oper[10];
int seq;
int a,b;
int result;
int i;
printf("Operator:");
scanf("%s",oper);
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);
for(i=0; i<M; i++)
{
if(strncmp(oper_sequence[i], oper, 3) == 0)
seq = i;
}
result = oper_func[seq](a, b);
printf("result is %d/n", result);
return 0;
}
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a/b;
}
<<C和指針>>原文:
轉(zhuǎn)換表(jump table)
轉(zhuǎn)移表最好用個(gè)例子來(lái)解釋。下面的代碼段取自一個(gè)程序,它用于實(shí)現(xiàn)一個(gè)袖珍式計(jì)算器。程序的其他部分已經(jīng)讀入兩個(gè)數(shù)(op1和op2)和一個(gè)操作符(oper)。下面的代碼對(duì)操作符進(jìn)行測(cè)試,最后決定調(diào)用哪個(gè)函數(shù)。
switch(oper)
{
case ADD: result=add(op1,op2);break;
case SUB: result=sub(op1,op2);break;
case MUL: result=mul(op1,op2);break;
case DIV: result=div(op1,op2);break;
......
}
對(duì)于一個(gè)新奇的具有上百個(gè)操作符的計(jì)算器,這條switch語(yǔ)句將會(huì)非常之長(zhǎng)。為什么要調(diào)用函數(shù)來(lái)執(zhí)行這些操作呢?把具體操作和選擇操作的代碼分開是一種 良好的設(shè)計(jì)方案。更為復(fù)雜的操作將肯定以獨(dú)立的函數(shù)來(lái)實(shí)現(xiàn),因?yàn)樗鼈兊拈L(zhǎng)度可能很長(zhǎng)。但即使是簡(jiǎn)單的操作也可能具有副作用,例如保存一個(gè)常量值用于以后的 操作。
為了使用switch語(yǔ)句,表示操作符的代碼必須是整數(shù)。如果它們是從零開始連續(xù)的整數(shù),我們可以使用轉(zhuǎn)換表來(lái)實(shí)現(xiàn)相同的任務(wù)。轉(zhuǎn)換表就是一個(gè)函數(shù)指針數(shù)組。
創(chuàng)建一個(gè)轉(zhuǎn)換表需要兩個(gè)步驟。首先,聲明并初始化一個(gè)函數(shù)指針數(shù)組。唯一需要留心之處就是確保這些函數(shù)的原型出現(xiàn)在這個(gè)數(shù)組的聲明之前。
double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);
double (*oper_func[])(double,double)={add,sub,mul,div,...};
初始化列表中各個(gè)函數(shù)名的正確順序取決于程序中用于表示每個(gè)操作符的整型代碼。這個(gè)例子假定ADD是0,SUB是1,MUL是2,接下去以此類推。
第二個(gè)步驟是用下面這條語(yǔ)句替換前面整條switch語(yǔ)句!
result=oper_func[oper](op1,op2);
oper從數(shù)組中選擇正確的函數(shù)指針,而函數(shù)調(diào)用操作符將執(zhí)行這個(gè)函數(shù)。
相關(guān)文章
C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法
今天小編就為大家分享一篇C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-07-07
C++類和對(duì)象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法
C++ 標(biāo)準(zhǔn)庫(kù)沒有提供所謂的日期類型,C++ 繼承了C語(yǔ)言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對(duì)象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法,需要的朋友可以參考下2021-12-12
C++使用異或運(yùn)算實(shí)現(xiàn)交換兩個(gè)數(shù)的值
交換兩個(gè)數(shù)的值,通常用利用一個(gè)變量來(lái)交換數(shù)值,異或交換兩個(gè)數(shù)的值是資源開銷最小的方法,不需要中介數(shù),原理簡(jiǎn)單的來(lái)說就是異或的負(fù)負(fù)得正2018-09-09
Windows環(huán)境給FFmpeg集成AVS3解碼器
libuavs3d是AVS3標(biāo)準(zhǔn)的解碼器,支持windows/linux/arm/ios等所有常用平臺(tái),在移動(dòng)端最高支持4K/30fps視頻實(shí)時(shí)解碼,解碼速度大幅領(lǐng)先AV1開源解碼器dav1d和aomdec,由于FFmpeg默認(rèn)未啟用libuavs3d,因此需要重新配置FFmpeg,標(biāo)明啟用libuavs3d,然后重新編譯安裝FFmpeg2024-05-05
C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解
這篇文章主要介紹了C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實(shí)現(xiàn)
了解搜索二叉樹是為了STL中的map和set做鋪墊,我們所熟知的AVL樹和平衡搜索二叉樹也需要搜索二叉樹的基礎(chǔ)。本文將詳解如何利用C++實(shí)現(xiàn)搜索二叉樹,需要的可以參考一下2022-05-05

