本篇介紹的是C++的一些常用技巧。這些技巧看起來好像很不起眼,在實際應用當中卻起著重要作用。這些技巧雖然是談不上可以提高程式的編寫效率,卻可以為你去除一些不必要的麻煩和一些程式中不易被發現的隱患。
1.都是“=”惹的禍
先來看看下麵兩個判斷運算式的寫法有什麼不同:
// 第一種寫法:
if( value == 0 )
{
……
}
// 第二種寫法:
if( 0 == value ) // 推薦!
{
……
}
value是一個變數,兩個判斷運算式都是判斷變數value是否等於0。所不同的是,兩個判斷運算式的變數value和常量0的位置剛好對調了。第一個是“value == 0”,另一個是“0 == value”。
許多程式員並不知道這兩種寫法有什麼不同,他們通常使用的寫法是“value == 0”,我在這裏推薦大家最好寫成“0 == value”這種形式。
兩個寫法有什麼不同嗎?第二種寫法是否比第一種寫法更有效率?很遺憾,兩種寫法的效率是一樣的。那麼為什麼我要推薦大家使用第二種寫法呢?原因是在C++裏判斷兩個值是否相等使用的運算符是兩個等於號(==),沒有人能百分之百地保證自己不會漏寫一個等號。使用第一種運算式的寫法,如果漏寫了一個等號的話就變成下麵的樣子:
if( value = 0 ) // 嚴重的錯誤,卻沒有任何的錯誤提示和警告
{……
}
上面的判斷運算式,原本的意圖是想判斷變數value是否等於0的,但由於漏寫了一個等於號,卻變成了給變數value賦值為0。我們知道,在條件判斷中,如果條件運算式的值是非0的話,條件就為真,否則為假。像上面那樣寫法,條件判斷就永遠為假了(如果是非0的話就永遠為真)。像這樣漏寫一個等號的情況,條件運算式的值要麼永遠為真,要麼永遠為假。這種判斷兩個值是否相等的條件運算式,程式中應該有許多,有一兩處漏寫了一個等號並不足為奇,可怕的是程式一般都可以正常運行,而且有許多情況並不易察覺得出來有什麼異樣。編譯器更不會給出任何的錯誤提示或警告,因為這種運算式是完全合法的。
如果是換成第二種寫法,而又那麼不小心漏寫一個等號的話,程式變成下麵的樣子:
if( 0 = value ) // 不合法的運算式,編譯器將給出錯誤提示
{
……
}
編譯程序,編譯器給出以下的錯誤提示:
error C2106: “=” : 左運算元必須為 l 值
因此,我們可以輕鬆地知道哪里漏寫了一個等號。 |