1.都是“=”惹的禍
先來看看下面兩個判斷表達式的寫法有什麼不同:
// 第一種寫法:
if( value == 0 )
{
……
}
// 第二種寫法:
if( 0 == value ) // 推薦!
{
……
}
value是一個變量,兩個判斷表達式都是判斷變量value是否等於0。所不同的是,兩個判斷表達式的變量value和常量0的位置剛好對調了。第一個是“value == 0”,另一個是“0 == value”。
許多程序員並不知道這兩種寫法有什麼不同,他們通常使用的寫法是“value == 0”,我在這裡推薦大家最好寫成“0 == value”這種形式。
兩個寫法有什麼不同嗎?第二種寫法是否比第一種寫法更有效率?很遺憾,兩種寫法的效率是一樣的。那麼為什麼我要推薦大家使用第二種寫法呢?原因是在C++裡判斷兩個值是否相等使用的運算符是兩個等於號(==),沒有人能百分之百地保證自己不會漏寫一個等號。Tw.WinGWit.CoM使用第一種表達式的寫法,如果漏寫了一個等號的話就變成下面的樣子:
if( value = 0 ) // 嚴重的錯誤,卻沒有任何的錯誤提示和警告
{……
}
上面的判斷表達式,原本的意圖是想判斷變量value是否等於0的,但由於漏寫了一個等於號,卻變成了給變量value賦值為0。我們知道,在條件判斷中,如果條件表達式的值是非0的話,條件就為真,否則為假。像上面那樣寫法,條件判斷就永遠為假了(如果是非0的話就永遠為真)。像這樣漏寫一個等號的情況,條件表達式的值要麼永遠為真,要麼永遠為假。這種判斷兩個值是否相等的條件表達式,程序中應該有許多,有一兩處漏寫了一個等號並不足為奇,可怕的是程序一般都可以正常運行,而且有許多情況並不易察覺得出來有什麼異樣。編譯器更不會給出任何的錯誤提示或警告,因為這種表達式是完全合法的。
如果是換成第二種寫法,而又那麼不小心漏寫一個等號的話,程序變成下面的樣子:
if( 0 = value ) // 不合法的表達式,編譯器將給出錯誤提示
{
……
}
編譯程序,編譯器給出以下的錯誤提示:
error C2106: “=” : 左操作數必須為 l 值
因此,我們可以輕松地知道哪裡漏寫了一個等號。
From:http://tw.wingwit.com/Article/Software/201309/333.html