• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            聚星亭

            吾笨笨且懶散兮 急須改之而奮進(jìn)
            posts - 74, comments - 166, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                通過(guò)上次課題的講述,相信大家一定對(duì)什么是數(shù)據(jù)及數(shù)據(jù)的定義和使用方法有一定的了解了,在看本次課題之前希望大家能趁熱打鐵,再到網(wǎng)上下本C語(yǔ)言的教程,最好是買本數(shù)來(lái)鞏固下變量相關(guān)的知識(shí)。

             

            大家明白了怎么定義變量,怎么給變量賦值了,自然的就應(yīng)該進(jìn)一步了解一下一些詳細(xì)的代碼怎么編寫(xiě)了。

             

            今天我們的任務(wù)比較簡(jiǎn)單,就講一下如何編寫(xiě)代碼及實(shí)現(xiàn)代碼的流程控制。應(yīng)該說(shuō)這個(gè)是非常簡(jiǎn)單的東西了,本來(lái)我沒(méi)打算講它,可是本著一步一個(gè)腳印的原則,我還是簡(jiǎn)要的說(shuō)一下。在本次課題之后,我會(huì)緊跟著出一個(gè)函數(shù)的專題,來(lái)作為代碼篇的完善,至此大家應(yīng)該能獨(dú)立的寫(xiě)自己的程序了。

             

            本次課題知識(shí)點(diǎn)不是很多(也不少,但是都很簡(jiǎn)單。),主要是在于多寫(xiě),多練,知道自己能把一些現(xiàn)實(shí)的問(wèn)題轉(zhuǎn)換成代碼來(lái)解決問(wèn)題。

             

                   不多廢話,先說(shuō)下本次課題要寫(xiě)的主要內(nèi)容:

            1. 程序的運(yùn)算和邏輯判斷
            2. 三種程序流程控制結(jié)構(gòu)詳解。
            3. 養(yǎng)成良好的代碼編寫(xiě)風(fēng)格。
            4. 結(jié)束語(yǔ)

             

            下面開(kāi)始進(jìn)入正題。

            一、           程序的運(yùn)算和邏輯判斷。

            說(shuō)計(jì)算是電腦最基本的功能,相必沒(méi)有人會(huì)反對(duì)的。做程序,自然最基礎(chǔ)的就是這些運(yùn)算了。

            我知道,看這個(gè)破爛文章的朋友對(duì)數(shù)據(jù)應(yīng)該都是不感冒的。不過(guò)大家放心,這里牽扯的運(yùn)算都很簡(jiǎn)單,就是小學(xué)的加、減、成、除、取余數(shù),是、非、與或和位移,沒(méi)別的了。先讓我們來(lái)了解下算術(shù)運(yùn)算。

            1.         算術(shù)運(yùn)算。

            加減乘除相比大家都應(yīng)該很了解的。這里我不想費(fèi)太多的篇幅講述這些大家都明白的知識(shí),我把要說(shuō)的知識(shí)列出來(lái),大家自己了解就好。

             

            用于算術(shù)運(yùn)算的運(yùn)算符有:

             

            我想不用我說(shuō),加、減、成、除這些運(yùn)算符大家都接觸過(guò)的,關(guān)于“%”運(yùn)算符,其實(shí)就是取余數(shù);用這些運(yùn)算符可以將一些數(shù)字,變量等連接起來(lái),進(jìn)行運(yùn)算,這樣的式子叫做表達(dá)式。例如:

            int i =5;

            i +7;     // 這里就是一個(gè)表達(dá)式。

             

            =”這個(gè)運(yùn)算符其實(shí)不屬于算術(shù)運(yùn)算,它也并非是我們數(shù)學(xué)課上講的“等于”,而是一個(gè)“賦值”運(yùn)算符,它用來(lái)將一個(gè)常量(數(shù)字、字母等)賦值給一個(gè)變量的賦值運(yùn)算符,由于我們進(jìn)行算術(shù)運(yùn)算以后,通常都會(huì)將運(yùn)算結(jié)果保存到一個(gè)變量中,所以,我把這個(gè)賦值運(yùn)算符歸類到這里。而我們?nèi)粘5?#8220;等于”運(yùn)算符是:“= =”,它屬于邏輯運(yùn)算符,我們將在下一節(jié)中講到它。

             

            關(guān)于“++ —”這兩個(gè)運(yùn)算符,上圖中已經(jīng)說(shuō)明了,它是對(duì)變量的對(duì)自己的自加或者自減運(yùn)算,等同于:變量 = 變量+1; 或者 變量 = 變量 1;

             

            現(xiàn)在讓我們來(lái)舉幾個(gè)例子,來(lái)說(shuō)明下這些算術(shù)運(yùn)算符的用法。

            void  main()

            {

                 int x = 1;

                 int y = 2;

                 int z = 20;

             

                 x ++;         // 等同于x = x + 1;

                 y --;         // 等同于y = y - 1;

             

                 z /= x;       // 等同于z = z / 1;

                 printf("%d, %d, %d\n", x, y, z);    // 打印 x,y,z 的結(jié)果。

             

                 z %= x;  // 計(jì)算得出 z / x 以后的余數(shù)

             

                 x = x+y;

                 z -= x;

                 printf("%d, %d, %d\n", x, y, z);   // 打印 x,y,z 的結(jié)果。

            }

             

            請(qǐng)先不要看下面的截圖,先看下這個(gè)程序,分析一下,這兩次的輸出結(jié)果會(huì)是多少,然后對(duì)比下圖:

            看下就算的是不是正確,如果正確了,那恭喜你,基礎(chǔ)的算術(shù)運(yùn)算就算通過(guò)了,接下來(lái),我們需要調(diào)試這段代碼,來(lái)熟悉一些相關(guān)的匯編命令,具體操作如下圖所示:

            在代碼上右擊鼠標(biāo),選擇如下命令:

             

            我們來(lái)詳細(xì)分析一下我們現(xiàn)在看到的代碼:

            1:    #include "stdio.h"

            2:

            3:    void main()

            4:    {

              00401010   push        ebp

              00401011   mov         ebp,esp   ;// 將現(xiàn)有的堆棧給了EBP寄存器。

              00401013   sub         esp,4Ch   ;// 分配x4C大小的堆棧空間用來(lái)運(yùn)算。

              00401016   push        ebx

              00401017   push        esi

              00401018   push        edi       ;// 保存寄存器環(huán)境。

              00401019   lea         edi,[ebp-4Ch] ;// 這里用ebp寄存器減去一個(gè)偏移來(lái)定位我們定義的變量,

              0040101C   mov         ecx,13h   ;// 這里-4Ch是用來(lái)定位到堆棧頭,把堆棧內(nèi)容改成int3中斷以免內(nèi)存泄露。

              00401021   mov         eax,0CCCCCCCCh     ;// 以上操作是保存堆棧環(huán)境,分配堆棧空間。

              00401026   rep stos    dword ptr [edi]    ;// 在下一次課題講述函數(shù)時(shí),我們會(huì)講到,這里大家可以略過(guò)。

            5:        int x = 1;

              00401028   mov    dword ptr [ebp-4],1;// [ebp-4]是我們的變量xdword ptr是用來(lái)修飾這個(gè)變量是DWORD類型(也就是整型)。

            6:        int y = 2;

              0040102F   mov         dword ptr [ebp-8],2;// MOV就是匯編指令,相當(dāng)于我們C語(yǔ)言中"=" 賦值運(yùn)算符,它的具體用法自己百度。

            7:        int z = 20;

              00401036   mov         dword ptr [ebp-0Ch],14h

            8:

            9:        x ++;       // 等同于x = x + 1;

              0040103D   mov         eax,dword ptr [ebp-4]

              00401040   add         eax,1; // add指令就是我們C語(yǔ)言的"+"運(yùn)算符,還有一個(gè)INC指令相當(dāng)于我們的"++"運(yùn)算符

              00401043   mov         dword ptr [ebp-4],eax

            10:       y --;       // 等同于y = y - 1;

              00401046   mov         ecx,dword ptr [ebp-8]

              00401049   sub         ecx,1

              0040104C   mov         dword ptr [ebp-8],ecx

            11:

            12:       z /= x;     // 等同于z = z / 1;

              0040104F   mov         eax,dword ptr [ebp-0Ch]

              00401052   cdq

              00401053   idiv        eax,dword ptr [ebp-4]

              00401056   mov         dword ptr [ebp-0Ch],eax

            13:       printf("%d, %d, %d\n", x, y, z);

              00401059   mov         edx,dword ptr [ebp-0Ch]

              0040105C   push        edx

              0040105D   mov         eax,dword ptr [ebp-8]

              00401060   push        eax

              00401061   mov         ecx,dword ptr [ebp-4]

              00401064   push        ecx

              00401065   push        offset string "%d, %d, %d\n" (0042001c)   // 傳遞參數(shù),具體規(guī)則將在下次課題“函數(shù)”中講述。

              0040106A   call        printf (004010f0)       ; // 調(diào)用printf函數(shù)打印結(jié)果

              0040106F   add         esp,10h       ; // 這里是C條用的對(duì)戰(zhàn)平衡方式。(具體將在下次課題“函數(shù)”中講述)

            14:

            15:       z %= x;

              00401072   mov         eax,dword ptr [ebp-0Ch]

              00401075   cdq

              00401076   idiv        eax,dword ptr [ebp-4]

              00401079   mov         dword ptr [ebp-0Ch],edx

            16:

            17:       x = x+y;

              0040107C   mov         edx,dword ptr [ebp-4]

              0040107F   add         edx,dword ptr [ebp-8]

              00401082   mov         dword ptr [ebp-4],edx

            18:       z -= x;

              00401085   mov         eax,dword ptr [ebp-0Ch]

              00401088   sub         eax,dword ptr [ebp-4]

              0040108B   mov         dword ptr [ebp-0Ch],eax

            19:       printf("%d, %d, %d\n", x, y, z);

              0040108E   mov         ecx,dword ptr [ebp-0Ch]

              00401091   push        ecx

              00401092   mov         edx,dword ptr [ebp-8]

              00401095   push        edx

              00401096   mov         eax,dword ptr [ebp-4]

              00401099   push        eax

              0040109A   push        offset string "%d, %d, %d\n" (0042001c)

              0040109F   call        printf (004010f0)

              004010A4   add         esp,10h

            20:   }

              004010A7   pop         edi                     ; // 恢復(fù)寄存器環(huán)境

              004010A8   pop         esi

              004010A9   pop         ebx

              004010AA   add         esp,4Ch                 ; // 平衡堆棧

              004010AD   cmp         ebp,esp

              004010AF   call        __chkesp (00401170)     ; // DEBUG 模式程序?qū)S玫亩褩z查函數(shù)。

              004010B4   mov         esp,ebp

              004010B6   pop         ebp

            004010B7   ret

             

            相信你根據(jù)上述代碼中的提示,應(yīng)該能將這個(gè)匯編代碼看的差不多,當(dāng)然,看不明白也沒(méi)有關(guān)系,我們需要掌握的匯編指令及其用法很少,就下面幾個(gè):

                   mov/lea:         賦值/取地址。

                   add:               加法指令。

                   sub:               減法指令。

                   div/idiv:          除法指令。

                   mul/imul:        乘法指令。

            這些匯編指令的具體用法大家自己百度或者參考相關(guān)資料,這里不做詳細(xì)說(shuō)明, 下面開(kāi)始我們的邏輯、關(guān)系運(yùn)算。

            2.         邏輯、關(guān)系運(yùn)算。

            提起什么邏輯運(yùn)算,或者什么關(guān)系運(yùn)算,看名字貌似很復(fù)雜的。不過(guò)這里可能讓大家放心的是,這些運(yùn)算我們?nèi)粘I钪薪?jīng)常用到,無(wú)非就是 真的,假的,是,不是,并且,或者之類的操作。

             

            用于邏輯運(yùn)算的運(yùn)算符有如下幾個(gè):

            運(yùn)算符

            含義

            &&

             與(并且)

            ||

            或(或者)

            !

            非(不是)

                         

                                 用于關(guān)系運(yùn)算的運(yùn)算符有如下幾個(gè):

                                

            這些運(yùn)算無(wú)非就是為了判斷一個(gè)表達(dá)式成立不成立,在C語(yǔ)言中,只要表達(dá)式的值不為零并且符合關(guān)系運(yùn)算符的要求,那這個(gè)表達(dá)式就成立的,就可以用上述的兩種運(yùn)算符進(jìn)行比較運(yùn)算,一般情況下,這些運(yùn)算符會(huì)配合下節(jié)我們要講述的流程控制語(yǔ)句來(lái)使用,所以這里我就不給出具體用法的例子了,有情趣的朋友,可以繼續(xù)看下面章節(jié)中的例子

             

            到現(xiàn)在我想主要的運(yùn)算我都講完了,雖然不是很詳細(xì),但是我想,只要大家堅(jiān)持努力,多多百度,這些知識(shí)一定會(huì)掌握好的。

             

            小學(xué)的時(shí)候,我們學(xué)過(guò)四則運(yùn)算,在運(yùn)算的時(shí)候,遵循先乘除,后加減,有括弧的先算括弧里面的,這個(gè)規(guī)則在這里一樣使用,只不過(guò)在編程環(huán)境中,運(yùn)算符很多,所以需要有個(gè)更為詳細(xì)的運(yùn)算符優(yōu)先級(jí)表。這里我把它貼出來(lái),但是還希望大家能夠盡量的使用括弧來(lái)讓人看的容易,以免出錯(cuò),具體優(yōu)先級(jí)表轉(zhuǎn)載如下:

            更詳細(xì)的用法可以參考如下鏈接:http://www.xxlinux.com/linux/article/development/soft/20060909/4128.html

            二、           三種程序流程控制結(jié)構(gòu)詳解。

            有了上述的運(yùn)算,我想大家都可以寫(xiě)出一些很簡(jiǎn)單的代碼了,但是我們?cè)趯?xiě)代碼的時(shí)候,肯定會(huì)遇到類似這樣的問(wèn)題:

            Ø         有時(shí)候,我們寫(xiě)的代碼必須要在達(dá)到某種條件之后才可以執(zhí)行,否則不讓運(yùn)行。

            Ø         有時(shí)候,我們寫(xiě)的代碼很龐大,很羅嗦,因?yàn)樗袔追N可能需要我們來(lái)寫(xiě)出幾個(gè)程序。

            Ø         有時(shí)候,我們寫(xiě)的代碼需要一直重復(fù)執(zhí)行直到某種條件不成立了才不執(zhí)行。

             

            只要你遇到過(guò)上述的問(wèn)題,那我們這節(jié)課的內(nèi)容就正是你所需要的。不多廢話,進(jìn)入正題:

            1.         順序結(jié)構(gòu)

            到現(xiàn)在為止,我們寫(xiě)的所有的代碼都是順序結(jié)構(gòu)的,所謂順序結(jié)構(gòu),就是代碼從第一條指令開(kāi)始執(zhí)行,直到執(zhí)行完最后一條。中間不會(huì)落下任何一條指令。

             

            想必大家現(xiàn)在應(yīng)該能理解什么是順序結(jié)構(gòu)了,所以我不想再這里浪費(fèi)太多的篇幅,直接進(jìn)入下一小節(jié)。

            2.         分支結(jié)構(gòu)

            所謂分支結(jié)構(gòu),就是代碼在達(dá)到某種條件的時(shí)候,執(zhí)行某些指令,否則就執(zhí)行別的指令。

            分支結(jié)構(gòu)是改變代碼執(zhí)行順序最簡(jiǎn)單的方式,所以大家一定可以很容易的掌握它的,下面讓我們一個(gè)一個(gè)的來(lái)看。

            a)        if … else結(jié)構(gòu)

            這個(gè)結(jié)構(gòu)算是編程中最基礎(chǔ)的結(jié)構(gòu)了,它有三種格式,我在這里列出來(lái),大家可以根據(jù)實(shí)際情況選擇使用哪個(gè):

            第一種格式:

            if (條件表達(dá)式)

            {   

                 //條件成立時(shí)執(zhí)行這里的語(yǔ)句

                

            }

            第二種格式:

            if (條件表達(dá)式)

            {   

                 //條件成立時(shí)執(zhí)行這里的語(yǔ)句

                

            }

            else

            {

                 //條件不成立時(shí)執(zhí)行這里的語(yǔ)句

                

            }

            第三種格式:

            if (條件表達(dá)式1)    

            {

                 //條件表達(dá)式1成立時(shí)執(zhí)行這里的語(yǔ)句

                

            }                   

            else if (條件表達(dá)式2)  // 這里的else if可以有無(wú)限多個(gè)(如果有很多個(gè)時(shí)可以參考使用switch語(yǔ)句)。

            { 

                 //條件表達(dá)式2成立時(shí)執(zhí)行這里的語(yǔ)句

                

            }                   

            else                

            {

                 //條件表達(dá)式都不成立時(shí)執(zhí)行這里的語(yǔ)句

                

            }   

             

                                        為了更好的說(shuō)明這個(gè)語(yǔ)句的用法,我舉個(gè)例子:

            int MaxNum(int num001,  int num002,  int num003)

            {

                 if (num001 >= num002)

                 {

                     if (num001 >= num003)

                     {

                          return num001;         // num001 作為函數(shù)的結(jié)果返回出來(lái)。

                     }

                     else

                     {

                          return num003;

                     }

                 }

                 else

                 {

                     if (num002 >= num003)

                     {

                          return num002;

                     }

                     else

                     {

                          return num003;

                     }

                 }

            }

                                 說(shuō)明:上述代碼中的功能是從提供的三個(gè)數(shù):num001num002num003中選出最大的數(shù)來(lái)。

            至于與這些if有關(guān)的匯編指令就是跳轉(zhuǎn),像subcmptest,之類的比較指令來(lái)影響相應(yīng)的標(biāo)志寄存器還有JE,JNE,JB,JNB之類的跳轉(zhuǎn)指令來(lái)跳轉(zhuǎn)到指定的代碼中執(zhí)行,大家可以像我們分析算術(shù)運(yùn)算的方式一樣,去調(diào)試它,去分析它,去掌握這些比較和跳轉(zhuǎn)指令的用法。

             

            這里我就省下篇幅,繼續(xù)我們的switch結(jié)構(gòu)。

            b)        switch … 結(jié)構(gòu)

            上小節(jié)中講述的if語(yǔ)句,是用于少數(shù)分支時(shí)的處理語(yǔ)句,它寫(xiě)起來(lái)方便,代碼簡(jiǎn)潔明了,但是如果一些表達(dá)式的結(jié)構(gòu)可能有5種甚至更多種結(jié)果,需要我們分別作出不同的處理時(shí),最好的選擇就是用wsitch語(yǔ)句。      

            先說(shuō)明一下switch結(jié)構(gòu)的語(yǔ)法格式:

            switch(表達(dá)式結(jié)果或者存放結(jié)果的變量)

            {

            case  結(jié)果1:

                 // 當(dāng)switch后的括弧中的值是結(jié)果時(shí),就執(zhí)行這里的語(yǔ)句

                 ...;

                 break;   // break是用來(lái)跳出分支結(jié)構(gòu)的關(guān)鍵字,如果這里沒(méi)有它,只要結(jié)果是結(jié)果1,那從結(jié)果1開(kāi)始向下的所有指令都會(huì)被執(zhí)行(包括結(jié)果2,結(jié)果3……)。

             

            case  結(jié)果2:

                 // 當(dāng)switch后的括弧中的值是結(jié)果時(shí),就執(zhí)行這里的語(yǔ)句

                 ...;

                 break;   // 如果這里沒(méi)有這個(gè)關(guān)鍵字時(shí),只要上面的結(jié)果是結(jié)果2,那從結(jié)果2開(kāi)始向下的所有指令都會(huì)被執(zhí)行(包括結(jié)果3,結(jié)果4……)。

             

            case  結(jié)果3:

                 // 當(dāng)switch后的括弧中的值是結(jié)果時(shí),就執(zhí)行這里的語(yǔ)句

                 ...;

                 break;   // 同上

             

            case  結(jié)果N:

                 // 當(dāng)switch后的括弧中的值是結(jié)果N時(shí),就執(zhí)行這里的語(yǔ)句

                 ...;

                 break;  

             

            default:

                 // 當(dāng)switch后的括弧中的值不是上面列出的任何一個(gè)值時(shí),就執(zhí)行這里的語(yǔ)句

                 ...;

            }

             

                                 這里寫(xiě)的可能有點(diǎn)模糊,我給出一個(gè)代碼片段,我說(shuō)明一下switch語(yǔ)句的用法:

            PGAME_CHAR_INFO pGCI = GetCharInfoPoint();

            switch (pGCI->dwZhiYe)

            {

            case 1:

                 lstrcpyW(szTemp, L"靈劍\0");

                 break;

            case 2:

                 lstrcpyW(szTemp, L"日羽\0");

                 break;

            case 3:

                 lstrcpyW(szTemp, L"槍俠\0");

                 break;

            case 4:

                 lstrcpyW(szTemp, L"薩滿\0");

                 break;

            case 5:

                 lstrcpyW(szTemp, L"法皇\0");

                 break;

            case 6:

                 lstrcpyW(szTemp, L"藥王\0");

                 break;

            default:

                 lstrcpyW(szTemp, L"未知\0");

                 break;

            }

             

            其實(shí),這個(gè)switch的匯編形式跟if結(jié)構(gòu)很像,唯一的區(qū)別就是每個(gè)分支后面都會(huì)有一個(gè)break跳轉(zhuǎn)(JMP)指令,大家可以自己試著去調(diào)試這段代碼,分析一下盡量掌握這些代碼的匯編形式。

            3.         循環(huán)結(jié)構(gòu)

            所謂循環(huán)結(jié)構(gòu),就是一直重復(fù)執(zhí)行某段指定的語(yǔ)句,知道條件不滿足了為止。

            a)        for循環(huán)結(jié)構(gòu)

            好,按照我們的習(xí)慣,我先寫(xiě)出這個(gè)語(yǔ)句的基本語(yǔ)法結(jié)構(gòu):

            for (初始值; 滿足條件; 增量)

            {

                 要循環(huán)的語(yǔ)句;

            }

                                        例如下面的代碼:

            #include "stdio.h"

             

            void main()

            {

                 int i = 10;

                

                 // 循環(huán)打印輸出0到之間的所有自然數(shù)。

                 for (int x = 0; x < i; x++)

                 {

                     printf("%d\n", x);

                 }

            }

                                        打印結(jié)果如下:


                                        通過(guò)這個(gè)結(jié)果和上面的語(yǔ)法結(jié)構(gòu),我們可以猜測(cè)出for語(yǔ)句的執(zhí)行流程如下圖所示:

             

            左圖中描述了for語(yǔ)句的執(zhí)行流程,先從上面的語(yǔ)句中執(zhí)行到for關(guān)鍵字,然后開(kāi)始初始化操作,在判斷一下循環(huán)的條件是否滿足:

             

                   如果條件滿足,則繼續(xù)按照綠色的箭頭執(zhí)行,開(kāi)始執(zhí)行要循環(huán)的語(yǔ)句,執(zhí)行完以后,會(huì)來(lái)到增量(或叫 步長(zhǎng))這個(gè)語(yǔ)句對(duì)計(jì)數(shù)器(記錄循環(huán)次數(shù)的變量)進(jìn)行增加,然后在去判斷是否滿足循環(huán)條件,如果滿足繼續(xù)執(zhí)行要循環(huán)的語(yǔ)句,如此循環(huán)。

             

            直到條件不滿足了,按照紫色箭頭所示,跳出循環(huán)繼續(xù)執(zhí)行后面的語(yǔ)句。

             

                   現(xiàn)在讓我們來(lái)調(diào)試跟蹤一下上面的那段程序, 確切的體會(huì)下電腦是如何執(zhí)行循環(huán)語(yǔ)句的:

            1:    #include "stdio.h"

            2:

            3:    void main()

            4:    {

                 00401010   push        ebp

                 00401011   mov         ebp,esp

                 00401013   sub         esp,48h

                 00401016   push        ebx

                 00401017   push        esi

                 00401018   push        edi

                 00401019   lea         edi,[ebp-48h]

                 0040101C   mov         ecx,12h

                 00401021   mov         eax,0CCCCCCCCh

                 00401026   rep stos    dword ptr [edi]

            5:        int i = 10;

                 00401028   mov         dword ptr [ebp-4],0Ah   ; // 初始化變量i

            6:

            7:        // 循環(huán)打印輸出0到之間的所有自然數(shù)。

            8:        for (int x = 0; x < i; x++)

                     0040102F   mov         dword ptr [ebp-8],0     ; // 初始化x變量

                     00401036   jmp         main+31h (00401041)     ; // 強(qiáng)制跳到1041 這個(gè)位置

                     00401038   mov         eax,dword ptr [ebp-8]

                     0040103B   add         eax,1                       ; // 自變量加一,繼續(xù)判斷比較

                     0040103E   mov         dword ptr [ebp-8],eax

                     00401041   mov         ecx,dword ptr [ebp-8]   ; // 開(kāi)始比較ix兩個(gè)變量

                     00401044   cmp         ecx,dword ptr [ebp-4]

                     00401047   jge         main+4Ch (0040105c); // 如果ebp-8得值(也就是x的值)大于等于i的值則跳出循環(huán)

            9:        {

            10:           printf("%d\n", x);

                     00401049   mov         edx,dword ptr [ebp-8]

                     0040104C   push        edx

                     0040104D   push        offset string "%d\n" (0042001c)

                     00401052   call        printf (00401090)       ; // 打印變量

                     00401057   add         esp,8

            11:       }

                     0040105A   jmp         main+28h (00401038)         ; // 調(diào)回去,累加器加一,然后繼續(xù)循環(huán)

            12:   }

                 0040105C   pop         edi           ; // 退出循環(huán),恢復(fù)上下文環(huán)境。

                 0040105D   pop         esi

                 0040105E   pop         ebx

                 0040105F   add         esp,48h       ; // 平衡堆棧。

                 00401062   cmp         ebp,esp

                 00401064   call        __chkesp (00401110)

                 00401069   mov         esp,ebp

                 0040106B   pop         ebp

                 0040106C   ret

            好,到這里相信大家對(duì)for循環(huán)已經(jīng)明白了,其實(shí)那個(gè)語(yǔ)法結(jié)構(gòu)中的什么初始化,什么增量,無(wú)所謂的,只要明白了它的執(zhí)行順序,然后寫(xiě)上相應(yīng)的代碼就可以了,接下來(lái)就是多多使用它,熟練它就好。

            b)        while循環(huán)結(jié)構(gòu)

            for循環(huán)相比,while有很多的優(yōu)點(diǎn),當(dāng)然它也簡(jiǎn)單的一塌糊涂。我直截了當(dāng)?shù)恼f(shuō)下這個(gè)while語(yǔ)句的兩種寫(xiě)法和它們之間的區(qū)別:

                

            按照 for 語(yǔ)句中圖的分析方法,可以看出while的兩種寫(xiě)法都比較容易,它們的區(qū)別也很明顯,一個(gè)先判斷下是否應(yīng)該循環(huán),另一個(gè)就不管三七二十一,先執(zhí)行一遍循環(huán)體再說(shuō)……

             

                   這個(gè)while語(yǔ)句比較容易,而且與for可以兼容,所以這里我就不再浪費(fèi)篇幅去分析它了。大家如果有想去可以自己分析一下,看下它們的匯編模樣。

             

                   到這里,我們這一小節(jié)的所有知識(shí)點(diǎn)都已經(jīng)說(shuō)完了,希望大家能靈活運(yùn)用它們,根據(jù)實(shí)際情況,它們之間是可以嵌套的,比如if語(yǔ)句中使用for語(yǔ)句,for語(yǔ)句中使用一個(gè)switch語(yǔ)句,等等。

            三、           養(yǎng)成良好的代碼編寫(xiě)風(fēng)格。

            引用一下高質(zhì)量C++/C編程指南:http://man.chinaunix.net/develop/c&c++/c/c.htm(只看能看懂的部分)

            四、           結(jié)束語(yǔ)

            通過(guò)本次專題的學(xué)習(xí),我相信大家可以寫(xiě)一個(gè)很基礎(chǔ)的代碼了,再配合我們下節(jié)課要講述的內(nèi)容,我們的基礎(chǔ)部分就要結(jié)束了。

             

            多寫(xiě)程序,多看人家的程序,多作一些C語(yǔ)言的作業(yè),靈活一下。

             

            Feedback

            # re: 2、數(shù)據(jù)的存儲(chǔ)空間 ------ 變量  回復(fù)  更多評(píng)論   

            2009-04-17 19:26 by wahaha
            講的很不錯(cuò),希望繼續(xù),關(guān)注ING。。。

            # re: 2、數(shù)據(jù)的存儲(chǔ)空間 ------ 變量  回復(fù)  更多評(píng)論   

            2009-06-03 20:49 by cntrump
            好像不通用吧,我在VC6下編譯通過(guò),運(yùn)行時(shí)程序崩潰

            # re: 2、數(shù)據(jù)的存儲(chǔ)空間 ------ 變量  回復(fù)  更多評(píng)論   

            2009-06-09 13:53 by bester
            @cntrump
            release 編譯運(yùn)行就應(yīng)該OK了。

            # re: 2、數(shù)據(jù)的存儲(chǔ)空間 ------ 變量  回復(fù)  更多評(píng)論   

            2009-09-08 15:31 by 迷途流浪
            變量聲明格式應(yīng)該包括:數(shù)據(jù)存儲(chǔ)方式
            說(shuō)法要嚴(yán)謹(jǐn)
            久久91亚洲人成电影网站| 久久精品天天中文字幕人妻| 国内精品久久久久久麻豆| 韩国三级中文字幕hd久久精品| 精品久久久久国产免费| 亚洲а∨天堂久久精品| 欧美大香线蕉线伊人久久| 香蕉久久一区二区不卡无毒影院 | 久久九九免费高清视频| 亚洲色欲久久久久综合网| 午夜精品久久久久久久| 91久久精品国产免费直播| 亚洲国产精品成人久久蜜臀 | 久久精品综合一区二区三区| 欧美日韩精品久久久久| 久久精品国产99国产电影网| 久久婷婷色综合一区二区| 乱亲女H秽乱长久久久| 久久国产精品一区| 三上悠亚久久精品| 久久一本综合| 久久99精品国产麻豆| 无码任你躁久久久久久久| 久久亚洲国产精品一区二区| 久久99热这里只有精品国产| 2021国产成人精品久久| 久久婷婷国产综合精品| 亚洲欧美久久久久9999| 久久青草国产精品一区| 2019久久久高清456| 久久国产高清一区二区三区| 久久久久亚洲AV片无码下载蜜桃| 久久综合伊人77777| 久久精品国产99国产电影网| 欧美亚洲色综久久精品国产| 久久亚洲国产成人影院网站| 久久精品国产亚洲沈樵| 亚洲AV无码久久精品狠狠爱浪潮| 青青草国产97免久久费观看| 国产69精品久久久久777| 人妻久久久一区二区三区|