文 / 李博(光宇廣貞)
在 c++ 中有很多帶有歧義的算符,比如《c++ 0x 之左值與右值》中提到的「&」,再比如常用的「=」等。
這個「&」就很神通廣大,不僅可以「取址」,還可以「取左值引用」;用在位運算中,表示「並且」。c++ 標準委員會當初在制定算符時,讓 & 兼備「取址」和「取引用」的功能,是否考慮的是二者在含義上有相近之處?嗯……編譯器在操作的時候的確對待二者差不多。
那麼對待「=」算符也是出於相似的考慮啦?初始化可以用它,賦值也可以用它。但對於大多數初學者來說,這個「=」總會帶來不少疑惑,甚至是誤解。比如說:
int i;對於 i 變數的操作,初學者可能會認為第二句 i = 250 才是對 i 的定義,第一句 int i 只不過是對 i 變數的宣告;而對於 j 變數的操作,則是宣告同定義。我初學時也有過這樣的誤解。造成這樣的誤解完全是「=」算符的過失。變數是宣告同定義的,無論對 i 還是對 j。i = 250;
int j = 250;
二者的差別不在宣告同定義處,而在對等號算符的理解上。第二個用在 j 上的「=」含義是初始化,而第乙個用在 i 上的「=」含義則是簡單的賦值(賦值過程不一定簡單,只是語義上簡單)。
初始化不也有賦值操作麼?不對,二者語義上差別大著呢。舉例來說,如下圖:
第 29 行,使用等號呼叫的是 18 行的過載建構函式;而第 30 行,使用等號呼叫的是 19 行的過載等號算符函式。可見編譯器根據語義對兩個等號做了區分。
c++ 的等號算符使用上帶來的歧義,或者說,是主流 ip 語言的等號算符使用上帶來的歧義,受到 fp 語言的嘲笑,以 fp 語言的新生成員 f# 為例,如下:
let mutable hikaliv = 56初始化使用=算符,而賦值使用算符。這樣區別在數學上是可以理解的。本來麼,賦值就是用新值替代舊值,而等號就是用來判等的。初始化使用等號表示左右兩值相等;而賦值的時候,如何讓舊值總去等於新值呢?這在數學上是解釋不通的,這也是為何 fp 嘲笑 ip 對等號算符的「歧義誤用」。hikaliv
printf 「%d」hikaliv
所屬分類:c++
、f#.net參考:大話西遊:孫悟空的政治覺悟性、孫悟空與觀音隱藏的愛情,兼談《西遊記》社會現實意義鷸和蚌的關係:馬謖是劉備為諸葛亮故意下的套dllmain詳解
關於記憶體對齊
甲始終領先乙的概率
大數階乘
方法多型與duck typing;c#之拙劣與f#之優雅
函式式程式設計魅力:continuation-passing style,說為何 c#、c++ 引入 lambda 意義重大及 c++ 和 c# 的缺憾
c++ 0x 之 lambda:賢妻與嬌娃,你娶誰當老婆?聽 fp 如何點化 c++
C語言的歧義
前兩天,neo寫了一篇 語言的歧義 其使用c語言討論了一些語言的歧義。大家應該也順便了解了一下c語言中的很多不可思異的東西,可能也是你從未注意到的東西。是的,c語言並不簡單,讓我們來看看下面這些示例 為什麼下面的 會返回0?這題應該很簡單吧 int x return x 1 x 本題主要是關於c c...
C 的算符過載
matrix const matrix m 拷貝建構函式 matrix operator const matrix m 賦值算符 private unsigned rows cols double data inline matrix matrix unsigned rows,unsigned co...
算符在球座標系 球座標系中的角動量算符
預備知識 角動量 量子 本文使用原子單位制 在量子力學中,我們一般把角動量算符放在球座標中表示 把軌道角動量算符在直角座標系中的定義 式 2 通過鏈式法則用球座標表示 留作習題 begin l x mathrm left sin phi frac cot theta cos phi frac rig...