@程墨Morgan 果然是老江湖
有一些教材推薦使用 if( 8 == x)
原因是經常會有把 == 打錯,少一個“=” 變為賦值,
而在表示式中進行賦值是C語言完全合法的操作,
更是一些老江湖們喜歡乾的騷事兒,比如
if( x = ( a > b ) ){ return x; }
所以,當你僅僅就是要使用 “==” 的時候把常量寫在前面可以逼迫編譯器在你真寫錯時給你報錯。
我一直都知道這麼一個梗,但是想想,我都記得要把常量寫前面了,我還會寫錯麼?一般不會!
但少寫個“=”的情況還是時有發生,只不過自己debug過硬,發現到是分分鐘的事情。
另外,其實if(x==y)和if(y==x)還真的有理論區別,
因為執行過程是有方向的,也就是說表示式中的一部分會先被計算。
編譯原理學得溜的同學會記得
不同的語言甚至有不同的執行方向,(對!有的右邊的反而先執行)
也就是說上面表示式中的x先被求值還是y先被求值
是與哪個在左,哪個在右有關係的。
設想x和y都是函式,而且在其中都動過一些全域性變數,
從理論上講,存在前寫後出來的結果不一樣的可能!
(原回答中以下部分是有錯誤的)
如果咱們再較真一下,不說x == y ,
就說 8 == x 和 x == 8 在C語言中是否存在執行結果不同的可能?
存在!!!!!!
理論上同樣是存在的!!
因為C語言還有一個很霸道的東西,叫宏定義!
可以強行替換掉一切你想替換的東西,甚至8可以被你替換成9!
以上這一部分,疏忽了在宏定義中定義識別符號不能是 8 這樣的純數字,所以結論並不成立。
特別在此感謝知友高手 @暮無井見鈴 的善意提醒和幫助!
再複雜點,C++還有運算子定義。
什麼意思呢?你可以對不同的物件,(比如x對應的物件)
重新定義運算子的動作,比如
當x是一個代表中國迷信者的物件 (笑)
那8可以認為是好運氣的象徵
你可以定義這個物件遇到8的結果就是字串 “lucky”
即 x + 8 == "lucky"
你當然也可以定義當 8 遇到這個物件的時候感覺他不夠“虔誠”,然後返回“B4”
即 8 + x == "B4"
所以問題提得妙就在這裡了,說明了是”C++中“!!!
C++之所以特別複雜,
甚至其發明者說不指望絕大多數C++開發者能完全理解C++的特性。
就是因為它也真是太龐雜太靈活,以至於太多可能性了...
大家看看就行了,少碰C++,坑太深
@程墨Morgan 果然是老江湖
有一些教材推薦使用 if( 8 == x)
原因是經常會有把 == 打錯,少一個“=” 變為賦值,
而在表示式中進行賦值是C語言完全合法的操作,
更是一些老江湖們喜歡乾的騷事兒,比如
if( x = ( a > b ) ){ return x; }
所以,當你僅僅就是要使用 “==” 的時候把常量寫在前面可以逼迫編譯器在你真寫錯時給你報錯。
我一直都知道這麼一個梗,但是想想,我都記得要把常量寫前面了,我還會寫錯麼?一般不會!
但少寫個“=”的情況還是時有發生,只不過自己debug過硬,發現到是分分鐘的事情。
另外,其實if(x==y)和if(y==x)還真的有理論區別,
因為執行過程是有方向的,也就是說表示式中的一部分會先被計算。
編譯原理學得溜的同學會記得
不同的語言甚至有不同的執行方向,(對!有的右邊的反而先執行)
也就是說上面表示式中的x先被求值還是y先被求值
是與哪個在左,哪個在右有關係的。
設想x和y都是函式,而且在其中都動過一些全域性變數,
從理論上講,存在前寫後出來的結果不一樣的可能!
(原回答中以下部分是有錯誤的)
如果咱們再較真一下,不說x == y ,
就說 8 == x 和 x == 8 在C語言中是否存在執行結果不同的可能?
存在!!!!!!
理論上同樣是存在的!!
因為C語言還有一個很霸道的東西,叫宏定義!
可以強行替換掉一切你想替換的東西,甚至8可以被你替換成9!
以上這一部分,疏忽了在宏定義中定義識別符號不能是 8 這樣的純數字,所以結論並不成立。
特別在此感謝知友高手 @暮無井見鈴 的善意提醒和幫助!
再複雜點,C++還有運算子定義。
什麼意思呢?你可以對不同的物件,(比如x對應的物件)
重新定義運算子的動作,比如
當x是一個代表中國迷信者的物件 (笑)
那8可以認為是好運氣的象徵
你可以定義這個物件遇到8的結果就是字串 “lucky”
即 x + 8 == "lucky"
你當然也可以定義當 8 遇到這個物件的時候感覺他不夠“虔誠”,然後返回“B4”
即 8 + x == "B4"
所以問題提得妙就在這裡了,說明了是”C++中“!!!
C++之所以特別複雜,
甚至其發明者說不指望絕大多數C++開發者能完全理解C++的特性。
就是因為它也真是太龐雜太靈活,以至於太多可能性了...
大家看看就行了,少碰C++,坑太深