FP 指点 C++ 的歧义算符

文 / 李博(光宇广贞)

       在 C++ 中有很多带有歧义的算符,比如《C++ 0x 之左值与右值》中提到的“&”,再比如常用的“=”等。

       这个“&”就很神通广大,不仅可以“取址”,还可以“取左值引用”;用在位运算中,表示“并且”。C++ 标准委员会当初在制定算符时,让 & 兼备“取址”和“取引用”的功能,是否考虑的是二者在含义上有相近之处?嗯……编译器在操作的时候的确对待二者差不多。

       那么对待“=”算符也是出于相似的考虑啦?初始化可以用它,赋值也可以用它。但对于大多数初学者来说,这个“=”总会带来不少疑惑,甚至是误解。比如说:

       int i;
       i = 250;

       int j = 250;

       对于 i 变量的操作,初学者可能会认为第二句 i = 250 才是对 i 的定义,第一句 int i 只不过是对 i 变量的声明;而对于 j 变量的操作,则是声明同定义。我初学时也有过这样的误解。造成这样的误解完全是“=”算符的过失。变量是声明同定义的,无论对 i 还是对 j。

       二者的差别不在声明同定义处,而在对等号算符的理解上。第二个用在 j 上的“=”含义是初始化,而第一个用在 i 上的“=”含义则是简单的赋值(赋值过程不一定简单,只是语义上简单)。

       初始化不也有赋值操作么?不对,二者语义上差别大着呢。举例来说,如下图:

FP 指点 C++ 的歧义算符_第1张图片

       第 29 行,使用等号调用的是 18 行的重载构造函数;而第 30 行,使用等号调用的是 19 行的重载等号算符函数。可见编译器根据语义对两个等号做了区分。

       C++ 的等号算符使用上带来的歧义,或者说,是主流 IP 语言的等号算符使用上带来的歧义,受到 FP 语言的嘲笑,以 FP 语言的新生成员 F# 为例,如下:

       let mutable hikaliv = 56
       hikaliv <- 72
       printf “%d”hikaliv

       初始化使用 = 算符,而赋值使用 <- 算符。这样区别在数学上是可以理解的。本来么,赋值就是用新值替代旧值,而等号就是用来判等的。初始化使用等号表示左右两值相等;而赋值的时候,如何让旧值总去等于新值呢?这在数学上是解释不通的,这也是为何 FP 嘲笑 IP 对等号算符的“歧义误用”。


       所属分类:C++F#.net

       参考:

       大话西游:孙悟空的政治觉悟性、孙悟空与观音隐藏的爱情,兼谈《西游记》社会现实意义

       鹬和蚌的关系:马谡是刘备为诸葛亮故意下的套

       DllMain详解

       关于内存对齐

       甲始终领先乙的概率

       大数阶乘

       方法多态与Duck typing;C#之拙劣与F#之优雅

       函数式编程魅力:Continuation-Passing Style,说为何 C#、C++ 引入 Lambda 意义重大及 C++ 和 C# 的缺憾

       C++ 0x 之 Lambda:贤妻与娇娃,你娶谁当老婆?听 FP 如何点化 C++

你可能感兴趣的:(F#.net,C++)