今天給大家?guī)硪粋€比較典型的問題,一個小括號引發(fā)的bug,問題雖小但值得注意。
首先來看如下代碼
if(x ==0)if(y ==0)? ? error();else{? z = x + y;}
在上面這段代碼中,作者的本意是處理兩種情況x等于0以及x不等于0,對于x等于0的情況,如果y也等于0,就調用error()函數(shù)。如果x不等于0,首先求出x和y的和,然后賦值給z。
然而,上面這段代碼實際上所做的卻和編程者的意圖相去甚遠。

其實做為一個學習者,有一個學習的氛圍跟一個交流圈子特別重要這里我推薦一個C語言C++交流群1075673198,不管你是小白還是轉行人士歡迎入駐,大家一起交流成長。
原因在于C語言中有這樣的規(guī)則:else始終優(yōu)先匹配同一對括號中最近未匹配的if。如果我們按照程序實際執(zhí)行的邏輯來調整代碼的縮進,那么代碼實現(xiàn)的功能大致如下:
if(x ==0) {if(y ==0)error();else{z= x + y;? }}
觀察上面的代碼可以發(fā)現(xiàn),如果x不等于0,程序不會進行任何處理。如果程序等于0,會進一步根據(jù)y的值是否為0進行處理。
如果我們想得到原來的例子中由代碼縮進體現(xiàn)的編程者的本意,我們應該這樣寫這個函數(shù)。
if(x ==0) {if(y ==0)error();}else{z= x + y;}
現(xiàn)在else與第一個if正確匹配,即使它距離第二個if更近也是如此,因為此時第二個if已經(jīng)被括號封裝起來了。
一個小小的括號就會完全改變程序的執(zhí)行流程,從這個例子中我們可以看出,不要隨意省略括號是良好的編程習慣,