C語言中有三大結(jié)構(gòu),分別是順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu):
- C語言順序結(jié)構(gòu)就是讓程序按照從頭到尾的順序依次執(zhí)行每一條C語言代碼,不重復(fù)執(zhí)行任何代碼,也不跳過任何代碼
- C語言選擇結(jié)構(gòu)也稱分支結(jié)構(gòu),就是讓程序
拐彎
, 有選擇性的執(zhí)行代碼;換句話說,可以跳過沒用的代碼,只執(zhí)行有用的代碼 - C語言循環(huán)結(jié)構(gòu)就是讓程序
殺個回馬槍
, 不斷地重復(fù)執(zhí)行同一段代碼。
順序結(jié)構(gòu)很好理解,無需多說,本文重點講解選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
一、C語言選擇結(jié)構(gòu)
當(dāng)我們是兒童時,父母就告訴我們記住這句 紅燈停,綠燈行,黃燈等待
,代表的含義是交通燈的狀態(tài),當(dāng)交通燈是紅色時,表示要停止,當(dāng)為綠燈時,表示可以行走,當(dāng)為黃燈時,需要等待。接下來用代碼來模擬此時交通燈的狀況,具體代碼如下圖所示:
從代碼中可以看到,有紫色的 if
語句,藍色的 else if
語句以及紅色的 else
語句都是陌生的詞匯,那么本文就為大家一一解釋它們是什么意思。if
語句:即條件判斷 if
語句。if
括號中的條件表達式結(jié)果為 真
,就執(zhí)行 if
下面大括號內(nèi)語句。else if
語句:即條件判斷 else if
語句。else if
括號中的條件表達式結(jié)果為 真
,就執(zhí)行 else if
下面大括號內(nèi)的語句。else
語句:即條件判斷 else
語句。當(dāng) if
與 else if
語句的條件表達式結(jié)果都為 假
,就執(zhí)行 else
下面大括號的語句。以上只是簡單的介紹了這三種條件判斷語句的功能,接下來詳細介紹條件控制語句。
1.1 if語句
if 語句通過對表達式進行判斷,根據(jù)判斷的結(jié)果決定是否進行相應(yīng)的操作。例如下圖所示,買彩票,如果中獎了,就買小汽車。
中獎的流程圖如下圖所示:
if 語句的一般形式為:
if(表達式)
語句;
if 語句的執(zhí)行流程圖如下圖所示:
例如,下面的這行代碼:
if(iNum)
//代碼中判斷變量iNum的值,如果變量iNum為真值,則執(zhí)行后面的輸入語句;如果變量的值為假,則不執(zhí)行后面的輸入語句
printf("這是真值");
在 if 語句的括號中,不僅可以判斷一個變量的值是否為真,也可以判斷表達式的結(jié)果是否為真,例如:
if(iSignal==1)
//判斷變量iSignal==1的表達式,如果條件成立,那么判斷的結(jié)果是真值,則執(zhí)行后面的輸出語句
//如果條件不成立,那么結(jié)果為假值,則不執(zhí)行后面的輸出語句
printf("當(dāng)前信號燈的狀態(tài)是:%d:",iSignal);
從上面這兩行代碼中可以看到 if 后面的執(zhí)行部分只是調(diào)用了一條語句,如果是兩條語句時怎么辦呢?這時可以使用大括號將執(zhí)行部分括住使之成為語句塊,例如:
if (iSignal == 1) {
printf("當(dāng)前信號燈的狀態(tài)是:%d:\n", iSignal);
printf("車需要停止");
}
將執(zhí)行的語句都放在大括號中,這樣當(dāng) if 語句判斷條件為真時,就可以全部執(zhí)行。使用這種方式的好處是可以更規(guī)范、清楚地表達出 if 語句所包含語句的范圍,所以建議大家使用 if 語句時都使用大括號將執(zhí)行語句包括在內(nèi)。
1.2 if…else語句
除了可以指定在條件為真時執(zhí)行某些語句外,還可以在條件為假時執(zhí)行另外一段代碼。這在C語言中是利用 else 語句來完成的,例如:買彩票,如果中獎了,那就買轎車,否則就買自行車,如下圖所示:
所對應(yīng)的流程圖如下圖所示:if…else
語句的一般形式為:
if(表達式){
語句塊1;
}else{
語句塊2;
}
if…else
語句的執(zhí)行流程圖如下圖所示:
在 if 后的括號中判斷表達式的結(jié)果,如果判斷的結(jié)果為真值,則執(zhí)行緊跟 if 后的語句塊中的內(nèi)容;如果判斷的結(jié)果為假值,則執(zhí)行 else 語句后的語句塊內(nèi)容。例如:
if (value) {
printf("這個值為真");
} else {
printf("這個值為假");
}
在上面的代碼中,如果 if 判斷變量 value 的值為真,則執(zhí)行 if 后面的語句塊進行輸出。如果 if 判斷的結(jié)果為假值,則執(zhí)行 else 下面的語句塊。
注意: 一個 else 語句必須跟在一個 if 語句的后面。
1.3 else if語句
利用 if 和 else 關(guān)鍵字的組合可以實現(xiàn) else if 語句,這是對一系列互斥的條件進行檢驗。比如,某4S店進行大轉(zhuǎn)輪抽獎活動,根據(jù)中獎的金額來獲得不同類型的車,中獎的金額段之間是互斥的,每次抽獎結(jié)果都只能出現(xiàn)一個金額段,如下圖所示:
要實現(xiàn)這個抽獎過程,就可以使用 else if 語句來實現(xiàn)。對應(yīng)的流程圖如下圖所示:
else if 語句的一般形式如下:
if(表達式1){
語句1;
}else if(表達式2){
語句2;
}else if(表達式3){
語句3;
}
…
else if(表達式m){
語句m;
}else{
語句n;
}
else if 語句的執(zhí)行流程圖如下圖所示:
根據(jù)流程圖可知,首先對 if 語句中的表達式1進行判斷,如果結(jié)果為真值,則執(zhí)行后面跟著的語句1,然后跳過 else if 語句和 else 語句;如果結(jié)果為假,那么判斷 else if 語句中的表達式2。如果表達式2為真值,那么執(zhí)行語句2而不會執(zhí)行后面 else if 的判斷或者 else 語句。當(dāng)所有的判斷都不成立,也就是都為假值時,執(zhí)行 else 后的語句塊。例如:
if(iSelection==1)
{…}
else if(iSelection==2)
{…}
else if(iSelection==3)
{…}
else
{…}
上述代碼的含義是:
- 使用 if 語句判斷變量 iSelection 的值是否為1,如果為1則執(zhí)行后面語句塊中的內(nèi)容,然后跳過后面的 else if 語句判斷和 else 語句的執(zhí)行。
- 如果 iSelection 的值不為1,那么 else if 語句判斷 iSelection 的值是否為2,如果值為2,則條件為真,執(zhí)行后面緊跟著的語句塊,執(zhí)行完后跳過后面 else if 語句和 else 語句的操作。
- 如果 iSelection 的值也不為2,那么接下來的 else if 語句判斷 iSelection 是否等于數(shù)值3,如果等于3,則執(zhí)行后面語句塊中的內(nèi)容,否則執(zhí)行 else 語句塊中的內(nèi)容。也就是說,當(dāng)前面所有的判斷都不成立(為假值)時,執(zhí)行 else 語句塊中的內(nèi)容。
1.4 if語句的嵌套
嵌套可以理解為鑲嵌、套用,例如我們熟悉的俄羅斯套娃,一層套著一層,這種做法叫做嵌套。那么,if 嵌套就是在 if 語句中可以包含一個或多個 if 語句。一般形式如下:
if(表達式1){
if(表達式2){
語句塊1;
}else{
語句塊2;
}
} else{
if(表達式3){
語句塊3;
}
}
使用 if 語句嵌套的功能是對判斷的條件進行細化,然后進行相應(yīng)的操作。舉例: 人們在生活中,每天早上醒來的時候想一下今天是星期幾,如果是周末就是休息日,如果不是周末就要上班;同時,休息日可能是星期六或者是星期日,星期六就和朋友去逛街,星期日就陪家人在家。具體代碼如下:
#include<stdio.h>
int main() {
int iDay; //定義變量表示輸入的星期幾
//定義變量代表一周中的每一天
int Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4,
Friday = 5, Saturday = 6, Sunday = 7;
printf("請選擇星期幾:\n"); //提示信息
scanf("%d", &iDay); //輸入星期
if (iDay > Friday) //休息日的情況
{
if (iDay == Saturday) //為周六時
{
printf("和朋友去逛街\n");
} else //為周日時
{
printf("在家陪家人\n");
}
} else //工作日的情況
{
if (iDay == Monday) //為周一時
{
printf("開會\n");
} else //為其他星期時
{
printf("工作\n");
}
}
return 0; //程序結(jié)束
}
程序運行結(jié)果如下圖所示:
整段代碼表示了整個 if 語句嵌套的操作過程,首先判斷為休息日的情況,然后根據(jù)判斷的結(jié)果選擇相應(yīng)的具體判斷或者操作。過程如下:
- if 語句判斷表達式1就像判斷今天是星期幾,假設(shè)判斷結(jié)果為真,則用 if 語句判斷表達式2。
- 例如,判斷出今天是休息日,然后去判斷今天是不是周六;如果 if 語句判斷 iDay==Saturday 為真,那么執(zhí)行語句1。如果不為真,那么執(zhí)行語句2。
- 例如,如果為星期六就陪朋友逛街,如果為星期日就陪家人在家。外面的 else 語句表示不為休息日時的相應(yīng)操作。
1.5 條件運算符
自增、自減以及復(fù)合賦值運算符都是C語言提供的精簡運算符,那條件選擇也提供了一個精簡的運算符――條件運算符(又稱三目運算符)。條件運算符是將3個表達式連接在一起,組成的條件表達式。條件運算符的語法格式如下:
返回值=表達式1?表達式2:表達式3;
以上語句的含義是:先對表達式1的值進行檢驗,如果值為真,則返回值是表達式2的結(jié)果值,如果值為假,則返回值是表達式3的結(jié)果值。示例代碼:
b=a>2?2:3;
這句語句運算過程如下圖所示:
這句代碼等價于:
if(a>2)
{
b = 2;
}
else
{
b = 3;
}
模擬條件運算符實現(xiàn)美團送餐情況,假設(shè)滿足15元就免費配送,否則就要加上5元的配送費,實現(xiàn)代碼如下:
#include<stdio.h>
int main() {
int food, fee;//定義變量存儲餐費、總共費用
printf("您的訂單餐費是:\n");//提示信息
scanf("%d", &food);//輸入餐費
fee = food >= 15 ? food : (food + 5);//利用三目運算符計算總共費用
printf("您的訂單共計%d元,請支付\n", fee);//輸出總共費用
return 0;//程序結(jié)束
}
程序運行結(jié)果如下圖所示:
1.6 switch語句的基本形式
if 語句只有兩個分支可供選擇,而在實際問題中常需要用到多分支的選擇。就像買衣服,可以有多種選擇。當(dāng)然,使用嵌套的 if 語句也可以采用多分支實現(xiàn)買衣服的選擇,但是如果分支較多,就會使得嵌套的 if 語句層數(shù)較多,程序冗余并且可讀性不好。在C語言中,可以使用 switch 語句直接處理像買衣服這種多分支選擇的情況,提高程序代碼的可讀性。switch 語句是多分支選擇語句,它的一般形式如下:
switch(表達式)
{
case 值1:
語句塊1;
case 值2:
語句塊2;
…
case 值n:
語句塊n;
default:
//default部分被省略后,當(dāng)控制臺輸入的值與case語句后的值均不能匹配時,程序沒有輸出任何結(jié)果
都不符合語句塊;
}
switch 語句的程序流程如下圖所示:
通過上圖所示的流程圖分析 switch 語句的一般形式。switch 語句后面括號中的表達式就是要進行判斷的條件。在 switch 的語句塊中,使用 case 關(guān)鍵字表示檢驗條件符合的各種情況,其后的語句是相應(yīng)的操作,其中還有一個 default 關(guān)鍵字,作用是如果沒有符合條件的情況,那么執(zhí)行 default 后的默認情況語句。
說明:switch 語句檢驗的條件必須是一個整型表達式,這意味著其中也可以包含運算符和函數(shù)調(diào)用。而 case 語句檢驗的值必須是整型常量,也即可以是常量表達式或者常量運算。
通過如下代碼來分析一下 switch 語句的使用方法:
#include<stdio.h>
int main() {
int selection = 1;
switch (selection) {
case 1:printf("選擇礦泉水\n");
break;
case 2:printf("選擇旺仔\(zhòng)n");
break;
case 3:printf("選擇脈動\n");
break;
default:printf("輸入錯啦!\n");
break;
}
}
其中 switch 判斷 selection 變量的值,利用 case 語句檢驗 selection 值的不同情況。假設(shè) selection 的值為1,那么執(zhí)行 case 為1時的情況,就會輸出 選擇礦泉水
,執(zhí)行后 break 跳出 switch 語句;假設(shè) selection 的值為2,就會輸出 選擇旺仔
,執(zhí)行后 break 跳出 switch 語句;假設(shè) selection 的值為3,就會輸出 選擇脈動
,執(zhí)行后 break 跳出 switch 語句;如果 selection 的值不是 case 中所檢驗列出的情況,那么執(zhí)行 default 中的語句,就會輸出 輸入錯啦!
。在每一個 case 或 default 語句后都有一個 break 關(guān)鍵字。break 語句用于跳出 switch 結(jié)構(gòu),不再執(zhí)行 switch 下面的代碼。
注意: 在使用 switch 語句時,如果沒有一個 case 語句后面的值能匹配 switch 語句的條件,就執(zhí)行 default 語句后面的代碼。其中任意兩個 case 語句都不能使用相同的常量值;并且每一個 switch 結(jié)構(gòu)只能有一個 default 語句,而且 default 可以省略。
在使用 switch 語句時,每一個 case 情況中都要使用 break 語句,break 語句使得執(zhí)行完 case 語句后跳出 switch 語句。如果沒有 break 語句,程序會將后面的內(nèi)容都執(zhí)行。例如下面代碼,case 語句結(jié)束后不加 break,代碼如下:
#include<stdio.h>
int main() {
int money = 0;
printf("請查看口袋剩多少元錢?\n");
scanf("%d", &money);
switch (money) {
case 7:printf("還剩%d元,吃米飯?zhí)撞蚛n", money);
//沒有break語句
case 12:printf("還剩%d元,吃米線\n", money);
//沒有break語句
case 40:printf("還剩%d元,吃披薩\n", money);
//沒有break語句
default:printf("沒錢了,你可別吃了!!!\n");
}
}
程序運行結(jié)果如下圖所示:
從上圖可以看出,去掉 break 語句后,將 case 檢驗相符情況后的所有語句進行輸出。因此,如果想要輸出選擇一種情況,break 語句在 case 語句中是不能缺少的。
1.7 多路開關(guān)模式的switch語句
在上一小節(jié)中,將 break 語句去掉之后,會將符合檢驗條件后的所有語句都輸出。利用這個特點,可以設(shè)計多路開關(guān)模式的 switch 語句,它的形式如下:
switch(表達式)
{
case 1:
語句1;
break;
case 2:
case 3:
語句2;
break;
…
default:
默認語句;
break;
}
從形式中可以看到如果在 case 2 后不使用 break 語句,那么符合檢驗時與符合 case 3 檢驗時的效果是一樣的。也就是說,使用多路開關(guān)模式,可以使多種檢驗條件用一個語句塊輸出。例如:在平年一年12個月,1、3、5、7、8、10、12月是31天,4、6、9、11月是30天,2月是28天,如果在控制臺上任意輸入月份,就可以知道這個月有多少天。具體代碼如下:
#include<stdio.h>
int main() {
int month;
printf("請輸入月份:\n");
scanf("%d", &month);
switch (month) {
//多路開關(guān)模式
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("%d月有31天\n", month);
break;
//多路開關(guān)模式
case 4:
case 6:
case 9:
case 11:printf("%d月有30天\n", month);
break;
case 2:printf("%d月有28天\n", month);
break;
default:printf("輸入錯啦,沒有這個月份\n");
}
return 0;//程序結(jié)束
}
程序運行結(jié)果如下圖所示:
1.8 if…else語句和switch語句的區(qū)別
if…else 語句和 switch 語句都用于根據(jù)不同的情況檢驗條件作出相應(yīng)的判斷。兩者的流程圖分別如下圖所示:
下面從兩者的語法和效率的比較進行講解兩者區(qū)別:
- 語法的比較。 if 語句是配合 else 關(guān)鍵字進行使用的,而 switch 語句是配合 case 語句使用的;if 語句先對條件進行判斷,而 switch 語句后進行判斷,也就是判斷符合 case 語句的情況。
- 效率的比較。 if…else 結(jié)構(gòu)對開始少量的檢驗判斷速度比較快,但是隨著檢驗的增長會逐漸變慢,其中的默認情況是最慢的。使用 if else 結(jié)構(gòu)可以判斷表達式,但是不容易進行后續(xù)的添加擴充。switch 結(jié)構(gòu)中,對其中每一項 case 檢驗的速度都是相同的,default 默認情況比其他情況都快。當(dāng)判定的情況占少數(shù)時,if…else 結(jié)構(gòu)比 switch 結(jié)構(gòu)檢驗速度快。也就是說,如果分支在3個或者4個以下,用 if…else 結(jié)構(gòu)比較好,否則選擇 switch 結(jié)構(gòu)。
二、C語言循環(huán)結(jié)構(gòu)
公積金是國家機關(guān)、國有企業(yè)、城鎮(zhèn)集體企業(yè)、外商投資企業(yè)、城鎮(zhèn)私營企業(yè)及其他城鎮(zhèn)企業(yè)、事業(yè)單位、民辦非企業(yè)單位、社會團體(以下統(tǒng)稱單位)及其在職職工繳存的長期住房儲金。使用公積金買房貸款的利息點比商業(yè)貸款低很多,能夠為買房者剩下很大一比錢,所以如果職員有公積金,都會選擇使用公積金貸款買房。本示例就來模擬用公積金買房子,計算每個月需要月供的錢數(shù),具體代碼如下所示:
從代碼中可以看到,有很多熟悉的單詞,例如 double,scanf,printf
以及有很多運算符計算等,除此之外,還有就是紅色框中的 for
,接下來我們簡單的了解一下。
- 三個
i
: 即循環(huán)語句的條件。第一個i
是循環(huán)的初始值;第二個i
是循環(huán)的長度;第三個i
是改變i
的值,讓改變之后的值與第二個i
進行比較。 - 大括號
{}
: 即循環(huán)語句塊的分割標志
。 循環(huán)的部分就是大括號{}
里的語句塊,也就是代碼的sum*=1.049
這句代碼。
以上就是簡單的介紹了 for
語句的使用情況,具體的 for
語句用法我們會在下面的小節(jié)詳細講解,當(dāng)然除了 for
循環(huán)控制語句之外,還有其他的循環(huán)語句,接下來就來詳解介紹每種循環(huán)語句的使用方法及對應(yīng)的流程圖。
2.1 C語言while循環(huán)和do while循環(huán)詳解
2.1.1 while循環(huán)
while 循環(huán)的一般形式為:
while(表達式){
語句塊
}
意思是,先計算 表達式
的值,當(dāng)值為 真(非0) 時, 執(zhí)行 語句塊
; 執(zhí)行完 語句塊
,再次計算表達式的值,如果為真,繼續(xù)執(zhí)行 語句塊
…… 這個過程會一直重復(fù),直到表達式的值為 假(0), 就退出循環(huán),執(zhí)行 while 后面的代碼。while 語句執(zhí)行的流程如下圖所示:
我們通常將 表達式
稱為循環(huán)條件,把 語句塊
稱為循環(huán)體,整個循環(huán)的過程就是不停判斷循環(huán)條件、并執(zhí)行循環(huán)體代碼的過程。
用 while 循環(huán)計算1加到100的值:
/*================================================================
* Copyright (C) 2023 AmoXiang All rights reserved.
*
* 文件名稱:06-while.c
* 創(chuàng) 建 者:AmoXiang
* 創(chuàng)建日期:2023年10月16日 16:26:05
* 描 述:
*
================================================================*/
#include <stdio.h>
int main(){
int sum = 0, i = 1;
while(i<=100){
sum += i;
i++;
}
printf("1-100的和為:%d\n", sum);
}
程序運行結(jié)果如下圖所示:
代碼分析:
- 程序運行到 while 時,因為 i=1,i<=100 成立,所以會執(zhí)行循環(huán)體;執(zhí)行結(jié)束后 i 的值變?yōu)?2,sum 的值變?yōu)?1。
- 接下來會繼續(xù)判斷 i<=100 是否成立,因為此時 i=2,i<=100 成立,所以繼續(xù)執(zhí)行循環(huán)體;執(zhí)行結(jié)束后 i 的值變?yōu)?3,sum 的值變?yōu)?3。
- 重復(fù)執(zhí)行步驟 2。
- 當(dāng)循環(huán)進行到第100次,i 的值變?yōu)?101,sum 的值變?yōu)?050;因為此時 i<=100 不再成立,所以就退出循環(huán),不再執(zhí)行循環(huán)體,轉(zhuǎn)而執(zhí)行 while 循環(huán)后面的代碼。
while 循環(huán)的整體思路是這樣的:設(shè)置一個帶有變量的循環(huán)條件,也即一個帶有變量的表達式;在循環(huán)體中額外添加一條語句,讓它能夠改變循環(huán)條件中變量的值。這樣,隨著循環(huán)的不斷執(zhí)行,循環(huán)條件中變量的值也會不斷變化,終有一個時刻,循環(huán)條件不再成立,整個循環(huán)就結(jié)束了。
如果循環(huán)條件中不包含變量,會發(fā)生什么情況呢?
① 循環(huán)條件成立時的話,while 循環(huán)會一直執(zhí)行下去,永不結(jié)束,成為 死循環(huán)
。 例如:
/*================================================================
* Copyright (C) 2023 AmoXiang All rights reserved.
*
* 文件名稱:07-while.c
* 創(chuàng) 建 者:AmoXiang
* 創(chuàng)建日期:2023年10月16日 16:33:07
* 描 述:
*
================================================================*/
#include <stdio.h>
int main(){
while(1){
//運行程序,會不停地輸出1,直到用戶強制關(guān)閉。
printf("1\n");
}
return 0;
}
② 循環(huán)條件不成立的話,while 循環(huán)就一次也不會執(zhí)行。例如:
#include <stdio.h>
int main(){
while(0){
//運行程序,什么也不會輸出
printf("1\n");
}
return 0;
}
2.1.2 do-while循環(huán)
除了 while 循環(huán),在C語言中還有一種 do-while 循環(huán)。do-while 循環(huán)的一般形式為:
do{
語句塊
}while(表達式);
do-while 循環(huán)與 while 循環(huán)的不同在于:它會先執(zhí)行 語句塊
, 然后再判斷表達式是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while 循環(huán)至少要執(zhí)行一次 語句塊
。
示例:用 do-while 計算1加到100的值。
/*================================================================
* Copyright (C) 2023 AmoXiang All rights reserved.
*
* 文件名稱:09-do-while.c
* 創(chuàng) 建 者:AmoXiang
* 創(chuàng)建日期:2023年10月16日 16:45:27
* 描 述:
*
================================================================*/
#include <stdio.h>
int main(){
int i = 1, sum = 0;
do{
sum += i;
i++;
}while(i <= 100);
printf("1-100的和為:%d\n", sum);
return 0;
}
程序運行結(jié)果如下圖所示:
注意: 在使用 do…while 語句時,循環(huán)條件要放在 while 關(guān)鍵字后面的括號中,最后必須加上一個分號,這是許多初學(xué)者容易忘記的。
while 循環(huán)和 do-while 各有特點,大家可以適當(dāng)選擇,實際編程中使用 while 循環(huán)較多。
2.2 C語言for循環(huán)(for語句)詳解
2.2.1 基本使用
除了 while 循環(huán),C語言中還有 for 循環(huán),它的使用更加靈活,完全可以取代 while 循環(huán)。
#include <stdio.h>
int main(){
int i, sum=0;
i = 1; //語句①
while(i<=100 /*語句②*/ ){
sum+=i;
i++; //語句③
}
printf("%d\n",sum);
return 0;
}
可以看到,語句①②③被放到了不同的地方,代碼結(jié)構(gòu)較為松散。為了讓程序更加緊湊,可以使用 for 循環(huán)來代替,如下所示:
#include <stdio.h>
int main(){
int i, sum=0;
for(i=1/*語句①*/; i<=100/*語句②*/; i++/*語句③*/){
sum+=i;
}
printf("%d\n",sum);
return 0;
}
在 for 循環(huán)中,語句①②③被集中到了一起,代碼結(jié)構(gòu)一目了然。for 循環(huán)的一般形式為:
for(表達式1; 表達式2; 表達式3){
語句塊
}
//執(zhí)行過程為:
//(1)先執(zhí)行 表達式1
//(2)再執(zhí)行 表達式2,如果它的值為真(非0),則執(zhí)行循環(huán)體,否則結(jié)束循環(huán)
//(3) 執(zhí)行完循環(huán)體后再執(zhí)行 表達式3
//(4)重復(fù)執(zhí)行步驟 (2) 和 (3),直到 表達式2 的值為假,就結(jié)束循環(huán)。
//上面的步驟中,(2) 和 (3) 是一次循環(huán),會重復(fù)執(zhí)行,for 語句的主要作用就是不斷執(zhí)行步驟 (2) 和 (3)。
表達式1
僅在第一次循環(huán)時執(zhí)行,以后都不會再執(zhí)行,可以認為這是一個初始化語句。表達式2
一般是一個關(guān)系表達式,決定了是否還要繼續(xù)下次循環(huán),稱為 循環(huán)條件
。 表達式3
很多情況下是一個帶有自增或自減操作的表達式,以使循環(huán)條件逐漸變得 不成立
。 for 循環(huán)的執(zhí)行過程可用下圖表示:
我們再來分析一下 計算從1加到100的和
的代碼:
#include <stdio.h>
int main(){
int i, sum=0;
for(i=1; i<=100; i++){
sum+=i;
}
printf("%d\n",sum);
return 0;
}
代碼分析:
- 執(zhí)行到 for 語句時,先給 i 賦初值1,判斷 i<=100 是否成立;因為此時 i=1,i<=100 成立,所以執(zhí)行循環(huán)體。循環(huán)體執(zhí)行結(jié)束后(sum 的值為1),再計算 i++。
- 第二次循環(huán)時,i 的值為2,i<=100 成立,繼續(xù)執(zhí)行循環(huán)體。循環(huán)體執(zhí)行結(jié)束后(sum 的值為3),再計算 i++。
- 重復(fù)執(zhí)行步驟 2,直到第101次循環(huán),此時 i 的值為101,i<=100 不成立,所以結(jié)束循環(huán)。
由此我們可以總結(jié)出 for 循環(huán)的一般形式:
for(初始化語句; 循環(huán)條件; 自增或自減){
語句塊
}
2.2.2 for循環(huán)的變體
通過 2.1 小節(jié)的學(xué)習(xí)可知 for 語句的一般形式中有3個表達式。在實際程序的編寫過程中,對這3個表達式可以根據(jù)情況進行省略,接下來對不同情況進行講解。
(1) for 語句中省略表達式1
for 語句中第一個表達式的作用是對循環(huán)變量設(shè)置初值。如果省略 for 語句中的表達式1,就需要在 for 語句之前給循環(huán)變量賦值。for 語句中省略表達式1的示例代碼如下:
(2) for 語句中省略表達式2
如果表達式2省略,即不判斷循環(huán)條件,則循環(huán)將無終止地進行下去,也即默認表達式2始終為真。例如:
(3) for 語句中省略表達式3
表達式3也可以省略。例如:
int number;
for(number=1; number<=20;) // 省略表達式3
{
sum=sum+ number;
}
這段代碼沒有改變 number 變量值的代碼,循環(huán)將會無終止的進行。如果想要程序循環(huán)能正常結(jié)束,就將代碼改為如下形式:
int number;
for(number=1; number<=20;) // 省略表達式3
{
sum=sum+ number;
number++;
} //經(jīng)過修改之后,循環(huán)就能正常運行
2.2.3 for語句中的逗號應(yīng)用
在 for 語句中的表達式1和表達式3處,除了可以使用簡單的表達式外,還可以使用逗號表達式。即包含一個以上的簡單表達式,中間用逗號間隔。例如在表達式1處為變量 iCount 和 iSum 設(shè)置初始值,代碼如下:
for(iSum=0,iCount=1; iCount<100; iCount++)
{
iSum = iSum + iCount;
}
或者執(zhí)行循環(huán)變量自加操作兩次,代碼如下:
for(iCount=1;iCount<100;iCount++,iCount++)
{
iSum=iSum+iCount;
}
表達式1和表達式3都是逗號表達式,在逗號表達式內(nèi)按照自左至右順序求解,整個逗號表達式的值為其中最右邊的表達式的值。例如:
for(iCount=1;iCount<100;iCount++,iCount++)
//就相當(dāng)于:
for(iCount=1;iCount<100;iCount+=2)
2.3 C語言break和continue用法詳解(跳出循環(huán))
使用 while 或 for 循環(huán)時,如果想提前結(jié)束循環(huán)(在不滿足結(jié)束條件的情況下結(jié)束循環(huán)),可以使用 break 或 continue 關(guān)鍵字。
2.3.1 break關(guān)鍵字
當(dāng) break 關(guān)鍵字用于 while、for 循環(huán)時,會終止循環(huán)而執(zhí)行整個循環(huán)語句后面的代碼。break 關(guān)鍵字通常和 if 語句一起使用,即滿足條件時便跳出循環(huán)。使用 while 循環(huán)計算1加到100的值:
#include <stdio.h>
int main(){
int i=1, sum=0;
while(1){ //循環(huán)條件為死循環(huán)
sum+=i;
i++;
if(i>100) break;
}
printf("%d\n", sum);
return 0;
}
while 循環(huán)條件為 1,是一個死循環(huán)。當(dāng)執(zhí)行到第 100 次循環(huán)的時候,計算完 i++;
后 i 的值為 101,此時 if 語句的條件 i> 100 成立,執(zhí)行 break;
語句,結(jié)束循環(huán)。在多層循環(huán)中,一個 break 語句只向外跳一層。例如,輸出一個 4*4
的整數(shù)矩陣:
/*================================================================
* Copyright (C) 2023 AmoXiang All rights reserved.
*
* 文件名稱:10-break.c
* 創(chuàng) 建 者:AmoXiang
* 創(chuàng)建日期:2023年10月16日 17:37:06
* 描 述:
*
================================================================*/
#include <stdio.h>
int main(){
int i=1, j;
while(1){ // 外層循環(huán)
j=1;
while(1){ // 內(nèi)層循環(huán)
printf("%-4d", i*j);
j++;
if(j>4) break; //跳出內(nèi)層循環(huán)
}
printf("\n");
i++;
if(i>4) break; // 跳出外層循環(huán)
}
return 0;
}
程序運行結(jié)果如下圖所示:
當(dāng) j>4 成立時,執(zhí)行 break;
,跳出內(nèi)層循環(huán);外層循環(huán)依然執(zhí)行,直到 i>4 成立,跳出外層循環(huán)。內(nèi)層循環(huán)共執(zhí)行了4次,外層循環(huán)共執(zhí)行了1次。
2.3.2 continue語句
continue 語句的作用是跳過循環(huán)體中剩余的語句而強制進入下一次循環(huán)。continue 語句只用在 while、for 循環(huán)中,常與 if 條件語句一起使用,判斷條件是否成立。來看一個例子:
/*================================================================
* Copyright (C) 2023 AmoXiang All rights reserved.
*
* 文件名稱:11-continue.c
* 創(chuàng) 建 者:AmoXiang
* 創(chuàng)建日期:2023年10月16日 17:41:13
* 描 述:
*
================================================================*/
#include <stdio.h>
int main(){
char c = 0;
while(c!='\n'){ //回車鍵結(jié)束循環(huán)
c=getchar();
if(c=='4' || c=='5'){ //按下的是數(shù)字鍵4或5
continue; //跳過當(dāng)次循環(huán),進入下次循環(huán)
}
putchar(c);
}
return 0;
}
程序運行結(jié)果如下圖所示:
程序遇到 while 時,變量 c 的值為 '\0'
, 循環(huán)條件 c!='\n'
成立,開始第一次循環(huán)。getchar() 使程序暫停執(zhí)行,等待用戶輸入,直到用戶按下回車鍵才開始讀取字符。
本例我們輸入的是 0123456789,當(dāng)讀取到4或5時,if 的條件 c=='4'||c=='5'
成立,就執(zhí)行 continue 語句,結(jié)束當(dāng)前循環(huán),直接進入下一次循環(huán),也就是說 putchar(c);
不會被執(zhí)行到。而讀取到其他數(shù)字時,if 的條件不成立,continue 語句不會被執(zhí)行到,putchar(c);
就會輸出讀取到的字符。break 與 continue 的對比:break 用來結(jié)束所有循環(huán),循環(huán)語句不再有執(zhí)行的機會;continue 用來結(jié)束本次循環(huán),直接跳到下一次循環(huán),如果循環(huán)條件成立,還會繼續(xù)循環(huán)。
2.4 C語言循環(huán)嵌套詳解
在C語言中,if-else,while,do-while,for
都可以相互嵌套。所謂 嵌套(Nest), 就是一條語句里面還有另一條語句,例如 for 里面還有 for,while 里面還有 while,或者 for 里面有 while,while 里面有 if-else,這都是允許的。
示例1:for 嵌套執(zhí)行的流程。
#include <stdio.h>
int main()
{
int i, j;
for(i=1; i<=4; i++){ //外層for循環(huán)
for(j=1; j<=4; j++){ //內(nèi)層for循環(huán)
printf("i=%d, j=%d\n", i, j);
}
printf("\n");
}
return 0;
}
本例是一個簡單的 for 循環(huán)嵌套,外層循環(huán)和內(nèi)層循環(huán)交叉執(zhí)行,外層 for 每執(zhí)行一次,內(nèi)層 for 就要執(zhí)行四次。在C語言中,代碼是順序、同步執(zhí)行的,當(dāng)前代碼必須執(zhí)行完畢后才能執(zhí)行后面的代碼。這就意味著,外層 for 每次循環(huán)時,都必須等待內(nèi)層 for 循環(huán)完畢(也就是循環(huán)4次)才能進行下次循環(huán)。雖然 i 是變量,但是對于內(nèi)層 for 來說,每次循環(huán)時它的值都是固定的。
示例2:輸出一個4×4的整數(shù)矩陣。
#include <stdio.h>
int main()
{
int i, j;
for(i=1; i<=4; i++){ //外層for循環(huán)
for(j=1; j<=4; j++){ //內(nèi)層for循環(huán)
printf("%-4d", i*j);
}
printf("\n");
}
return 0;
}
外層 for 第一次循環(huán)時,i為1,內(nèi)層 for 要輸出四次 1*j
的值,也就是第一行數(shù)據(jù);內(nèi)層 for 循環(huán)結(jié)束后執(zhí)行 printf("\n")
, 輸出換行符;接著執(zhí)行外層 for 的 i++ 語句。此時外層 for 的第一次循環(huán)才算結(jié)束。外層 for 第二次循環(huán)時,i為2,內(nèi)層 for 要輸出四次 2*j
的值,也就是第二行的數(shù)據(jù);接下來執(zhí)行 printf("\n")
和 i++,外層 for 的第二次循環(huán)才算結(jié)束。外層 for 第三次、第四次循環(huán)以此類推??梢钥吹?,內(nèi)層 for 每循環(huán)一次輸出一個數(shù)據(jù),而外層 for 每循環(huán)一次輸出一行數(shù)據(jù)。
示例3:輸出九九乘法表。
#include <stdio.h>
int main(){
int i, j;
for(i=1; i<=9; i++){ //外層for循環(huán)
for(j=1; j<=i; j++){ //內(nèi)層for循環(huán)
printf("%d*%d=%-2d ", i, j, i*j);
}
printf("\n");
}
return 0;
}
和示例2一樣,內(nèi)層 for 每循環(huán)一次輸出一條數(shù)據(jù),外層 for 每循環(huán)一次輸出一行數(shù)據(jù)。需要注意的是,內(nèi)層 for 的結(jié)束條件是 j<=i。外層 for 每循環(huán)一次,i 的值就會變化,所以每次開始內(nèi)層 for 循環(huán)時,結(jié)束條件是不一樣的。具體如下:
當(dāng) i=1 時,內(nèi)層 for 的結(jié)束條件為 j<=1,只能循環(huán)一次,輸出第一行。
當(dāng) i=2 時,內(nèi)層 for 的結(jié)束條件是 j<=2,循環(huán)兩次,輸出第二行。
當(dāng) i=3 時,內(nèi)層 for 的結(jié)束條件是 j<=3,循環(huán)三次,輸出第三行。
當(dāng) i=4、5、6... 時,以此類推。
2.5 對C語言選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的總結(jié)
C語言中常用的編程結(jié)構(gòu)有三種(其它編程語言也是如此),它們分別是:
- 順序結(jié)構(gòu):代碼從前往后依次執(zhí)行,沒有任何
拐彎抹角
, 不跳過任何一條語句,所有的語句都會被執(zhí)行到。 - 選擇結(jié)構(gòu):也叫分支結(jié)構(gòu)。代碼會被分成多個部分,程序會根據(jù)特定條件(某個表達式的運算結(jié)果)來判斷到底執(zhí)行哪一部分。
- 循環(huán)結(jié)構(gòu):程序會重新執(zhí)行同一段代碼,直到條件不再滿足,或者遇到強行跳出語句(break 關(guān)鍵字)。
2.5.1 選擇結(jié)構(gòu)
選擇結(jié)構(gòu)(分支結(jié)構(gòu))涉及到的關(guān)鍵字包括 if,else,switch,case,break
, 還有一個條件運算符 ? :
(這是C語言中唯一的一個三目運算符)。其中,if…else 是最基本的結(jié)構(gòu),switch…case 和 ? :
都是由 if…else 演化而來,它們都是為了讓程序員書寫更加方便。你可以只使用 if,也可以 if…else 配對使用。另外要善于使用 switch…case 和 ? :
,有時候它們看起來更加清爽。if…else 可以嵌套使用,原則上嵌套的層次(深度)沒有限制,但是過多的嵌套層次會讓代碼結(jié)構(gòu)混亂。
2.5.2 循環(huán)結(jié)構(gòu)
C語言中常用的循環(huán)結(jié)構(gòu)有 while 循環(huán)和 for 循環(huán),它們都可以用來處理同一個問題,一般可以互相代替。除了 while 和 for,C語言中還有一個 goto 語句,它也能構(gòu)成循環(huán)結(jié)構(gòu)。不過由于 goto 語句很容易造成代碼混亂,維護和閱讀困難,飽受詬病,不被推薦,而且 goto 循環(huán)完全可以被其他循環(huán)取代,所以后來的很多編程語言都取消了 goto 語句,這里筆者也不再進行講解。
國內(nèi)很多大學(xué)仍然講解 goto 語句,但也僅僅是完成教材所設(shè)定的課程,goto 語句在實際開發(fā)中很難見到。對于 while 和 do-while 循環(huán),循環(huán)體中應(yīng)包括使循環(huán)趨于結(jié)束的語句。對于 while 和 do-while 循環(huán),循環(huán)變量的初始化操作應(yīng)該在 while 和 do-while 語句之前完成,而 for 循環(huán)可以在內(nèi)部實現(xiàn)循環(huán)變量的初始化。for 循環(huán)是最常用的循環(huán),它的功能強大,一般都可以代替其他循環(huán)。最后還要注意 break 和 continue 關(guān)鍵字用于循環(huán)結(jié)構(gòu)時的區(qū)別:
break 用來跳出所有循環(huán),循環(huán)語句不再有執(zhí)行的機會;
continue 用來結(jié)束本次循環(huán),直接跳到下一次循環(huán),如果循環(huán)條件成立,還會繼續(xù)循環(huán)。
此外,break 關(guān)鍵字還可以用于跳出 switch…case 語句。所謂 跳出
, 是指一旦遇到 break,就不再執(zhí)行 switch 中的任何語句,包括當(dāng)前分支中的語句和其他分支中的語句;也就是說,整個 switch 執(zhí)行結(jié)束了,接著會執(zhí)行整個 switch 后面的代碼。
至此今天的學(xué)習(xí)就到此結(jié)束了,筆者在這里聲明,筆者寫文章只是為了學(xué)習(xí)交流,以及讓更多學(xué)習(xí)C語言的讀者少走一些彎路,節(jié)省時間,并不用做其他用途,如有侵權(quán),聯(lián)系博主刪除即可。感謝您閱讀本篇博文,希望本文能成為您編程路上的領(lǐng)航者。祝您閱讀愉快!
文章來源:http://www.zghlxwxcb.cn/news/detail-764209.html
????好書不厭讀百回,熟讀課思子自知。而我想要成為全場最靚的仔,就必須堅持通過學(xué)習(xí)來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力。
????如果我的博客對你有幫助、如果你喜歡我的博客內(nèi)容,請點贊
、評論
、收藏
一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。
?編碼不易,大家的支持就是我堅持下去的動力。點贊后不要忘了關(guān)注
我哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-764209.html
到了這里,關(guān)于C語言系統(tǒng)化精講(六):C語言選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!