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