亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    長(zhǎng)跳轉(zhuǎn)的實(shí)現(xiàn)

    原帖及討論:http://bbs.bccn.net/thread-221066-1-1.html

    */ ————————————————————————————–
    */ 出自: 快樂編程 http://hi.bccn.net/108519
    */ 作者: neverTheSame E-mail:zhaoxufeng9997@126.com QQ:475818502
    */ 時(shí)間: 2008-6-1
    */ 聲明: 尊重作者勞動(dòng),轉(zhuǎn)載請(qǐng)保留本段文字
    */ ————————————————————————————–

    長(zhǎng)跳轉(zhuǎn)的實(shí)現(xiàn)

    你想知道goto語(yǔ)句都實(shí)現(xiàn)不了的跳轉(zhuǎn)嗎?
    你想知道從一個(gè)函數(shù)跳轉(zhuǎn)到另一個(gè)函數(shù)的內(nèi)部的某個(gè)語(yǔ)句的原理嗎?
    你想知道怎么實(shí)現(xiàn)從一個(gè)函數(shù)跳轉(zhuǎn)到另一個(gè)函數(shù)的內(nèi)部的某個(gè)語(yǔ)句嗎?

    那么開始了解長(zhǎng)跳轉(zhuǎn)(long jump)吧。
    長(zhǎng)跳轉(zhuǎn)(long jump)的原理是:設(shè)置一條語(yǔ)句的唯一標(biāo)識(shí)(setjmp(jmp_buf jmpb)),再通過長(zhǎng)跳轉(zhuǎn)(longjmp(jmp_buf jmpb, int retval))
    轉(zhuǎn)到j(luò)mpb所標(biāo)識(shí)的語(yǔ)句。

    先看一下setjmp和longjmp這兩個(gè)函數(shù)的用法吧。
    函數(shù)名:  setjmp
    函數(shù)原型:int _Cdecl setjmp(jmp_buf jmpb);
    作用:    設(shè)置非本地跳轉(zhuǎn)。即一個(gè)返回點(diǎn),當(dāng)程序調(diào)用longjmp函數(shù)(不論longjmp()和setjmp()是否在同一個(gè)函數(shù)或同一個(gè)作用域。)時(shí),
              就可以返回到這個(gè)返回點(diǎn),繼續(xù)從這個(gè)點(diǎn)往下執(zhí)行。
    形參:    jmpb用來保護(hù)現(xiàn)場(chǎng)。
    返回值:  首次調(diào)用返回0,當(dāng)longjmp()返回時(shí),調(diào)用返回值用longjmp()設(shè)定。

    函數(shù)名:  longjmp
    函數(shù)原型:void _Cdecl longjmp(jmp_buf jmpb, int retval);
    作用:    返回到setjmp()所設(shè)置的返回點(diǎn)。
    形參:    jmpb:用于恢復(fù)現(xiàn)場(chǎng)(由調(diào)用setjmp()時(shí)設(shè)置的)
              retval:返回到setjmp()所在的位置時(shí),設(shè)置第二次setjmp()的返回值。
    返回值:  無(wú)

    再來看看它的使用例子吧。
    #include<stdio.h>
    #include<conio.h>
    #include<setjmp.h>

    void longjmpfun(jmp_buf jumpPointer);
    int main(void)
    {
        int value;
        jmp_buf jumpPointer;

        printf(“Function “setjmp” return value: %dn”,
        (value=setjmp(jumpPointer)));      /*當(dāng)使用longjmp跳回來的時(shí)侯,
                                           value為longjmp(jmp_buf jmpb, int retval)中的retval*/

        if(value==0)                       /*setjmp最初調(diào)用的時(shí)侯返回0*/
        {
            printf(“Be about to call longjmp…n”);
            longjmpfun(jumpPointer);
        }
        else
        {
            printf(“Return to “setjmp” function”);
        }

        return 0;
    }

    void longjmpfun(jmp_buf jumpPointer)
    {
        printf(“Be in longjmpfunn”);
        longjmp(jumpPointer,10);
    }

    運(yùn)行結(jié)果:
    Function “setjmp” return value: 0
    Be about to call longjmp…
    Be in longjmpfun
    Function “setjmp” return value: 10

    從上面的例子中,我們可以看出setjmp與longjmp的功能強(qiáng)大。

    作者建議:長(zhǎng)跳轉(zhuǎn)是匯編語(yǔ)言到C語(yǔ)言的一種延續(xù),但一般情況不要用這種方法。這會(huì)造成程序的閱讀性與可理解性的災(zāi)難。

    講解長(zhǎng)跳轉(zhuǎn)的知識(shí),只是讓大家了解有這么一種方法,希望大家只作學(xué)術(shù)上的探討,不要用之于實(shí)際工作中。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)