回覆列表
  • 1 # 使用者1229159179808

    @程墨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++,坑太深

  • 中秋節和大豐收的關聯?
  • 無盤電腦怎麼啟動設定?