4.3 if語(yǔ)句
在C語(yǔ)言中可以用if語(yǔ)句構(gòu)成選擇結(jié)構(gòu)。if語(yǔ)句的語(yǔ)義是,根據(jù)給定條件的值,以決定執(zhí)行某個(gè)分支程序段,所以也稱(chēng)為條件語(yǔ)句。
4.3.1 if語(yǔ)句的3種形式
1.基本if語(yǔ)句
基本if語(yǔ)句的格式為:
if(表達(dá)式) 語(yǔ)句;
這是if語(yǔ)句最簡(jiǎn)單的一種形式。其中,if是關(guān)鍵字標(biāo)識(shí)符;表達(dá)式可以是任何類(lèi)型的表達(dá)式,但兩側(cè)的括號(hào)不能省略;語(yǔ)句稱(chēng)為if的內(nèi)嵌語(yǔ)句,也叫if子句,可以是任何符合C語(yǔ)言語(yǔ)法的語(yǔ)句,但應(yīng)是邏輯上的一條語(yǔ)句。如果if子句需要多條語(yǔ)句,則應(yīng)寫(xiě)成復(fù)合語(yǔ)句的形式,使其在語(yǔ)法上作為一條語(yǔ)句,這是復(fù)合語(yǔ)句的重要語(yǔ)法作用之一。
該語(yǔ)句的語(yǔ)義是,如果表達(dá)式的值為非0(真),則執(zhí)行if子句;否則跳過(guò)if子句,執(zhí)行if語(yǔ)句的后續(xù)語(yǔ)句。參見(jiàn)圖4.1。
例如:
if(x>0)printf("%f\n",sqrt(x)); /* sqrt()是求平方根的標(biāo)準(zhǔn)函數(shù) */
【例4.3】 輸入兩個(gè)整數(shù),輸出其中較大的數(shù)。
分析:定義3個(gè)整型變量a、b和max,其中a、b用于表示從鍵盤(pán)輸入的任意兩個(gè)整數(shù), max表示其中較大的數(shù)。首先假設(shè)a是較大的數(shù),即先把a(bǔ)賦予變量max,再用基本if語(yǔ)句判別max和b的大小,如果max小于b,則把b賦予max。因此,max中總是較大的數(shù),最后輸出max的值,其N(xiāo)-S流程圖如圖4.2所示。
程序代碼如下:
/* 輸入兩個(gè)整數(shù),輸出其中較大的數(shù) */
#include "stdio.h"
main( )
{
int a,b,max;
printf("\n input two numbers: ");
scanf("%d,%d",&a,&b);
max=a;
if (max<b) max=b;
printf("max=%d\n",max);
}
程序運(yùn)行結(jié)果如下:
輸入: 4,3
輸出: max=4
【例4.4】 分析下面程序的輸出結(jié)果。
#include"stdio.h"
main()
{
int a,b,t;
printf("\n input two numbers:");
scanf("%d,%d",&a,&b);
printf("%d,%d\n",a,b);
if(a<b)
{
t=a;
a=b;
b=t;
}
printf("%d,%d\n",a,b);
}
請(qǐng)思考,如果將上例中if子句的大括號(hào)去掉,程序的運(yùn)行結(jié)果是什么?
2.if-else語(yǔ)句
if-else語(yǔ)句的格式為:
if(表達(dá)式)
語(yǔ)句1;
else
語(yǔ)句2;
該語(yǔ)句的語(yǔ)義是,如果表達(dá)式的值為非 0(真),則執(zhí)行語(yǔ)句1;否則執(zhí)行語(yǔ)句2,見(jiàn)圖4.3。語(yǔ)句1和語(yǔ)句2也稱(chēng)為if子句和else子句,它們應(yīng)是邏輯上的一條語(yǔ)句。
對(duì)于例4.3,也可以只定義兩個(gè)變量a和b,利用if-else語(yǔ)句實(shí)現(xiàn)程序要求。如果a>b,則輸出a,否則輸出b。改寫(xiě)例4.3的程序代碼如下:
/* 輸入兩個(gè)整數(shù),輸出其中較大的數(shù) */
#include"stdio.h"
main()
{
int a,b;
printf("input two numbers:");
scanf("%d,%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
3.if-else if-else語(yǔ)句
if-else if-else語(yǔ)句的格式如下:
if(表達(dá)式1)
語(yǔ)句1;
else if(表達(dá)式2)
語(yǔ)句2;
else if(表達(dá)式3)
語(yǔ)句3;
……
else if(表達(dá)式n-1)
語(yǔ)句n-1;
else
語(yǔ)句n;
該語(yǔ)句的語(yǔ)義是,依次判斷各表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)表達(dá)式的值為非 0(真)時(shí),則執(zhí)行其對(duì)應(yīng)的內(nèi)嵌語(yǔ)句,然后跳到整個(gè) if 語(yǔ)句之外繼續(xù)其后續(xù)語(yǔ)句,如果所有表達(dá)式均為 0 (假),則執(zhí)行else子句(語(yǔ)句n),然后繼續(xù)執(zhí)行后續(xù)語(yǔ)句,參見(jiàn)圖4.4。
例如:
if(number>100)
cost=0.15;
else if(number>50)
cost=0.10;
else if(number>10)
cost=0.075;
else
cost=0;
【例4.5】 編寫(xiě)程序判斷從鍵盤(pán)輸入的字符是控制字符、數(shù)字字符、大寫(xiě)英文字母、小寫(xiě)英文字母,還是其他字符。
分析:定義一個(gè)字符型變量c,接收從鍵盤(pán)輸入的字符,然后根據(jù)c的ASCII碼來(lái)判別輸入字符的類(lèi)型。從ASCII碼表可知,控制字符的ASCII碼值小于32,數(shù)字字符“0”到“9”的ASCII碼值在48~57范圍內(nèi),大寫(xiě)英文字母“A”到“Z”的ASCII碼值在65~91范圍內(nèi),小寫(xiě)英文字母“a”到“z”的ASCII碼值在97~123范圍內(nèi),其余則為其他字符。這是一個(gè)多分支選擇的問(wèn)題,可利用if-else if-else語(yǔ)句判斷c的ASCII值所在的范圍,分別給出不同的輸出。
程序代碼如下:
#include"stdio.h"
main()
{
char c;
printf("input a character:");
c=getchar(); /* 也可使用語(yǔ)句:scanf("%c",&c); */
if(c<32)
printf("This is a control character\n");
else if(c>=48&&c<=57)
printf("This is a digit\n");
else if(c>=65&&c<=91)
printf("This is a capital letter\n");
else if(c>=97&&c<=123)
printf("This is a small letter\n");
else
printf("This is an other character\n");
}
程序運(yùn)行結(jié)果如下:
輸入: a
輸出: This is a small letter
因?yàn)樵贑語(yǔ)言中,字符型數(shù)據(jù)和整型數(shù)據(jù)通用,所以例4.5中的if語(yǔ)句也可改寫(xiě)為下列形式:
if(c<32)
printf("This is a control character\n");
else if(c>='0'&&c<='9')
printf("This is a digit\n");
else if(c>='A'&&c<='Z')
printf("This is a capital letter\n");
else if(c>='a'&&c<='z')
printf("This is a small letter\n");
else
printf("This is an other character\n");
【例4.6】 已知學(xué)生的百分制成績(jī),編寫(xiě)程序按百分制分?jǐn)?shù)進(jìn)行分段評(píng)定,分出相應(yīng)的等級(jí):
● 如果分?jǐn)?shù)大于等于90,則評(píng)定為A;
● 如果分?jǐn)?shù)在80~89范圍內(nèi),則評(píng)定為B;
● 如果分?jǐn)?shù)在70~79范圍內(nèi),則評(píng)定為C;
● 如果分?jǐn)?shù)在60~69范圍內(nèi),則評(píng)定為D;
● 如果分?jǐn)?shù)小于60,則評(píng)定為E。
分析:這是一個(gè)典型的多分支選擇問(wèn)題。定義一個(gè)實(shí)型變量score表示從鍵盤(pán)輸入的學(xué)生百分制成績(jī),定義一個(gè)字符型變量grade表示相應(yīng)的等級(jí),用if-else if-else語(yǔ)句判斷分?jǐn)?shù)所在的范圍,給字符型變量grade賦予相應(yīng)的評(píng)定等級(jí)值,最后輸出score和gread的值。
程序代碼如下:
#include"stdio.h"
main()
{
double score;char grade;
printf("Please input the student's score:");
scanf("%lf",&score);
if(score>=90)
grade='A';
else if(score>=80)
grade='B';
else if(score>=70)
grade='C';
else if(score>=60)
grade='D';
else
grade='E';
printf("%lf,%c\n",score,grade);
}
程序運(yùn)行結(jié)果如下:
輸入:85
輸出:85.000000,B
4.在使用if語(yǔ)句時(shí)應(yīng)注意的問(wèn)題
① 在if語(yǔ)句的3種形式中,if關(guān)鍵字之后必須有一對(duì)括號(hào),把表示判斷條件的表達(dá)式括起來(lái)。
② 在if語(yǔ)句的3種形式中,表示判斷條件的表達(dá)式通常是關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是其他表達(dá)式,如算術(shù)表達(dá)式、賦值表達(dá)式等,還可以是單個(gè)常量或變量(單個(gè)常量或變量可看成是表達(dá)式的特殊情況)。C語(yǔ)言關(guān)心的只是表達(dá)式的值是0還是非0而不是表達(dá)式的形式,所以只要表達(dá)式的值為非0,就執(zhí)行其后的內(nèi)嵌語(yǔ)句。
例如:
if(a=b) /* 表示條件的表達(dá)式是賦值表達(dá)式 */
printf("%d",a);
else
printf("a=0");
本語(yǔ)句的語(yǔ)義是,把b值賦予a,如果為非0則輸出該值,否則輸出"a=0"字符串。
③ 在if語(yǔ)句的3種形式中,所有的內(nèi)嵌語(yǔ)句應(yīng)為單個(gè)語(yǔ)句,如果希望在滿(mǎn)足條件時(shí)執(zhí)行一組(多個(gè))語(yǔ)句,則必須把這一組語(yǔ)句用一對(duì)大括號(hào)“{}”括起來(lái)組成一個(gè)復(fù)合語(yǔ)句,但要注意在右大括號(hào)“}”之后不能再加分號(hào)。
例如,下列語(yǔ)句完成“如果a>b,則將a和b的值交換”的功能:
if(a>b)
{t=a;a=b;b=t;}
④ 無(wú)論if語(yǔ)句的形式如何,從C語(yǔ)言的語(yǔ)法上來(lái)說(shuō),它們都是一條完整的控制語(yǔ)句。
4.3.2 if語(yǔ)句的嵌套
C語(yǔ)言允許if語(yǔ)句嵌套,即在if語(yǔ)句的內(nèi)嵌語(yǔ)句中出現(xiàn)一個(gè)或多個(gè)其他的if語(yǔ)句,這種形式被稱(chēng)為if語(yǔ)句的嵌套結(jié)構(gòu)。采用嵌套結(jié)構(gòu)的實(shí)質(zhì)其實(shí)是為了實(shí)現(xiàn)多分支選擇。嵌套結(jié)構(gòu)的一般形式可表示如下:
if(表達(dá)式1)
if( 表達(dá)式2)語(yǔ)句1; /* 內(nèi)嵌if 語(yǔ)句 */
else 語(yǔ)句2;
else
if(表達(dá)式3) 語(yǔ)句3; /* 內(nèi)嵌if 語(yǔ)句 */
else語(yǔ)句4;
該語(yǔ)句的語(yǔ)義是,如果表達(dá)式1和表達(dá)式2的值均為非0,則執(zhí)行語(yǔ)句1;如果表達(dá)式1的值非0,而表達(dá)式2的值為0,則執(zhí)行語(yǔ)句2;如果表達(dá)式1的值為0,而表達(dá)式3的值為非0,則執(zhí)行語(yǔ)句3;如果表達(dá)式1和表達(dá)式3的值均為0,則執(zhí)行語(yǔ)句4。所以該語(yǔ)句實(shí)現(xiàn)了4個(gè)分支的選擇。
由于if語(yǔ)句有多種形式,所以其嵌套形式也有多種,根據(jù)實(shí)際情況可實(shí)現(xiàn)多種分支選擇結(jié)構(gòu)。在使用if的嵌套形式時(shí)應(yīng)當(dāng)注意的是if與e1se的配對(duì)關(guān)系。根據(jù)C語(yǔ)言的語(yǔ)法,關(guān)鍵字if可以沒(méi)有對(duì)應(yīng)的關(guān)鍵字else(基本if語(yǔ)句),但關(guān)鍵字else必須要有對(duì)應(yīng)的關(guān)鍵字if。C語(yǔ)言規(guī)定從最內(nèi)層開(kāi)始,e1se總是與位于它前面最近的(未曾配對(duì)的)if配對(duì)。
【例4.7】 用if語(yǔ)句的嵌套形式完成下列分段函數(shù)的計(jì)算:
#include"stdio.h"
main()
{
double x,y;
scanf("%lf",&x);
if(x!=0)
if(x>0) /* 嵌套的if-else語(yǔ)句 */
y=1;
else
y=1;
else
y=0;
printf("%lf,%lf",x,y);
}
程序運(yùn)行結(jié)果如下:
輸入:10
輸出:10.000000,1.000000
程序中使用了if-else語(yǔ)句結(jié)構(gòu),其中的if子句又是一個(gè)if-else語(yǔ)句結(jié)構(gòu)。
4.3.3 條件運(yùn)算符和條件表達(dá)式
在if-else語(yǔ)句中,當(dāng)if子句和else子句都只是給同一個(gè)變量賦值的單個(gè)賦值語(yǔ)句時(shí),可以使用C語(yǔ)言提供的條件表達(dá)式來(lái)代替if-else語(yǔ)句,實(shí)現(xiàn)給變量賦值的目的。這樣不但使程序簡(jiǎn)潔,也提高了運(yùn)行效率。條件表達(dá)式的一般形式為:
表達(dá)式1?表達(dá)式2:表達(dá)式3
其中,“?:”為條件運(yùn)算符,它們是一對(duì)三目運(yùn)算符,不能分開(kāi)單獨(dú)使用。條件運(yùn)算符的優(yōu)先級(jí)低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符,但高于賦值運(yùn)算符。結(jié)合方向?yàn)橛医Y(jié)合性。
條件表達(dá)式的求值規(guī)則為,先求解表達(dá)式1,如果表達(dá)式1的值為非0,則條件表達(dá)式的值為表達(dá)式2 的值,否則為表達(dá)式3的值。
條件表達(dá)式通常用于賦值語(yǔ)句之中。
例如,下列if-else語(yǔ)句實(shí)現(xiàn)了將a和b中較大的數(shù)賦給max。
if(a>b)
max=a;
else
max=b;
改寫(xiě)上述if-else語(yǔ)句為如下賦值語(yǔ)句:
max=(a>b)?a:b; /* 利用條件表達(dá)式給變量max賦值 */
該語(yǔ)句的語(yǔ)義為,如a>b為真,則把a(bǔ)賦予max,否則把b賦予max。
例4.7中的分段函數(shù)的計(jì)算也可以用條件表達(dá)式實(shí)現(xiàn)給變量y賦值,請(qǐng)看下列賦值語(yǔ)句:
Y=x>0?1:x==0?0:-1
該語(yǔ)句應(yīng)理解為:
Y=x>0?1:x==0?0:-1
這是條件表達(dá)式嵌套的情形,即其中的表達(dá)式3又是一個(gè)條件表達(dá)式。