謹(jǐn)記
每當(dāng)清晨太陽(yáng)初升時(shí),那一剎那,炙熱的陽(yáng)光灑在大地,打破了大地甜美的夢(mèng)鄉(xiāng),大地蘇醒了,因?yàn)樗?,只有借著太?yáng)之光才能完成所需的一切,這一天,大地在河流山川到處穿梭和勞作,到晚上,初升的太陽(yáng)落下了,留下了一道完美的晚霞,這時(shí)候,大地笑了,然后嘴角上揚(yáng)又開始了他的甜美的夢(mèng)。
目標(biāo)
本篇文章將帶領(lǐng)讀者走向C語(yǔ)言的核心,培養(yǎng)讀者的邏輯思維以及編程風(fēng)格,要求掌握C語(yǔ)言程序結(jié)構(gòu)、if......else、switch、C語(yǔ)言循環(huán)控制語(yǔ)句、return、continue、break.
一、C語(yǔ)言程序結(jié)構(gòu)
從程序流程的角度來(lái)看,C語(yǔ)言中的語(yǔ)句可以分為3種基本結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
1、順序結(jié)構(gòu):就是在程序執(zhí)行的時(shí)候,程序會(huì)順序來(lái)執(zhí)行代碼,從上往下一行一行執(zhí)行。
2、分支結(jié)構(gòu):程序會(huì)根據(jù)某一條件的判斷結(jié)果來(lái)決定程序的走向,比如當(dāng)該條件成立時(shí)執(zhí)行語(yǔ)句1,當(dāng)該條件不成立時(shí)執(zhí)行語(yǔ)句2。另外,也有可能會(huì)有多種條件的情況,比如,當(dāng)條件1成立時(shí)執(zhí)行語(yǔ)句1,當(dāng)條件2成立執(zhí)行語(yǔ)句2,在其他情況下執(zhí)行語(yǔ)句3、4等。
3、當(dāng)型循環(huán)和直到型循環(huán)。當(dāng)型循環(huán)首先判斷條件是否成立,若條件成立則執(zhí)行循環(huán)內(nèi)的語(yǔ)句,若條件不成立則直接跳出循環(huán);直到型循環(huán)是直接執(zhí)行循環(huán)內(nèi)的語(yǔ)句,直到條件不成立時(shí)退出循環(huán)體。
二、C語(yǔ)言控制語(yǔ)句
1、條件判斷語(yǔ)句(if語(yǔ)句和switch語(yǔ)句)
1.1、條件判斷語(yǔ)句
if語(yǔ)句是用來(lái)判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)執(zhí)行給出的操作,if語(yǔ)句有3種形式。
(1)if(表達(dá)式)語(yǔ)句2
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = 20,b = 10;
if(a > b){
printf("This is true");
}
return 0;
}
(2)if(表達(dá)式) 語(yǔ)句1 else 語(yǔ)句2
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = 20,b = 10;
if(a > b){
printf("This is true\n");
}else{
printf("This is false\n");
}
return 0;
}
(3)if(表達(dá)式1) 語(yǔ)句1
else if(表達(dá)式2) 語(yǔ)句2
else if(表達(dá)式3) 語(yǔ)句3
……
else if (表達(dá)式m) 語(yǔ)句m
else 語(yǔ)句n
int main(int argc, const char * argv[]) {
@autoreleasepool {
float score;
printf("input score:");
scanf("%f", &score);
if (score < 0 || score > 100)
{
printf("score is invalid\n");
return 0;
}
if (score >= 90)
printf("A\n");
else if (score >= 80)
printf("B\n");
else if (score >= 70)
printf("C\n");
else if (score >= 60)
printf("D\n");
else
printf("E\n");
return 0;
}
當(dāng)然對(duì)于if語(yǔ)句,我們也可以嵌套使用,這里就不舉例了,請(qǐng)讀者自行完成,格式:
if()
if()語(yǔ)句1
else 語(yǔ)句2
else
if() 語(yǔ)句3
else 語(yǔ)句4
1.2switch語(yǔ)句
對(duì)于if語(yǔ)句來(lái)說(shuō),if語(yǔ)句只能從兩者中選擇一個(gè),當(dāng)要實(shí)現(xiàn)幾種可能之一時(shí),就要用if...else if,甚至多重的嵌套if來(lái)實(shí)現(xiàn),當(dāng)分支較多時(shí),程序會(huì)變得很復(fù)雜,可讀性很差。switch開關(guān)語(yǔ)句專門處理多路分支的情形,使程序變得簡(jiǎn)潔。
switch語(yǔ)句一般的格式如下:
switch(表達(dá)式)
case常量表達(dá)式1:語(yǔ)句序列1;
case常量表達(dá)式2:語(yǔ)句序列2;
……
case常量表達(dá)式n:語(yǔ)句n;
default:語(yǔ)句n+1;
在這里,switch關(guān)鍵字后面的表達(dá)式必須是整型值或字符型值。這里的常量表達(dá)式是指在編譯期間,對(duì)表達(dá)式求得的值,不能是任何變量。“case”表達(dá)式后的各語(yǔ)句序列允許有多條語(yǔ)句,不需要按復(fù)合語(yǔ)句處理。
switch語(yǔ)句比較特殊,這里的case標(biāo)簽并沒有把語(yǔ)句列表劃分為幾個(gè)部分,它只是確定語(yǔ)句執(zhí)行的入口點(diǎn)。
int main(int argc, const char * argv[]) {
@autoreleasepool {
float score;
int grade;
printf("input score:");
scanf("%f", &score);
if (score < 0 || score > 100)
{
printf("score is invalid\n");
return 0;
}
grade = score / 10;
switch (grade)
{
case 9:
printf("A\n");
case 8:
printf("B\n");
case 7:
printf("C\n");
case 6:
printf("D\n");
default:
printf("E\n");
}
return 0;
}
2、循環(huán)控制語(yǔ)句
2.1while和do-while語(yǔ)句
C語(yǔ)言中有兩種循環(huán)結(jié)構(gòu):當(dāng)型和直到型,其中while語(yǔ)句是當(dāng)型循環(huán)結(jié)構(gòu),它的格式如下:
while(表達(dá)式)
{
循環(huán)體語(yǔ)句
}
在執(zhí)行while循環(huán)語(yǔ)句時(shí),先判斷表達(dá)式的值,再執(zhí)行循環(huán)體中的內(nèi)容。
與此相對(duì)應(yīng)的do-while是直到型循環(huán)結(jié)構(gòu),它的格式為
do
{
循環(huán)體語(yǔ)句
} while(表達(dá)式);
在執(zhí)行do-while循環(huán)語(yǔ)句時(shí),先執(zhí)行循環(huán)體里的內(nèi)容,再執(zhí)行while表達(dá)式里的值。
例子:用While
int main(int argc, const char * argv[]) {
@autoreleasepool {
int i = 0;
int sum = 0;
while (i <= 100) {
sum += i;
i++;
}
printf("%d\n",sum);
}
return 0;
}
輸出結(jié)果:5050
Program ended with exit code: 0
使用do...while
int main(int argc, const char * argv[]) {
@autoreleasepool {
int i = 0;
int sum = 0;
do {
sum += i;
i++;
} while (i <= 100);
printf("%d\n",sum);
}
return 0;
}
輸出結(jié)果:5050
Program ended with exit code: 0
注意一點(diǎn):在這里雖然兩個(gè)程序運(yùn)行的結(jié)果是一樣的,但是,如果讀者把i的初始值變?yōu)?01,那么這兩個(gè)程序的結(jié)果就不一樣了,這里需要注意一點(diǎn)是:while是一進(jìn)來(lái)就需要判斷條件,如果條件滿足就執(zhí)行,然后在判斷,知道不滿足就跳出循環(huán),do...while是一進(jìn)程序就先執(zhí)行do里面的語(yǔ)句,然后在去判斷,如果判斷滿足就在執(zhí)行do,不滿足就跳出,這里需要區(qū)分兩個(gè)循環(huán)語(yǔ)句的執(zhí)行過程。
2.2 for循環(huán)
for語(yǔ)句是C語(yǔ)言所提供的功能更強(qiáng)、使用更廣泛的一種循環(huán)語(yǔ)句,其一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)3){
語(yǔ)句
}
括號(hào)中的3個(gè)表達(dá)式的含義如下。
表達(dá)式1:通常用來(lái)給循環(huán)變量賦初值,一般是賦值表達(dá)式;也允許在for語(yǔ)句外給循環(huán)變量賦初值,此時(shí)可以省略該表達(dá)式。
表達(dá)式2:通常是循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式。
表達(dá)式3:通常用來(lái)修改循環(huán)變量的值,一般是賦值語(yǔ)句。
for后面的語(yǔ)句即為循環(huán)體??梢允且粭l語(yǔ)句,也可以是用括號(hào)“{}”包含起來(lái)的多條語(yǔ)句。
求0 ~ 100的和
int main(int argc, const char * argv[]) {
@autoreleasepool {
int i,sum;
for ( i = 0; i <= 100; i++) {
sum +=i;
}
printf("%d\n",sum);
}
return 0;
}
輸出結(jié)果:
5050
Program ended with exit code: 0
for括號(hào)中的3個(gè)表達(dá)式都可以是逗號(hào)表達(dá)式,即每個(gè)表達(dá)式都可由多個(gè)表達(dá)式組成。3個(gè)表達(dá)式都是任選項(xiàng),都可以省略。
在整個(gè)for循環(huán)過程中,表達(dá)式1只計(jì)算一次,表達(dá)式2和表達(dá)式3則可能計(jì)算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行,它等價(jià)于下面的while語(yǔ)句。
表達(dá)式1;
while(表達(dá)式2)
{
循環(huán)體;
表達(dá)式3;
}
使用for循環(huán)所注意的幾點(diǎn)
在使用for語(yǔ)句中要注意以下幾點(diǎn)。
1、 for語(yǔ)句中的表達(dá)式1可以省略,但在for循環(huán)之前應(yīng)給循環(huán)變量賦值。例如:
int i = 1, sum = 0;
for (; i <= 100; i++)
sum = sum+i;
2、 表達(dá)式2也可以省略,但循環(huán)將陷入死循環(huán)。例如:
int i, sum = 0;
for (I = 1; ; i++)
sum = sum+i;
3、 表達(dá)式3也可以省略,但應(yīng)在循環(huán)體中增加使循環(huán)變量值改變的語(yǔ)句。
int i;
for (i = 1; i <= 100;)
{
sum = sum+i;
i++;
}
4、 表達(dá)式1和表達(dá)式3也允許同時(shí)省略。
int i = 1, sum = 0;
for (; i <= 100;)
{
sum = sum+i;
i++;
}
這時(shí),完全與while循環(huán)等價(jià)。
5、三個(gè)表達(dá)式都可以省略,但“;”不能省略。
int i;
for (;;)
{
sum = sum+i;
i++;
}
否則,變成了死循環(huán),將無(wú)休止地累加下去。
6、 循環(huán)體可以是空語(yǔ)句。
7、 for語(yǔ)句也可與for、while、do-while語(yǔ)句相互嵌套,構(gòu)成多重循環(huán)。
3、goto語(yǔ)句
goto語(yǔ)句也稱為無(wú)條件轉(zhuǎn)移語(yǔ)句,其一般格式如下:
goto 語(yǔ)句標(biāo)號(hào);
其中語(yǔ)句標(biāo)號(hào)是按標(biāo)識(shí)符規(guī)定書寫的符號(hào),放在某一語(yǔ)句行的前面,標(biāo)號(hào)后加冒號(hào)(:)。語(yǔ)句標(biāo)號(hào)起標(biāo)識(shí)語(yǔ)句的作用,與goto 語(yǔ)句配合使用。
C語(yǔ)言不限制程序中使用標(biāo)號(hào)的次數(shù),但各標(biāo)號(hào)不得重名。goto語(yǔ)句的語(yǔ)義是改變程序流向,轉(zhuǎn)去執(zhí)行語(yǔ)句標(biāo)號(hào)所標(biāo)識(shí)的語(yǔ)句??梢耘c條件判斷語(yǔ)句配合使用,來(lái)構(gòu)成循環(huán)。在使用goto語(yǔ)句的時(shí)候,由于goto語(yǔ)句可以隨意跳轉(zhuǎn),過多的使用goto語(yǔ)句,很容易造成程序結(jié)構(gòu)的混亂,代碼可讀性也會(huì)降低,如果能省我們就省,盡可能的不用。這里例子就不列舉了。
三、轉(zhuǎn)向語(yǔ)句
轉(zhuǎn)向語(yǔ)句一般有三種:break、continue、goto.
3.1.break語(yǔ)句
break語(yǔ)句在前面的switch語(yǔ)句中已經(jīng)出現(xiàn)過,只能用在switch語(yǔ)句或循環(huán)語(yǔ)句中,其作用是跳出switch語(yǔ)句或跳出本層循環(huán),轉(zhuǎn)去執(zhí)行后面的語(yǔ)句。由于break語(yǔ)句的轉(zhuǎn)移方向是明確的,因此不需要語(yǔ)句標(biāo)號(hào)與之配合,break語(yǔ)句的一般形式為
break;
3.2.continue語(yǔ)句
continue語(yǔ)句只能用在循環(huán)體中,其一般格式是:
continue;
其功能是結(jié)束本次循環(huán),即不再執(zhí)行循環(huán)體中continue語(yǔ)句之后的語(yǔ)句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。continue語(yǔ)句只結(jié)束本次的循環(huán),并不跳出循環(huán)。
int main(int argc, const char * argv[]) {
@autoreleasepool {
int n;
for(n=1;n<=100;n++)
{
if (n%7!=0)
/*若不能被7整除,則跳出本次循環(huán),繼續(xù)下一次循環(huán)*/
continue;
printf("%d ",n);
}
return 0;
}
3.3 goto語(yǔ)句
前面已經(jīng)提到過,goto語(yǔ)句也稱為無(wú)條件轉(zhuǎn)移語(yǔ)句,用來(lái)改變程序流向,轉(zhuǎn)去執(zhí)行語(yǔ)句標(biāo)號(hào)所標(biāo)識(shí)的語(yǔ)句。除了可以利用goto來(lái)構(gòu)造循環(huán)外,還可以實(shí)現(xiàn)條件轉(zhuǎn)移、跳出循環(huán)體等功能。
注意
break是跳出循環(huán),當(dāng)有多層循環(huán)時(shí),break只跳出離它最近的循環(huán)體,continue是跳出本次循環(huán),不是跳出循環(huán)體,這點(diǎn)希望讀者注意一點(diǎn)。
總結(jié)
希望讀者認(rèn)真學(xué)習(xí),一步一個(gè)腳印,踏踏實(shí)實(shí)的把基礎(chǔ)落實(shí)好。這篇文章主要介紹了C語(yǔ)言的控制語(yǔ)句,望讀者掌握好。
結(jié)尾
最后,希望讀者在讀文章的時(shí)候發(fā)現(xiàn)有錯(cuò)誤或者不好的地方,歡迎留言,我會(huì)及時(shí)更改,感謝你的閱讀和評(píng)論已經(jīng)點(diǎn)贊收藏。