国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

c程序中多層if嵌套結(jié)構(gòu)的幾個優(yōu)化方法(深度好文)

2019-11-08 02:17:47
字體:
供稿:網(wǎng)友

關于c程序中多層嵌套結(jié)構(gòu)的優(yōu)化方法,在百度中找來找去,發(fā)現(xiàn)寫這方面的文章不多。下面就我個人總結(jié)出來的幾個方法,寫出來,與大家分享。也希望看到這篇文章的人,要是有更好的方法,也在底下評論留言。您的一點貢獻,也許會幫到困擾中的程序員^_^。有什么不足,也麻煩指出來下,共同進步。最后,打字不易,希望轉(zhuǎn)發(fā)的人,注明下原出處,謝謝!

方法一:并列法。

示例:

【優(yōu)化前】:

void func(void)

{

    if( status1() ){

        if( status2() ){

            if( status3() ){

                do_function();

            }

        }

    }

}

想必看到這個東西的人都很痛苦吧微笑,怎么優(yōu)化?其實很簡單,仔細看這結(jié)構(gòu),1.都沒有else;2.三個條件嵌套只做一件事情“do_function();”。那我們可以把這些條件給并列起來,即三個條件同時成立時,做“do_function();”。如下:

【優(yōu)化后】:

void func(void)

{

    if( status1() /

    && status2() /

    && status3() ){

        do_function();

    }

}

就這樣,三個if的嵌套結(jié)構(gòu),變成了1個if的普通條件判斷。

方法二:if-else倒置法。

示例1:

【優(yōu)化前】:

void func(void)

{

    if( status1() ){

do_function1();

        if( status2() ){

do_function2();

            if( status3() ){

                do_function3();

            }

            else{

                do_unfunction3();

            }

        }

        else{

            do_unfunction2();

        }

    }

    else{

            do_unfunction1();

    }

}

是不是又是心煩的一堆?仔細看這結(jié)構(gòu),可以發(fā)現(xiàn):1.第二個if在第一個if條件里面,第三個if在第二個if條件里面,也就是說,if都是堆積在一塊地方的;2.做完else的事情(do_unfunction1()或do_unfunction2()或do_unfunction3())就結(jié)束該函數(shù),退出去了。這樣,可以把else的條件改作if的條件,每次去除一層if嵌套結(jié)構(gòu)。什么意思呢?看下面,我們一步一步解開:

【中間過程優(yōu)化1】:

void func(void){    if( !status1() ){        do_unfunction1();

        return ;    }//////////////////////////這里是為了便于看清結(jié)構(gòu)    do_function1();    if( status2() ){        do_function2();        if( status3() ){            do_function3();        }        else{            do_unfunction3();        }    }    else{        do_unfunction2();    }//////////////////////////這里是為了便于看清結(jié)構(gòu)}

【中間過程優(yōu)化2】:

void func(void)

{    if( !status1() ){        do_unfunction1();        return ;    }    do_function1();    if( !status2() ){        do_unfunction2();        return ;    }//////////////////////////這里是為了便于看清結(jié)構(gòu)    do_function2();    if( status3() ){        do_function3();    }    else{        do_unfunction3();    }//////////////////////////這里是為了便于看清結(jié)構(gòu)}

【中間過程優(yōu)化3】:

void func(void){    if( !status1() ){        do_unfunction1();        return ;    }    do_function1();    if( !status2() ){        do_unfunction2();        return ;    }    do_function2();    if( !status3() ){        do_function3();        return ;    }//////////////////////////這里是為了便于看清結(jié)構(gòu)    do_function3();//////////////////////////這里是為了便于看清結(jié)構(gòu)}

咦,“解套了^o^”。沒錯,就是這樣!

【優(yōu)化后】:

void func(void){    if( !status1() ){        do_unfunction1();        return ;    }    do_function1();    if( !status2() ){        do_unfunction2();        return ;    }    do_function2();    if( !status3() ){        do_function3();        return ;    }    do_function3();}

【雜亂條件的規(guī)整】

示例2:

【優(yōu)化前】:

void func(void)

{

    if( status1() ){

        do_function1();

        if( status2() ){

            do_function2();

            if( status3() ){

                do_function3();

            }

            else{

                if( status4() ){

                    do_function4();

                }

                else{

                    do_unfunction4();

                }

                do_unfunction3();

            }

        }

        else{

            do_unfunction2();

        }

    }

    else{

        do_unfunction1();

    }

}

【優(yōu)化后】:

void func(void)

{

    if( status1() ){

        do_function1();

        if( status2() ){

            do_function2();

            if( !status3() ){

                if( status4() ){

                    do_function4();

                }

                else{

                    do_unfunction4();

                }

                do_unfunction3();

            }

            else{

                do_unfunction3();

            }

        }

        else{

            do_unfunction2();

        }

    }

    else{

        do_unfunction1();

    }

}

這樣,又回到了 方法二【示例1】的那種“if都堆積在一塊地方”的結(jié)構(gòu)去了,又可以使用方法二來解套。沒錯,就是要這樣!這種方法的核心思想就是:1.先把if-else嵌套結(jié)構(gòu)中的if歸到一塊去(if1嵌套if2,if2嵌套if3,if3嵌套if4。。。);2.else語句里面整到最后只能有簡單的順序執(zhí)行語句或者函數(shù)調(diào)用。然后,就可以放心的使用方法二【if-else倒置法】。方法三:查表法(這方法的一個好處就是:看懂了,很清晰)。拿方法二的【示例2】【優(yōu)化前】例子來作為示例:

【示例】:

【優(yōu)化前】

void func(void)

{

    if( status1() ){

        do_function1();

        if( status2() ){

            do_function2();

            if( status3() ){

                do_function3();

            }

            else{

                if( status4() ){

                    do_function4();

                }

                else{

                    do_unfunction4();

                }

                do_unfunction3();

            }

        }

        else{

            do_unfunction2();

        }

    }

    else{

        do_unfunction1();

    }

}

這種方法有一個前提,func函數(shù)中各個if條件里面的判斷都是獨立的。即:status1() 結(jié)果不受status2()、status3()、status4()的影響,status2()結(jié)果也不受其他3個影響,status3()、status4()道理一樣;

同時,status1() 、status2()、status3()、status4()也不能受“void func(void)”里面其他語句/函數(shù)(do_function1()、do_unfunction3()。。。)的影響。

下面的過程,要是看不懂,就慢慢去領悟吧,夜深了,不多說,抱歉!

【優(yōu)化后】

struct {

    unsigned int s;

//這里有4個do_func的函數(shù)參數(shù),原因是對應著4個if-else嵌套條件,并且抹掉每個if/else內(nèi)部if-else的條件后,上下部只有一個函數(shù)。在設計do_func函數(shù)時,也只要有4個函數(shù)參數(shù)就夠了

    void (*do_func_arg1)(void);

    void (*do_func_arg2)(void);

    void (*do_func_arg3)(void);

    void (*do_func_arg4)(void);

}handle_tbl[ ]={ //窮舉

    {0,do_unfunction1,NULL,NULL,NULL}, //這里的數(shù)字0,最好用宏表示,來表達一個含義。不然也要在這里注釋:0表示:AAA

    {1,do_unfunction1,NULL,NULL,NULL}, // 1:BBB

    {2,do_unfunction1,NULL,NULL,NULL}, // 2:CCC ,不注釋,誰看得懂啊~,你說是吧!

    {3,do_unfunction1,NULL,NULL,NULL},

    {4,do_unfunction1,NULL,NULL,NULL},

    {5,do_unfunction1,NULL,NULL,NULL},

    {6,do_unfunction1,NULL,NULL,NULL},

    {7,do_unfunction1,NULL,NULL,NULL},

    {8,do_function1,do_unfunction2,NULL,NULL},

    {9,do_function1,do_unfunction2,NULL,NULL},

    {10,do_function1,do_unfunction2,NULL,NULL},

    {11,do_function1,do_unfunction2,NULL,NULL},

    {12,do_function1,do_function2,NULL,do_unfunction4},

    {13,do_function1,do_function2,NULL,do_function4},

    {14,do_function1,do_function2,do_function3,NULL},

    {15,do_function1,do_function2,do_function3,NULL}

};

void do_func(void (*func1)(void), void (*func2)(void), void (*func3)(void), void (*func4)(void))

{

    if(NULL != func1)

        func1();

    if(NULL != func2)

        func2();

    if(NULL != func3)

        func3();

    if(NULL != func4)

        func4();

}

void func(void)

{

    unsignedint i;

    unsigned int s=0;

    s = (s<<1) + (status1()?1:0);

    s = (s<<1) + (status2()?1:0);

    s = (s<<1) + (status3()?1:0);

    s = (s<<1) + (status4()?1:0);

    for(i=0;i<sizeof(handle_tbl)/sizeof(handle_tbl[0]);i++){

        if(i==s) { // s其實是可以自由發(fā)揮的,這時,這里的條件換個方式來表示

            do_func(handle_tbl[ i].do_func_arg1,handle_tbl[ i].do_func_arg2,handle_tbl[ i].do_func_arg3,handle_tbl[ i].do_func_arg4);

        }

    }

}

以上的這幾個“解套”方法,個人的一點經(jīng)驗總結(jié)。希望對你有用。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五家渠市| 浦县| 绥中县| 卢氏县| 京山县| 兴隆县| 贵溪市| 乡城县| 康马县| 淄博市| 留坝县| 凤凰县| 扶风县| 揭阳市| 龙川县| 浠水县| 咸宁市| 家居| 新乡市| 延庆县| 海门市| 将乐县| 攀枝花市| 贵定县| 鄄城县| 常德市| 前郭尔| 察隅县| 重庆市| 霍林郭勒市| 曲沃县| 新丰县| 延吉市| 莱州市| 德江县| 开平市| 介休市| 五河县| 安宁市| 新龙县| 来安县|