有個國外團隊檢測了 200 多個 C/C++ 開源專案,包括了 Php、Qt 和 Linux 核心等知名專案。於是他們每天分享一個錯誤案例,並給出相應建議。本篇案例來自 KDE4 原始碼。
錯誤程式碼:
1 2 3 4 5 6 7 8 9 10 |
void LDAPProtocol::del( const KUrl &_url, bool ) { .... if ( (id = mOp.del( usrc.dn() ) == -1) ) { LDAPErr(); return; } ret = mOp.waitForResult( id, -1 ); .... } |
說明:
一些程式設計師竭盡全力想把更多的程式碼壓縮到一行。他們尤其熱衷於“if”條件語句,把賦值和比較一次性完成。
一個典型的錯誤模式是使用 if (A = Foo() == Error) 這樣的表示式。上面我們正在處理的例項程式碼正是這種錯誤。
比較操作的優先順序高於賦值操作。這就是為什麼”mOp.del( usrc.dn() ) == -1″ 比較會先執行,然後“true”(1) 或“false”(0) 值被賦給變數 id。
如果 mOp.del() 返回“-1”,函式會終止;否則,函式會持續執行,“id”變數會被賦予一個錯誤的值。它的結果總為 0。
正確程式碼:
1 2 |
id = mOp.del(usrc.dn()); if ( id == -1 ) { |
建議:
不要懶得去寫多餘的程式碼:畢竟複雜的表示式很難讀懂。首先進行賦值,然後再比較。這樣以後維護你程式碼的程式設計師也會輕鬆很多,也會減少出錯的可能。
今天的這個小技巧看起來很微不足道,不過我希望它會幫到你,牢牢記住並迫使自己寫乾淨整潔且正確的程式碼,而不是“看我有多專業!”的風格。