標籤:

C++中if(x==8)和if(8==x)有什麼區別?

各位大佬這兩個表達式有什麼差嗎TAT

大一的練習題

-----------------------------------------------------------------

有的編譯器也不允許寫if(x=8)這樣的代碼啊

-----------------------------------------------------------------

謝謝大家的解答!


倒著的寫法是歷史造就的,當年是為了「防止手賤把 == 寫成 =」而被人發明出來的。

---

這兩種寫法本意是沒有區別的,但如果你不小心把 == 寫成 =:

  • if (x == 8) 括弧里就會從判斷變成賦值 if (x = 8),不幸表達式「x = 8」的值為 8,也就是 true
  • if (8 == x) 括弧里就會從判斷變成賦值 if (8 = x),你沒法給 8 賦值,所以編譯器會報錯

---

不過現在都 2017 年了,很久以前,市面上主流編譯器就都支持對直接在 if 括弧里寫賦值的情況報警告了。

與其依賴這種把代碼搞得不通順的奇怪寫法,不如通過設置合理的編譯器警告等級來避免手賤。


x==8 是正常人的說話方式。

8==x 是Yoda大師。

Yoda conditions - Wikipedia


貝殼進了沙子,十分痛苦。貝殼為了緩解痛苦,把沙子用一層一層的分泌物包起來。本來是無可奈何的權宜之計,看到的人卻當成是寶貝。

如果C的類型不要那麼弱,或者不要把表達式和語句強行搞混(有人說這樣更靈活,我倒想問問,有經驗的程序員會專門利用這種「靈活性」嗎?公司的規範允許你濫用C的各種奇技淫巧嗎?),根本就不會有這樣的問題。Java裡面有這個問題嗎?Python裡面有這個問題嗎?

在我看來,很明顯前一個寫法更好,因為後一種寫法會擾亂思維,沒有人天天學Yoda說話。

把編譯器的警告打開,最好把這種情況直接當錯誤處理。如果真的需要這個邏輯,明確寫出來。

我希望我們早點把過去的錯誤改正,而不是一代又一代地傳承下去。


Question 17.4

問:為什麼有人寫 if (0 == x) 而不是 if (x == 0)

答:這是為了避免犯這個錯誤的一個小把戲:

if(x = 0)

如果你習慣了把常量寫在前面的話,你要是不小心少打了一個等號:

if(0 = x)

編譯器就會報錯。很明顯,有些人記得反過來寫比較語句,要比記得輸入兩個等號要容易些。不過確實,最有經驗的 C 程序員也會犯不小心少打一個等號這樣的錯誤。

另一方面,有些人認為,這麼寫很難看,他們認為編譯器遇到 if(x = 0) 這樣的語句應當報警告。事實上,很多編譯器確實會對在條件語句中賦值報警告,如果你確實是要這麼作的話,可以通過多寫一層括弧來避免警告: if((x = 0))


既然兩種都是需要你自己記住的 practice,最終在記憶量和犯錯概率並沒有大的區別,不如就用更符合直覺的表達。


update:感謝評論區的提醒,8=x這種情況更準確地說是會發生編譯報錯,而不僅僅是看著彆扭。

這種是為了防止寫成x=8的情況

如果寫成x==8,則容易發生上面所說的情況

反之,寫成8==x就不容易,畢竟8=x看起來比較彆扭,容易發現問題。

不過當你積累了一定代碼量以後,這種錯誤會很少發生,那麼兩種寫法就沒差了。


就像其他回答說的,把常量寫前面的方式並不好。最好還是把所有warning打開。


8==x是為了防止8=x這樣的手誤,但是現在編譯器通常會對類似於if (x = 8)這樣的語句報警。。。

都2017年了,編譯還不加-Werror么?


你說說你們這些人啊,竟說什麼大實話,我剛意識到常量寫在前面有這好處,你們卻又跟我灌輸這些,,,


職業習慣而已,為了防止少打一個=

類似的習慣有很多,以sql舉例

SELECT id
,name
,gender

為什麼要反人類地把逗號寫在前面?防呆設計!


建議使用「x==8」寫法,非要反過來的話一定記得加空格

不然你們感受一下變數是「D」的話是什麼畫風…


不要使用有尤達表達式。

尤達表達式是指,拿一個常量去和變數比較而不是拿變數去和常量比較。它就像是在表達 「藍色是不是天空的顏色」 或者 「高個是不是這個男人的屬性」 而不是 「天空是不是藍的」 或者 「這個男人是不是高個子的」


if(8==i)這種寫法是一幫懶得全開告警,也懶得認真消除全部告警的懶人搞出的懶辦法。

代碼首先是給人看的,其次才是機器上跑的。


When nine thousand lines of code you reach, look as good you will not.


一般是分不清=和==的初學者在看了15年前的劣質博文寫出的


if( 8 == x) 說看不懂的要麼就是沒學過C/CPP,要麼就是人云亦云的智障。

還有某個說遇到這麼寫的果斷離職的,你要是說到做到,恭喜你,你已經脫離C/CPP的苦海了。


碰到要求寫8==x的公司,果斷離職


每本書都會跟你說,應該寫成8==x,但是咱們最後還是寫成x==8


常量寫左邊是編碼基本的習慣,尤其是涉及到函數調用時,比如str.equals(「111」)和「111」.equals(str)的區別。依賴好習慣不要依賴編譯器,鬼知道你以後會用上啥語言和編譯器。另外,看到==還說反人類的,只能說代碼寫少了。相等比較的左右互換完全不影響閱讀好么……


嘖嘖嘖。

一個等號都能裝逼裝成這樣。

還配不配當程序猿這種話出來了。

戾氣這麼重。

服氣。

各位大佬既然逼格這麼高。

還上知乎?

不是成功人士不上知乎嗎?

。。。。。。。。。。。。。。。。。。。。

防止你寫成一個等號。

這樣整個式子變成賦值表達式。

而且根據所賦值。

永真永假。

而倒著寫。

如果寫一個等號編譯會出錯。

當年老師說了不信。。最後用一個下午改bug時間信了。。。


推薦閱讀:

有什麼像a=a+b;b=a-b;a=a-b;這樣的演算法或者知識?
程序中的變數名總是起的很長怎麼辦?英文單詞的縮寫有規律么?
如果重新設計C#你最希望增加什麼特性,去掉什麼特性,改變什麼語法?
Unity3d&Cocos2dx進階書籍推薦?
new和malloc內部的實現方式有什麼區別?

TAG:編程 | C |