標籤:

在C++中,a==b和b==a有沒有什麼區別?

如果說碰見下面這種情況: a是一個整型數,而b是一個整型變數,那麼在判斷兩者是否相等的時候,寫a==b和b==a有沒有什麼區別,或者哪一個更高效一點?

在c++中遇到的問題,但如果在其他的語言中也存在不同的話,也請不吝賜教。


只說標題的話,有。a == b匹配到的是a.(operator ==)(b),或者operator ==(a,b);b == a則反過來匹配b.(operator ==)(a),或者operator ==(b,a)。原理上可以把兩者實現成不一樣的,導致兩個方向的結果可能不一樣,但一般人都不會這麼干,大部分人應該會只實現一個方向,在另一個方向上調用這個方向吧。

如果不考慮運算符重載的問題,那麼把常量放在左邊、變數放右邊主要是為了防止手殘把==寫成=,但其實我個人不覺得這種傻X錯誤值得用一個更傻X的方法來解決……


2017年的說法是,對於這種變數比常數的表達式,如果開優化編譯出來,結果一個快一個慢,那就把編譯器的作者抓出來打。


對於基本類型(primitive type),此運算符滿足交換律;對於類/結構體,重載此運算符可以不滿足交換律,但正常人不會這麼做吧。


對於 Boost.Test 來說,有區別

#define BOOST_TEST_MODULE boost_test_macro3
#include &

BOOST_AUTO_TEST_CASE( test_op_reportings )
{
int x = 1;
int y = 1;
BOOST_TEST(x + y == 3);
}

輸出

check x + y == 3 has failed [1 + 1 != 3]

把 x + y == 3 換成 3 == x + y ,則會輸出

check 3 == x + y has failed [3 != 2]

(實際的程序輸出稍長一些,這裡只截取了與主題相關的輸出)

注意方括弧裡面,前者把加法的形式保留下來了,後者只記錄了加法的結果。換句話說,把常量放左邊的做法會損失信息量


基本沒有區別。但是c++編譯器複雜到基本算是個黑箱。不排除某些情況觸發邊際條件。使得性能不一樣


感覺這樣的問題比較無營養。還不如問一下==和strcmp的區別。


在沒有重載==運算符的時候應該是相等的 但是如果重載就不一定了

例如重載時特判


如果a和b是兩個表達式的話,那麼差別將會是:表達式運算時序不同。

int a=2;

if(((a=a*2)&>0)==((a=a+2)&>0))

cout&<&


如果a和b各自所在類都有==的重載方法,那就沒區別。


用帶右值引用的重載可以將兩者區分開來@vczh


引用"靈劍"的回答:

只說標題的話,有。a == b匹配到的是a.(operator ==)(b),或者operator ==(a,b);b == a則反過來匹配b.(operator ==)(a),或者operator ==(b,a)。原理上可以把兩者實現成不一樣的,導致兩個方向的結果可能不一樣,但一般人都不會這麼干,大部分人應該會只實現一個方向,在另一個方向上調用這個方向吧。
如果不考慮運算符重載的問題,那麼把常量放在左邊、變數放右邊主要是為了防止手殘把==寫成=,但其實我個人不覺得這種傻X錯誤值得用一個更傻X的方法來解決……

"靈劍"的回答已經把代碼的意思以及為什麼要這樣寫的含義寫清楚了.

但是"靈劍"的話,我只同意最後一句之前的內容.

把常量寫在==等號前面,有很大的作用,作用不是在效率方面,而是在防錯方面.

人的思維只能管理大概8000左右的代碼.在巨量的工程量代碼時候,比如,工程代碼超過100W行時,寫代碼的時候,出現一個錯誤,要找出來的工作量是很大的,尤其是將==寫成=這種錯誤,因為這種錯誤,往往處於代碼編寫者的思維盲區,很難發現,雖然可以通過讓別人進行code review,進行思維盲區的交能夠比較容易發現,但還是很大工作量.

而將常量寫在==前面,可以避免因為粗心,或者疲勞時(這種很經常,程序員疲勞時常態),少寫一個=號,而導致本來是比較,因為少寫一個=而變成賦值的行為.

至少在我的經歷中,將常量寫在==號前面,是一種良好的習慣,已經幫我避免了不下於20次的錯誤生成,我個人也曾經因為少寫一個=,被折磨得欲仙欲死.

一個良好的寫法可以幫助減少一些錯誤,多個良好的寫法可以避免更多的錯誤,為什麼不呢?


剛入門OIer,看到這個問題就進來小小的思考一下。

在我剛入門C++的時候,a==b這個判定我們老師是在講循環體的判斷時提到的,當時我們老師問了我們這樣一個問題:a等於b嗎?

那麼同理,b==a是在判定「b是否等於a」。

所以,無論是兩個常量a、b,還是一個常量一個變數a、b,甚至是兩個變數a、b,a==b或者b==a的意義都是判定a和b中儲存的值是否相等。

如當前最高票的答案說的一樣,如果開優化編譯結果一個快一個慢,就把編譯器作者抓出來打。


感覺寫代碼還是少糾結這些問題吧,多去琢磨琢磨設計模式,數據結構這些東西不更好?


我知道有個小區別,例如:若a是個常量,那麼這兩種寫法中,前一種寫法可以防止你敲代碼時出現手誤少個=號的尷尬問題。。。


防止在寫a==5的時候寫成a=5的最簡單的方法。

目標:比較a和5是否相等

如果不小心漏了一個等號寫成

if a=5

那麼執行結果就是先把5賦值給a,然後去判斷。但判斷結果永遠是true。在c語言中不違法,但是顯然不是你想要的結果。

如果代碼養成5==a的書寫方式,錯了就變成 if 5=a,編譯直接報錯。


你就不能objdump看一下嗎?


推薦閱讀:

想轉計算機,我還有希望么?
寫編譯器的作用?
為什麼這麼多人喜歡寫編譯器?
為什麼那麼多前端大佬搞培訓開live?
如果想要拿到regional金,該如何制定一年計劃?

TAG:C | 編程學習 |