到目前為止恬砂,我們舉的 c 語言程序例子都是順序執(zhí)行的咧纠,都是從 main 函數(shù)開始,一條一條按順序執(zhí)行的泻骤。但是漆羔,現(xiàn)實中的問題可不一定都是這么簡單的,例如狱掂,給定一個數(shù)演痒,如果是 0 就打印 zero,否則打印 nonzero趋惨。要解決這個問題仅胞,只使用順序式語句就很難解決了藐吮。
事實上导饲,C 語言提供了一些分支語句語法,再來分析一下上述問題:給定一個數(shù)蹦锋,【如果】是 0,就打印 zero欧芽,【否則】就打印 nonzero莉掂,用偽代碼來寫這個問題就是:
一個數(shù);
如果 一個數(shù) 不等于 0
打印 nonzero
否則
打印 zero
C 語言作為高級語言千扔,設(shè)計的時候就應(yīng)該貼合人類的使用憎妙,實際上,C 語言解決這個問題曲楚,語句風(fēng)格和上面的偽代碼風(fēng)格非常一致尚氛,請看:
int a = 3;
if(a != 0){
printf("nonzero\n");
}else{
printf("zero\n");
}
以上就是 C 語言的 if 語句,只不過我們要把判斷條件“a!=0”用括號括起來洞渤。C 語言的關(guān)系運算符和數(shù)學(xué)中的略有差異,請看下圖:
if 的中文意思是“如果”属瓣,else 的中文意思是“否則”载迄。
應(yīng)注意:
- 這里的==表示數(shù)學(xué)中的相等關(guān)系,相當于數(shù)學(xué)中的=號抡蛙,初學(xué)者常犯的錯誤是在控制表達式中把==寫成=护昧,在C語言中=號是賦值運算符,兩者的含義完全不同粗截。
- 如果表達式所表示的比較關(guān)系成立則值為真(True)惋耙,否則為假(False),在C語言中分別用1和0表示熊昌。例如x是-1绽榛,那么x>0這個表達式的值為0,x>-2這個表達式的值為1婿屹。
- 在數(shù)學(xué)中a<b<c表示b既大于a又小于c灭美,但作為C語言表達式卻不是這樣。以上幾種運算符都是左結(jié)合的昂利,請讀者想一下這個表達式表示什么届腐?
- 這些運算符的兩個操作數(shù)都應(yīng)該是相同類型的,例如兩邊都是字符型蜂奸、都是整型或者都是浮點型犁苏,但不能比較兩個字符串,以后我們會介紹比較字符串的方法扩所。
- ==和!=稱為相等性運算符(Equality Operator)围详,其余四個稱為關(guān)系運算符(Relational Operator),相等性運算符的優(yōu)先級低于關(guān)系運算符碌奉。
總結(jié)一下 if(a!=0){...}else{...} 語句短曾,首先計算 a!=0寒砖,判斷它是真的還是假的,如果是真的嫉拐,就執(zhí)行 if 后的 {} 里的語句哩都,打印 nonzero;否則就執(zhí)行 else 后 {} 里的語句婉徘,打印 zero漠嵌。這里的 3 不等于 0 是真的,所以就打印 nonzero 了盖呼。
應(yīng)該注意到儒鹿,if(a!=0) 后沒有用 “;”結(jié)束几晤,而是緊跟著 {} 了约炎,這說明這條語句到 if(a!=0) 還沒有結(jié)束,它的處理語句在 {} 里蟹瘾。if 的判斷語句要持續(xù)到遇到 ; 或者 {} 才結(jié)束圾浅。
實際上,上述代碼中的 {} 可以省去憾朴,請看:
int a = 3;
if(a != 0)
printf("nonzero\n");
else
printf("zero\n");
這是因為 if 和 else 后只有一條語句狸捕。如果有兩條語句,就必須用 {} 了众雷。例如:
int a = 0;
if(a != 0)
printf("I know, it is ");
printf("nonzero\n");
這幾句代碼會打印出 “nonzero”灸拍,這顯然是錯誤的。為什么呢砾省?上面鸡岗,其實我們已經(jīng)解釋了,“if 的判斷語句遇到 ; 或者 {} 結(jié)束编兄∠朔浚”,if(a!=0) 的作用范圍持續(xù)到 printf("I know, it is "); 就結(jié)束了翻诉。所以 printf("nonzero\n"); 無論 a 是不是 0炮姨,都會輸出。這種情況下碰煌,就需要 {} 了舒岸。
int a = 0;
if(a != 0){
printf("I know, it is ");
printf("nonzero\n");
}
這樣的代碼就什么也不會輸出了,因為 a 不等于 0 是假的芦圾。
在C語言中蛾派,任何可以放“語句”的地方都既可以是一條語句,也可以是由{}括起來的若干條語句組成的語句塊,如果是語句塊則不需要在{}后面加;號洪乍。如果}后面加了;號眯杏,則這個;號本身又是一條新的語句了,在C語言中一個單獨的;號表示一條空語句壳澳。
語句塊中也可以定義局部變量岂贩,就像函數(shù)體一樣。比如:
void foo(void)
{
int i = 0;
{
int i = 1;
int j = 2;
printf("i=%d, j=%d\n", i, j);
}
printf("i=%d\n", i); /* 這里不能訪問 j */
}
以上代碼輸出
i = 1, j = 2
i = 0
這個和函數(shù)的局部變量是同樣的到里巷波,可以參照《》一節(jié)萎津。
if else 嵌套使用
現(xiàn)在又來了一個新問題:給定一個數(shù),如果它大于 0 就輸出 positive抹镊,如果等于 0 就輸出 zero锉屈,如果小于 0,就輸出 negative垮耳。這樣的代碼可以按照下面寫:
int a = 3;
if(a>0)
printf("positive\n");
else if(a==0)
printf("zero\n");
else
printf("negative\n");
好了颈渊,現(xiàn)在你已經(jīng)學(xué)會 C 語言中 if/else 語句了,可以思考下面的問題了终佛。剛剛那個代碼也可以按照下面的方法寫:
int a = 3;
if(a>0)
printf("positive\n");
if(a==0)
printf("zero\n");
if(a<0)
printf("negative\n");
這兩種寫法有什么區(qū)別呢儡炼?(提示:執(zhí)行效率)
另外,下面這幾行代碼編譯時正常的查蓉,但是輸出結(jié)果卻是錯的,雖然 x 并不大于 0榜贴,它還是輸出了 “x is positive”豌研,這是為什么呢?
int x = -3;
if (x > 0);
printf("x is positive.\n");