在一次工作中身邊的一位資深的同事突然問了個a=a+b與a+=b有什么區別 此時有點尷尬了 不知道是真的不知道咧還是別有用意....今天抽點時間針對此問題做個小總結
一、性能方面
a=a+b是加法運算 需要兩次尋找地址而a+=b是增量運算有寄存器優先時 只有一次地址查找。效率方面后者略高於前者 基於現在計算機的發展可忽略不計。
二、可讀性方面
兩者都是賦值運算,一般情況下可以認為兩者沒有什么區別 但前者與數學算法描述更接近相對來說更嚴謹而后者書寫更快捷但可讀性下降。
三、數據類型方面
兩者寫法上主要在於是否能進行數據類型自動轉換,事實上就是類型與精度上的差異。eg:當兩個操作數 數據類型一致時兩種形式的運算結果沒有差別 但數據類型不同時 且a值的數據類型精度低時 此時兩種形式就有區別了。
定義a是short類型變量 執行a+=b[b為int類型的20值]時 輸出結果為30 自動將int為20的類型轉換int。
代碼稍微調整一下
調整為a=a+b結構時 編譯無法通過 類型不匹配。而在javascript中確不存在此問題 弱類型語言真強大啊……
為什么在C#中會有此問題產生呢?
原因:在"+="這個運算符在C#中是一個運算符 程序在執行“+=”時 會自動向高精度類型轉換 即a+=20 編譯通過;而“=”要求兩過類型一致 a=a+b結構中 a是short類型變量 而b為int類型常量 此時(short類型+int類型)出現類型不匹配問題 估編譯失敗。
注:b為變量且明確申名了變量數據類型時 則a+=b與a=a+b 都存在類型轉換問題 需強制進行類型轉換
若強行用short類型去接收int類型的數據 可以進行強類型轉換 但最終導致結果是精度丟失。