看完了基本數(shù)據(jù)類(lèi)型头镊,就可以處理基本數(shù)據(jù)了,這些基本數(shù)據(jù)類(lèi)型在以后會(huì)經(jīng)常用到魄幕,用法也會(huì)慢慢接觸到相艇。本篇文本主要講述C語(yǔ)言中的控制語(yǔ)句,在C語(yǔ)言中纯陨,控制語(yǔ)句一共有九種坛芽,主要分為:
分支語(yǔ)句(條件判斷語(yǔ)句):if、if-else條件判斷翼抠,switch語(yǔ)句咙轩;
循環(huán)語(yǔ)句 : for循環(huán)、while循環(huán)阴颖、do-while循環(huán)活喊;
輔助控制語(yǔ)句(轉(zhuǎn)向語(yǔ)句) :break語(yǔ)句、return 語(yǔ)句量愧、continue語(yǔ)句钾菊、goto語(yǔ)句帅矗;
下面我們一一介紹這幾種語(yǔ)句的使用,由于輔助控制語(yǔ)句是和其他兩種控制語(yǔ)句組合使用的煞烫,我們會(huì)在介紹前兩種語(yǔ)句的同時(shí)介紹輔助控制語(yǔ)句损晤。
分支語(yǔ)句:
// if if-else 語(yǔ)句
if(condition){
//statements 當(dāng)滿足條件時(shí)執(zhí)行這里的語(yǔ)句
}else{
//statements 當(dāng)不滿足條件時(shí)執(zhí)行這里的語(yǔ)句
}
//or
if(condition1){
//statements 當(dāng)滿足條件1時(shí)執(zhí)行這里的語(yǔ)句
}else if(condition2){
//statements<span style="white-space:pre"> </span> 當(dāng)滿足條件2時(shí)執(zhí)行這里的語(yǔ)句
}else{
//statements<span style="white-space:pre"> </span> 當(dāng)前兩個(gè)條件都不滿足時(shí)執(zhí)行這里的語(yǔ)句
}
if-else語(yǔ)句判斷語(yǔ)句中經(jīng)常使用到的語(yǔ)句,原理很簡(jiǎn)單如上面的寫(xiě)法 if(condition) 這里的condition是一個(gè)整型變量红竭,在C語(yǔ)言中當(dāng)condition==0時(shí)尤勋,條件判斷為假,當(dāng)condition為非零值,條件判斷為真茵宪,以一個(gè)例子來(lái)說(shuō)明:
include <stdio.h>
int main(int argc, const char * argv[]) {
int condition = 1; //定義變量condition最冰,并初始化為1,此時(shí)condition為非零值稀火,因此為真
if (condition) {
printf("line 5:true\n"); //當(dāng) condition 為真值時(shí)暖哨,即 condition 非零時(shí)執(zhí)行
}else{
printf("line 7:false\n");//當(dāng) condition 為假值時(shí),即 condition 為零時(shí)執(zhí)行
}
condition = 0;//更改變量condition的值為零凰狞,在C語(yǔ)言中0代表假
if (condition) {
printf("line 12:true\n"); //當(dāng) condition 為真值時(shí)篇裁,即 condition 非零時(shí)執(zhí)行
}else{
printf("line 14:false\n");//當(dāng) condition 為假值時(shí),即 condition 為零時(shí)執(zhí)行
}
condition = -2;//更改變量condition的值為負(fù)值-2赡若,也是非零值达布,因此為真
if (condition) {
printf("line 19:true\n");
}else{
printf("line 21:false\n");
}
return 0;
}
輸出結(jié)果如下:
line 5:true
line 14:false
line 19:true
Program ended with exit code: 0
通常情況下,可能會(huì)有多個(gè)條件同時(shí)滿足時(shí)才會(huì)執(zhí)行if代碼塊中的語(yǔ)句逾冬,或多個(gè)條件中的任意一個(gè)條件滿足就執(zhí)行if代碼塊中的語(yǔ)句黍聂,這里就要用到嵌套的if語(yǔ)句或者組合邏輯運(yùn)算符來(lái)解決這個(gè)問(wèn)題,先來(lái)看嵌套的if語(yǔ)句身腻,原理和單層if語(yǔ)句是一樣的产还,以一個(gè)例子來(lái)說(shuō)明
int condition1 = 0,condition2 = 1;
if (condition1) {
if (condition2) {
printf("All of the two conditions are false\n");
}else{
printf("Condition1 is true but condition2 is false\n");
}
}else{
if (condition2) {
printf("Conditon1 is false but condition2 is true\n");
}else{
printf("All of the two conditions are false\n");
}
}
輸出結(jié)果如下:
Conditon1 is false but condition2 is true
Program ended with exit code: 0
很多時(shí)候我們只要知道兩者之中都是真或都是假,甚至有時(shí)候我們可以不用理會(huì)到底誰(shuí)是真誰(shuí)是假嘀趟,只要他們組合到一塊是真的或都是假的就行脐区,這時(shí)我們可以使用邏輯運(yùn)算符來(lái)解決這個(gè)總是,首先我們先認(rèn)識(shí)一下C語(yǔ)言中的幾個(gè)常用邏輯運(yùn)算符她按,有時(shí)它們也是條件語(yǔ)句中的一部分牛隅。
C語(yǔ)言中提供了三種邏輯運(yùn)算符,分別為&&與尤溜、||或倔叼、!非。
&& 邏輯與運(yùn)算符宫莱,&&運(yùn)算符兩邊的變量或表達(dá)式同時(shí)為真是 表達(dá)式才為真丈攒,一方為假,表達(dá)式即為假。
|| 邏輯或運(yùn)算符巡验,||運(yùn)算符兩邊的變量或表達(dá)式一方為真际插,整個(gè)表達(dá)式即為真。
! 邏輯非運(yùn)算符显设,! 運(yùn)算符是對(duì) !后面的變量或表達(dá)式取反(所有非零值取反后為0框弛,0值取反后為1)
因此在上面的例子中要表達(dá)condition1和condition2同時(shí)為真時(shí)可用如下方式表達(dá)
if(condition1 && condition2){
printf("All of the two conditions is true\n");
}
同理,若要表達(dá)condition1和condition2中至少有一個(gè)為真時(shí)可用如下方式表達(dá)
if(condition1 || condition2)
{
printf("At least one of the two conditions is true\n");
}
而這里的邏輯非只是返回一個(gè)對(duì)其后的表達(dá)式取反后的值捕捂,但并不會(huì)對(duì)原表達(dá)式賦值瑟枫,如下面表示如果condition為假
if(!condition)
{
printf("Condition is false\n");
}
switch語(yǔ)句是多分支語(yǔ)句,在判定條件比較多時(shí)可使用switch語(yǔ)句:
//switch語(yǔ)句
switch(condition){
case condition1:
//statements1指攒;<span style="white-space:pre"> </span>當(dāng)滿足條件1時(shí)執(zhí)行這里的語(yǔ)句
break;
case condition2:
//statements2<span style="white-space:pre"> </span>當(dāng)滿足條件2時(shí)執(zhí)行這里的語(yǔ)句
break;
.
.
.
default:
//statementsn+1<span style="white-space:pre"> </span>當(dāng)以上條件都不能滿足時(shí)執(zhí)行這里的語(yǔ)句
break;
}
switch語(yǔ)句語(yǔ)義為慷妙,計(jì)算condition的值,并逐一與內(nèi)部的case語(yǔ)句的條件進(jìn)行比較允悦,如果相同膝擂,則繼續(xù)執(zhí)行該case中的statements,若不相同則跳過(guò)case中的statements并對(duì)比下一個(gè)case隙弛,若所有case中的condition都不相同則執(zhí)行default中的statements+1架馋,需要注意的是switch語(yǔ)句中的condition應(yīng)該傳入的值應(yīng)該是整數(shù)類(lèi)型的值,也可以傳入一個(gè)char型的值全闷,因?yàn)榍斑呎f(shuō)過(guò)char其實(shí)也是一種整數(shù)類(lèi)型叉寂,下面一個(gè)例子來(lái)深入感受switch語(yǔ)句。
include <stdio.h>
int main(int argc, const char * argv[]) {
int condition; //定義一個(gè)condition變量來(lái)存儲(chǔ)輸入的值
printf("請(qǐng)輸入1 - 12 中的整數(shù)室埋,將輸出對(duì)應(yīng)月份的英文\n");
scanf("%d",&condition);//從控制臺(tái)接收一個(gè)數(shù)字并保存到condition變量中
switch (condition) {
case 1:
printf("January\n");
break;
case 2:
printf("February\n");
break;
case 3:
printf("March\n");
break;
case 4:
printf("April\n");
break;
case 5:
printf("May\n");
break;
case 6:
printf("June\n");
break;
case 7:
printf("July\n");
break;
case 8:
printf("August\n");
break;
case 9:
printf("September\n");
break;
case 10:
printf("October\n");
break;
case 11:
printf("November\n");
break;
case 12:
printf("December\n");
break;
default:
printf("您輸入的數(shù)字有錯(cuò)誤");
break;
}
return 0;
}
輸出結(jié)果如下:
請(qǐng)輸入1 - 12 中的整數(shù)办绝,將輸出對(duì)應(yīng)月份的英文
2
February
請(qǐng)輸入1 - 12 中的整數(shù)伊约,將輸出對(duì)應(yīng)月份的英文
13
您輸入的數(shù)字有錯(cuò)誤
在if 語(yǔ)句中可以做一些復(fù)雜的判斷姚淆,但在switch中只能判斷整型數(shù)值,因此若要判斷復(fù)雜條件應(yīng)先將相關(guān)復(fù)雜條件轉(zhuǎn)換為數(shù)值條件后屡律,再使用switch來(lái)判斷腌逢。
在這里我們還使用到了一個(gè)輔助控制語(yǔ)句--break,我們稱(chēng)之為跳出語(yǔ)句超埋,其語(yǔ)義是跳出當(dāng)前switch判斷搏讶,并執(zhí)行switch代碼塊下面的語(yǔ)句,在這里即執(zhí)行return 0霍殴;語(yǔ)句媒惕,這里的return語(yǔ)句在前面已經(jīng)說(shuō)過(guò),它后面所跟著的變量類(lèi)型對(duì)應(yīng)于函數(shù)定義時(shí)的返回值類(lèi)型来庭。break語(yǔ)句一般用于switch語(yǔ)句中妒蔚,若在某一case中沒(méi)有使用break語(yǔ)句,那么將不會(huì)跳出switch判斷,而是繼續(xù)進(jìn)行下一case的判斷肴盏,直到執(zhí)行到break語(yǔ)句才會(huì)跳出switch判斷語(yǔ)句科盛。
循環(huán)語(yǔ)句
// for 循環(huán)
for(stateInitialValue;stateEndCondition;changeExpression){
//do something;
}
在c語(yǔ)言中使用for循環(huán)需要先定義一個(gè)狀態(tài)變量娱俺,在for語(yǔ)句中給定初始值辫继、結(jié)束值和變化量刻剥,表示為for(初始值;結(jié)束條件;變化表達(dá)式)匆帚,定義好之后疼燥,狀態(tài)量將從狀態(tài)量初始值開(kāi)始党远,每次改變一個(gè)狀態(tài)量的變化量七问,直到滿足結(jié)束條件竖伯,跳出for循環(huán)章母,下面以一個(gè)例子來(lái)感受一下for循環(huán)的使用:
include <stdio.h>
int main(int argc, const char * argv[]) {
int i;//定義變量i
for (i = 0; i < 10; i++) {
printf("%d ",i);
}
return 0;
}
輸出結(jié)果為:
0 1 2 3 4 5 6 7 8 9
這里的i 為狀態(tài)變量蜡饵,在for 語(yǔ)句中首先初始化這0,然后設(shè)定其結(jié)束條件為i < 10,即當(dāng)執(zhí)行到i >= 10時(shí)循環(huán)結(jié)束胳施,且for語(yǔ)句的代碼塊中的代碼不再執(zhí)行溯祸,此時(shí)在本例中的i == 10 但這個(gè)10并沒(méi)有輸出,隨后設(shè)置i 的變化量為每循環(huán)一次加一舞肆,之后便是for語(yǔ)句的代碼塊焦辅,在里面輸出i的當(dāng)前值。
使用while循環(huán)也可以達(dá)到這一目的椿胯,只需將for循環(huán)的那一段代碼替換為:
while (i < 10) {
printf("%d ",i++);
}
此時(shí)輸出與上面的輸出也是一樣的筷登,while循環(huán)的表達(dá)式可表示為while(條件語(yǔ)句){//while代碼塊},這里的條件語(yǔ)句也需要是一個(gè)整型數(shù)值哩盲。
同樣這一語(yǔ)句用do while也可以完成,代碼如下:
do {
printf("%d ",i++);
} while (i < 10);
需要注意的是前方,使用do-while時(shí)會(huì)先執(zhí)行一次do代碼塊中的語(yǔ)句,然后再進(jìn)行判斷廉油,而使用while和for 時(shí)需要先進(jìn)行條件判斷再執(zhí)行代碼塊中的語(yǔ)句惠险,兩者在輸出上有時(shí)是有差另的。
最后來(lái)看一下goto 語(yǔ)句和continue語(yǔ)句抒线,這兩個(gè)語(yǔ)句的使用頻率不是很高班巩,且不推薦使用goto語(yǔ)句,因?yàn)間oto語(yǔ)句是強(qiáng)制跳轉(zhuǎn)語(yǔ)句嘶炭,在運(yùn)行過(guò)程中可能會(huì)出現(xiàn)各種奇怪的總是抱慌,對(duì)應(yīng)于匯編語(yǔ)言的jJMP指令,為無(wú)條件跳轉(zhuǎn)眨猎,而continue語(yǔ)句語(yǔ)義為跳過(guò)本次循環(huán)未執(zhí)行到的語(yǔ)句抑进,繼續(xù)執(zhí)行下一次循環(huán)
,continue語(yǔ)句一般應(yīng)用于for循環(huán)中睡陪,用例子來(lái)感受continue語(yǔ)句如下:
include <stdio.h>
int main(int argc, const char * argv[]) {
int i = 0;//定義變量i
for (i = 0;i < 10; i++) {
if (i == 5) {
continue;
}
printf("%d ",i);
}
printf("\n%d\n",i);
return 0;
}
輸出結(jié)果如下:
0 1 2 3 4 6 7 8 9
10
總結(jié):
在實(shí)際應(yīng)用中寺渗,控制語(yǔ)句是經(jīng)常使用的語(yǔ)句夕凝,要注意的是各類(lèi)控制語(yǔ)句的執(zhí)行條件,只有這些執(zhí)行邊界條件定義得當(dāng)户秤,才能真正發(fā)揮其作用码秉,如果邊界條件處理不得當(dāng),常常會(huì)發(fā)生一些意想不到的錯(cuò)誤鸡号。