c語言入門第6節(jié)备闲,掌握它晌端,世界上還有解決不了的問題嗎?if分支語句

到目前為止恬砂,我們舉的 c 語言程序例子都是順序執(zhí)行的咧纠,都是從 main 函數(shù)開始,一條一條按順序執(zhí)行的泻骤。但是漆羔,現(xiàn)實中的問題可不一定都是這么簡單的,例如狱掂,給定一個數(shù)演痒,如果是 0 就打印 zero,否則打印 nonzero趋惨。要解決這個問題仅胞,只使用順序式語句就很難解決了藐吮。

image

事實上导饲,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");
}
image

以上就是 C 語言的 if 語句,只不過我們要把判斷條件“a!=0”用括號括起來洞渤。C 語言的關(guān)系運算符和數(shù)學(xué)中的略有差異,請看下圖:

if 的中文意思是“如果”属瓣,else 的中文意思是“否則”载迄。

image

應(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)系運算符碌奉。
image

總結(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 是假的芦圾。

image

在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é)萎津。

image

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");
image

好了颈渊,現(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í)行效率)

image

另外,下面這幾行代碼編譯時正常的查蓉,但是輸出結(jié)果卻是錯的,雖然 x 并不大于 0榜贴,它還是輸出了 “x is positive”豌研,這是為什么呢?

int x = -3;
if (x > 0);
    printf("x is positive.\n");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唬党,一起剝皮案震驚了整個濱河市鹃共,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驶拱,老刑警劉巖霜浴,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓝纲,居然都是意外死亡阴孟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門税迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來永丝,“玉大人,你說我怎么就攤上這事箭养∧饺拢” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喝检。 經(jīng)常有香客問我嗅辣,道長,這世上最難降的妖魔是什么挠说? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任澡谭,我火速辦了婚禮,結(jié)果婚禮上纺涤,老公的妹妹穿的比我還像新娘译暂。我一直安慰自己,他們只是感情好撩炊,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布外永。 她就那樣靜靜地躺著,像睡著了一般拧咳。 火紅的嫁衣襯著肌膚如雪伯顶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天骆膝,我揣著相機與錄音祭衩,去河邊找鬼。 笑死阅签,一個胖子當著我的面吹牛掐暮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播政钟,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼路克,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了养交?” 一聲冷哼從身側(cè)響起精算,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碎连,沒想到半個月后灰羽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鱼辙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年廉嚼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倒戏。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡前鹅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峭梳,到底是詐尸還是另有隱情舰绘,我是刑警寧澤蹂喻,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站捂寿,受9級特大地震影響口四,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秦陋,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一蔓彩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驳概,春花似錦赤嚼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稚照,卻和暖如春蹂空,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背果录。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工上枕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弱恒。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓辨萍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親返弹。 傳聞我的和親對象是個殘疾皇子锈玉,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容