C語言中一個括號引發(fā)的…… 作者:薛定諤的coding貓 今天給大家?guī)硪粋比較典型的問題,一個小括號引發(fā)的bug,問題雖小但值得注意。 首先來看如下代碼 · · if (x == 0) if (y == 0) error();else{ z = x + y;} 在上面這段代碼中,作者的本意是處理兩種情況x等于0以及x不等于0,對于x等于0的情況,如果y也等于0,就調(diào)用error()函數(shù)。如果x不等于0,首先求出x和y的和,然后賦值給z。 然而,上面這段代碼實際上所做的卻和編程者的意圖相去甚遠(yuǎn)。 原因在于C語言中有這樣的規(guī)則:else始終優(yōu)先匹配同一對括號中最近未匹配的if。如果我們按照程序?qū)嶋H執(zhí)行的邏輯來調(diào)整代碼的縮進(jìn),那么代碼實現(xiàn)的功能大致如下: · · if (x == 0) { if (y == 0) error(); else { z = x + y; }} 觀察上面的代碼可以發(fā)現(xiàn),如果x不等于0,程序不會進(jìn)行任何處理。如果程序等于0,會進(jìn)一步根據(jù)y的值是否為0進(jìn)行處理。 如果我們想得到原來的例子中由代碼縮進(jìn)體現(xiàn)的編程者的本意,我們應(yīng)該這樣寫這個函數(shù)。 · · if (x == 0) { if (y == 0) error();} else { z = x + y;} 現(xiàn)在else與第一個if正確匹配,即使它距離第二個if更近也是如此,因為此時第二個if已經(jīng)被括號封裝起來了。 一個小小的括號就會完全改變程序的執(zhí)行流程,從這個例子中我們可以看出,不要隨意省略括號是良好的編程習(xí)慣,請大家以后注意,感謝耐心閱讀! |