2==c會導致的這樣的異常嗎?

int c;
scanf("%d", c);
if(2 == c)
......

這樣一段簡單的代碼,在某個QQ群裡面,讓我見識到這樣的說法:

某 k

else if里的 條件表達式 c==2

寫成 2==c 容易報異常

路人A提問

2014/8/4 10:18:24

為什麼會異常?

某 k

2014/8/4 10:19:58

當程序讀到else if 這行 要是先碰到 c==2 內存就先開闢空間了

某 k

2014/8/4 10:20:34

當程序讀到else if 這行 要是先碰到 2==c 先有佔位符 沒有內存空間 這不就異常了

我說的異常 是Linux 內核 的異常

以我對C的理解,這樣的說法匪夷所思啊!

但是我對Linux了解太少了 +_*

所以,來這裡請教一下各位前輩:

1.某 k提到的異常會出現嗎 ?

2.順便如果出現,這是編譯器的BUG嗎?


1. Linux/C程序員表示,經常這麼寫: if ( 0 == s ). 這完全是合法的。

2. 程序出錯,一般情況下,先反思自己的代碼;神馬操作系統/編譯器錯誤,基本不可能。

3. 感覺 某K 完全沒入門的水平。 「當程序讀到else if 這行 要是先碰到 c==2 內存就先開闢空間了」 ,如 Kenneth 所述,C是編譯再執行的,變數存儲的位置早在編譯時就已經確定(重定位也差不多),根本就不是讀到哪個變數再分配內存的。。。

還有,根據我的經驗,一般來說,QQ群裡面的都是水貨,您還是上靠譜點的論壇吧。比如stackoverflow, 國內的cu,感覺還是不錯的。


1.首先,這樣寫合法,合理,沒有錯誤,更不會觸發什麼異常,為什麼要這樣寫其他人已經答的很清楚了,這是為了防止 把if( a==0 )寫成if( a=0 ).如果不小心把==寫成=,雖然有些編譯器會有提示警告,但是並不永遠奏效,寫成0==a純屬習慣問題,我不認為 0==a 就不是給人看的代碼.

2."有時候會報異常","就先開闢內存了"......C++要這麼學就等著死吧. 最討厭這種模菱兩可的.自己學的迷迷糊糊不要緊,就別舔個臉教別人了.你就先問他什麼時候會報異常? 為什麼報異常? 報什麼異常? 為什麼開闢內存? 開闢什麼內存? 開闢多大內存? 誰開闢? 誰釋放? 開闢的內存存什麼東西? 簡直搞笑!

3.你不退群還等什麼呢?


這不是很常見的避免判斷寫成賦值的技巧么……


純扯淡。還「程序讀到xxx行」,他家c是解釋執行的?

if (常量 == 變數) 這種寫法其實是很好的習慣,避免錯寫賦值(特別對喜歡忽視warning的瞎子們)。

ps:還有個關係不大的,也是好習慣:if和else還有for之類,後面即使是只有一條語句,也用{}括起來。這樣有兩個好處:1.避免以後添加邏輯的時候忘記括弧;2.以免有些粗製濫造的宏語句其實會被擴展為兩條或者更多語句。

關於反人類:個人是不覺得2 == c有什麼反人類的地方,如果有人覺得反人類是因為一般人通常不這麼說,那麼lisp之類真要哭死了。


純粹從錯誤的角度,單從你給的代碼看不出會發生異常的可能。

但是,即便不會發生異常,也不建議使用 2==c 這樣的寫法。這種寫法會影響語義上的連貫性,每次讀到這種代碼就如同一個骨刺卡在了喉嚨中一樣難受。

-Wall -Werror 可以強制讓類似的問題成為錯誤,使得程序員無法忽略這種錯誤,那麼用 c==2 就夠了。

對於編程規範的一個基本考慮是:「程序首先是給人讀的,其次才是給機器讀的」。不應當為了照顧有缺陷的蠻荒時代的編譯器而使用「絕對影響可讀性」的編碼規則。if (c=2) 這種錯誤在靠譜的編譯器中都可以檢查出來,為了適應那些連這種錯誤都無法檢查出來的編譯器,而將代碼寫成 2==c,完全是本末倒置的,畢竟程序首先是給人讀,其次才是給機器讀,2==c 這種寫法屬於是為了讓某些機器讀出其中的錯誤,而犧牲了對人類的可讀性,在現在普遍對編程的建議而言屬於強烈反對的做法。

總的來說,使用 2==c 弊大於利,不建議。


當你寫成c=2就知道這樣的好處了,怎麼會有問題,


建議退群


  1. 學習編程請勿使用QQ、百度。
  2. 這種問題待你學習完《編譯原理》,就會感嘆:我X,某k這說得這什麼XX東西?不是他自己不明白,就是他沒表達明白。兩種情況的結論是一樣的:這人是不適合做自己老師的。
  3. 格式本身沒有問題,目的是防止程序員自己誤寫c==2為c=2(此時編譯是可以通過的),目前編譯器都可以針對這種誤寫提出警告的。Java更是直接報錯。
  4. 這一方法從代碼可讀性上來說是不合適的,但是任何事情都要分情況,具體是否使用這一方法要根據自己的開發團隊的代碼規範。
  5. Yoda 表示法錯在哪裡 這裡有對這一表示方法的批評,不過請注意批判性的吸收。


胡說八道,荒謬透頂。

寫成2 == c,是為了防止出現 if (c = 2)這樣的錯誤,這種錯誤太隱蔽了,所以2==c作為一個約定俗成的慣例。

至於可讀性,2 == c 沒有任何可讀性問題。如果覺得這個有可讀性問題,智商不足以做開發工作,滾粗走人吧。


推薦閱讀:

c語言可以釋放數組中的單個元素結構么?
怎麼用c語言實現分形圖形?
如何通俗地解釋 C 語言中 #include<> 的用途?
C語言 主函數退出前,還佔用了大量的內存,是什麼原因造成的呢?

TAG:編程 | Linux | C編程語言 | CC |