C語言中一個括號引發(fā)的……

今天給大家?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í)行流程,從這個例子中我們可以看出,不要隨意省略括號是良好的編程習慣,

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容