當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語(yǔ)言程序基本結(jié)構(gòu)詳解
在C語(yǔ)言的補(bǔ)習(xí)課程中,有些學(xué)生對(duì)于C語(yǔ)言的結(jié)構(gòu)不是很了解,為此為了讓學(xué)生對(duì)于C語(yǔ)言有多的認(rèn)識(shí),有利于促進(jìn)C語(yǔ)言的學(xué)習(xí),本文對(duì)C語(yǔ)言的程序結(jié)構(gòu)進(jìn)行了簡(jiǎn)單的分析與解釋。
程序結(jié)構(gòu):在C語(yǔ)言程序中,一共有三種程序結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)(分支結(jié)構(gòu))、循環(huán)結(jié)構(gòu);另外會(huì)介紹一個(gè)重要的結(jié)構(gòu),函數(shù)的介紹。
一、流程控制
1.順序結(jié)構(gòu)
默認(rèn)的流程結(jié)構(gòu),按照書寫順序執(zhí)行每一條語(yǔ)句
我們開始接觸的就是順序結(jié)構(gòu):
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("Hello World!\n");
return 0;
}
如上面的例子,就是簡(jiǎn)單的順序結(jié)構(gòu)。
程序講解:
#include<stdio.h>:標(biāo)準(zhǔn)I/O頭文件,下文中的printf需要使用這個(gè)文件
int main():主函數(shù),一個(gè)程序的入口。一個(gè)程序有且只有一個(gè)main()函數(shù)
int:代表主函數(shù)的返回值類型是int型
printf():格式化輸出,將括號(hào)內(nèi)的內(nèi)容打印到顯示器上,打印字符串需要用雙引號(hào)""引上
return 0;:配合主函數(shù)類型使用,一般來(lái)說(shuō)返回0的程序表示程序運(yùn)行成功
打印的結(jié)果為:Hello World!
2.選擇結(jié)構(gòu)
對(duì)給定的條件進(jìn)行判斷,再根據(jù)判斷結(jié)果來(lái)決定執(zhí)行那一段代碼
3.循環(huán)結(jié)構(gòu)
*在給定條件成立的情況下,反復(fù)執(zhí)行某一段代碼
二、選擇結(jié)構(gòu)--if
1.使用方式
1> if(表達(dá)式) 語(yǔ)句1;
* if(i>1) 恭喜你被黑馬錄取;
2> if(表達(dá)式) 語(yǔ)句1;else 語(yǔ)句2;
* if(i>1) 恭喜你被黑馬錄取;else 希望你再接再厲;
3> if(表達(dá)式){}
if(表達(dá)式){}
else{}
4> if (){}
else if(){}
else{}
選擇結(jié)構(gòu):C語(yǔ)言中常用的選擇結(jié)構(gòu)主要有以下兩種:
我們引入了一個(gè)bool類型的值(也叫boolean類型,布爾類型),只有兩個(gè)值,即真和假。C語(yǔ)言的判斷表達(dá)式終的值就是一個(gè)bool類型,這個(gè)判斷表達(dá)式的bool值就決定了選擇結(jié)構(gòu)如何選擇,循環(huán)結(jié)構(gòu)如何循環(huán);
if else:引入關(guān)鍵字:if else else if
if (bool值) // 如果bool值為真,則執(zhí)行代碼段1,否則執(zhí)行代碼段2
{
代碼段1
}
else
{
代碼段2
}
if (bool值1) // 如果bool值1為真,則執(zhí)行代碼段1,否則判斷bool值2是否為真
{
代碼段1
}
else if (bool值2) // 若bool值2為真則執(zhí)行代碼段2,否則直接執(zhí)行代碼段3
{ // 開頭的if和結(jié)尾的else都只能有一個(gè),但是中間的else if可以有好多個(gè)
代碼段2
}
else
{
代碼段3
}
這段代碼里,就有了選擇結(jié)構(gòu),可以根據(jù)不同的判斷,選擇相應(yīng)的執(zhí)行代碼 。
C 語(yǔ)言的編程中 ‘//’ 的含義是注釋的意思。
三、選擇結(jié)構(gòu)--switch
1.使用格式
* switch(表達(dá)式) { case 數(shù)值1: break; … default: break;}
* 舉例
switch case:引入關(guān)鍵字:switch case break default
switch (變量) // 執(zhí)行到這一句時(shí),變量的值是已知的
{ // switch case語(yǔ)句執(zhí)行時(shí),會(huì)用該變量的值依次與各個(gè)case后的常數(shù)去對(duì)比,試圖找到第一個(gè)匹配項(xiàng),找到匹配的項(xiàng)目后,
case 常數(shù)1: // 就去執(zhí)行該case對(duì)應(yīng)的代碼段,如果沒找到則繼續(xù)下一個(gè)case,直到default
代碼段1; // 如果前面的case都未匹配,則default匹配。
break;
case 常數(shù)2:
代碼段2;
break;
……
default:
代碼段n;
break;
}
*break作用:跳出整個(gè)循環(huán);如果不寫break,語(yǔ)句會(huì)一直向下執(zhí)行,直到遇到break。
這個(gè)就是switch case語(yǔ)句的選擇語(yǔ)句。
注意:
第一, case中必須是常數(shù),而且必須是整形;
第二, 一般來(lái)說(shuō),每個(gè)case中代碼段后都必須有一個(gè)break;
第三,case之后一般都會(huì)有default,雖然語(yǔ)法上允許沒有default,但是建議寫代碼時(shí)一定要寫。
關(guān)于兩種的比較:if else和switch case的區(qū)別:if else適合對(duì)比條件較復(fù)雜,但是分支比較少的情況,switch case適合那種對(duì)比條件簡(jiǎn)單,但是分支較多的情況。通常的做法是:在適合使用switch case的情況下會(huì)優(yōu)先使用switch case,如果不適合則使用if else。這一點(diǎn)根據(jù)自身情況,選擇合適的方法使用。
2.if和switch的比較
* 很多情況下可以互換
* if使用方式較為靈活,使用的較多;switch適合有某個(gè)值
四、循環(huán)結(jié)構(gòu)
1) 循環(huán)機(jī)構(gòu)--for
(1) for:
for (循環(huán)控制變量初始化; 循環(huán)終止條件; 循環(huán)控制變量增量)
{
循環(huán)體
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i, sum = 0;
for(i = 0; i<= 100; i++)
{
sum = sum + i;
}
printf("%d\n", sum);
return 0;
}
循環(huán)執(zhí)行步驟:
第一, 先進(jìn)行循環(huán)控制變量初始化;
第二, 執(zhí)行循環(huán)終止條件,如果判斷結(jié)果為真,則進(jìn)入第三步;如果為假則循環(huán)終止并退出;
第三,執(zhí)行循環(huán)體;
第四,執(zhí)行循環(huán)控制變量增量,轉(zhuǎn)入第二步;記住他的循環(huán)步驟,編寫程序的時(shí)候就會(huì)很簡(jiǎn)單。上面的事例程序就是從從1 加到100的運(yùn)算。
注意:for循環(huán)()中的三部分除了循環(huán)終止條件外,其他兩部分都可以省略,但標(biāo)準(zhǔn)的for循環(huán)中,應(yīng)該把循環(huán)控制變量的初始化,增量都放在()當(dāng)中,并且在循環(huán)體中絕對(duì)不應(yīng)該更改循環(huán)控制變量,這個(gè)在編程中要注意。
2)循環(huán)結(jié)構(gòu)--while
特點(diǎn)
*只有滿足條件是才會(huì)執(zhí)行循環(huán)體
*特別注意是否進(jìn)入了死循環(huán)
(2) while:
循環(huán)控制變量初始化
while(循環(huán)終止條件)
{
循環(huán)體
循環(huán)控制變量增量
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0, sum = 0;
while(i <= 100)
{
sum = sum + i;
i++;
}
printf("%d\n", sum);
return 0;
}
循環(huán)執(zhí)行步驟:第一,先進(jìn)行循環(huán)控制變量初始化(在while之前);第二,判斷循環(huán)終止條件,如果判斷結(jié)果為真,則進(jìn)入第三步;如果為假則不執(zhí)行循環(huán)體;第三,執(zhí)行循環(huán)體;第
特點(diǎn)
*只有滿足條件是才會(huì)執(zhí)行循環(huán)體
*特別注意是否進(jìn)入了死循環(huán)
3) 循環(huán)結(jié)構(gòu)--do while
1.特點(diǎn)
* 一定會(huì)執(zhí)行一次循環(huán)體
2.使用
*對(duì)比while的使用
(3) do while:
循環(huán)控制變量初始化
do
{
循環(huán)體
循環(huán)控制變量增量
}while (循環(huán)終止條件);
#include< stdio.h>
int main(int argc, const char *argv[])
{
int i = 0, sum = 0;
do
{
sum = sum + i;
i++;
}while(i <= 100);
printf("%d\n", sum);
return 0;
}
循環(huán)執(zhí)行步驟:第一,先進(jìn)行循環(huán)控制變量初始化(在do while之前);第二,執(zhí)行循環(huán)體;第三,執(zhí)行循環(huán)控制變量增量;第四,判斷循環(huán)終止條件,如果判斷結(jié)果為真,則返回第二步;如果為假則直接退出循環(huán);
上面關(guān)于循環(huán)的例子都是一樣的,但需要學(xué)會(huì)比較內(nèi)部的區(qū)別。不管哪種循環(huán)結(jié)構(gòu),都不能缺少循環(huán)控制條件初始化,終止條件,循環(huán)控制變量增量,循環(huán)體這四部分;while循環(huán)是先判斷后執(zhí)行,do while循環(huán)是先執(zhí)行后判斷,等循環(huán)一次之后,其實(shí)都是一樣的。
補(bǔ)充:
1> 死循環(huán) for(;;); 有時(shí)候我們會(huì)在子線程中使用無(wú)限循環(huán),以達(dá)到不讓縣城退出的目的。
2> 注意:for循環(huán)體內(nèi)變量的作用域
3> while循環(huán)和for循環(huán)的比較
* 可以互換
* for循環(huán)的變量可以及時(shí)回收