今天給大家?guī)?lái)一個(gè)比較典型的問(wèn)題画恰,一個(gè)小括號(hào)引發(fā)的bug搬泥,問(wèn)題雖小但值得注意蹲蒲。
首先來(lái)看如下代碼
if(x ==0)if(y ==0)? ? error();else{? z = x + y;}
在上面這段代碼中梦染,作者的本意是處理兩種情況x等于0以及x不等于0,對(duì)于x等于0的情況猜憎,如果y也等于0娩怎,就調(diào)用error()函數(shù)。如果x不等于0胰柑,首先求出x和y的和截亦,然后賦值給z。
然而柬讨,上面這段代碼實(shí)際上所做的卻和編程者的意圖相去甚遠(yuǎn)崩瓤。
其實(shí)做為一個(gè)學(xué)習(xí)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要這里我推薦一個(gè)C語(yǔ)言C++交流群1075673198踩官,不管你是小白還是轉(zhuǎn)行人士歡迎入駐却桶,大家一起交流成長(zhǎng)。
原因在于C語(yǔ)言中有這樣的規(guī)則:else始終優(yōu)先匹配同一對(duì)括號(hào)中最近未匹配的if蔗牡。如果我們按照程序?qū)嶋H執(zhí)行的邏輯來(lái)調(diào)整代碼的縮進(jìn)颖系,那么代碼實(shí)現(xiàn)的功能大致如下:
if(x ==0) {if(y ==0)error();else{z= x + y;? }}
觀察上面的代碼可以發(fā)現(xiàn),如果x不等于0辩越,程序不會(huì)進(jìn)行任何處理嘁扼。如果程序等于0,會(huì)進(jìn)一步根據(jù)y的值是否為0進(jìn)行處理区匣。
如果我們想得到原來(lái)的例子中由代碼縮進(jìn)體現(xiàn)的編程者的本意,我們應(yīng)該這樣寫這個(gè)函數(shù)。
if(x ==0) {if(y ==0)error();}else{z= x + y;}
現(xiàn)在else與第一個(gè)if正確匹配亏钩,即使它距離第二個(gè)if更近也是如此莲绰,因?yàn)榇藭r(shí)第二個(gè)if已經(jīng)被括號(hào)封裝起來(lái)了。
一個(gè)小小的括號(hào)就會(huì)完全改變程序的執(zhí)行流程姑丑,從這個(gè)例子中我們可以看出蛤签,不要隨意省略括號(hào)是良好的編程習(xí)慣,