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為什麼會異常?某 k2014/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就知道這樣的好處了,怎麼會有問題,
建議退群
- 學習編程請勿使用QQ、百度。
- 這種問題待你學習完《編譯原理》,就會感嘆:我X,某k這說得這什麼XX東西?不是他自己不明白,就是他沒表達明白。兩種情況的結論是一樣的:這人是不適合做自己老師的。
- 格式本身沒有問題,目的是防止程序員自己誤寫c==2為c=2(此時編譯是可以通過的),目前編譯器都可以針對這種誤寫提出警告的。Java更是直接報錯。
- 這一方法從代碼可讀性上來說是不合適的,但是任何事情都要分情況,具體是否使用這一方法要根據自己的開發團隊的代碼規範。
- Yoda 表示法錯在哪裡 這裡有對這一表示方法的批評,不過請注意批判性的吸收。
胡說八道,荒謬透頂。
寫成2 == c,是為了防止出現 if (c = 2)這樣的錯誤,這種錯誤太隱蔽了,所以2==c作為一個約定俗成的慣例。
至於可讀性,2 == c 沒有任何可讀性問題。如果覺得這個有可讀性問題,智商不足以做開發工作,滾粗走人吧。
推薦閱讀:
※c語言可以釋放數組中的單個元素結構么?
※怎麼用c語言實現分形圖形?
※如何通俗地解釋 C 語言中 #include<> 的用途?
※C語言 主函數退出前,還佔用了大量的內存,是什麼原因造成的呢?