通過(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)容:
- 程序的運(yùn)算和邏輯判斷
- 三種程序流程控制結(jié)構(gòu)詳解。
- 養(yǎng)成良好的代碼編寫(xiě)風(fēng)格。
- 結(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]是我們的變量x,dword 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ù):num001、num002、num003中選出最大的數(shù)來(lái)。
至于與這些if有關(guān)的匯編指令就是跳轉(zhuǎn),像sub,cmp,test,之類的比較指令來(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)始比較i和x兩個(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è),靈活一下。