这次不只是C语言很麻拐,是所有编程语言都很麻拐了。

赋值和比较是编程语言最基本的操作之二,C和所有类C语言都使用“=”和“==”来分别表示赋值和比较。

数学上等号“=”是个单一的概念,含义是“相等”,左右两边是等价的,很像编程语言的比较。但数学上写“x=…..”的时候,当然还是两边是等价的,但很有一些“赋值”的意思。所以,这个“=”直觉上既可以是比较又可以是赋值,但是编程语言不能这么混乱,必须区分开啊,于是就用“==”来表示比较,“=”只用作赋值。

这想法本来是不错的,区分开了嘛,应该就没有麻烦了。

问题是,人脑子里面的习惯不会轻易改变,于是“==”误敲成“=”就成了BUG之源。每个初学者都一定犯过很多次少打一个等号的错误(反过来的情形也有)。

历史已经如此,想改变现状恐怕不可能了。除了在if条件里把常量写在“==”的左边,也没什么别的好办法。

撇开C语言和类C语言的现实,有没有别的语言更好地解决了这个问题?

有啊,见过“:=”算符吗?一些编程语言、脚本、伪指令用这个算符表达“赋值”,这样就完全避开了脑子里的固有习惯,当然缺点是要多敲很多字符,因为赋值太常用了。

还有别的思路吗?我有一个啊:为什么允许在条件判断里赋值呢?如果最初的编译器加上这条规则,不是什么麻烦都没有了吗?

条件判断里赋值是个非常不合逻辑的事情,出于性能考虑,当然可以这么做,但是这会妨碍理解啊。赋值顺手做条件判断是硬件支持的,CPU指令里包括运算结果为零或非零就跳转的指令,非常常用,靠近硬件是C语言的优势,也是劣势——汇编语言本来就是违反直觉的。

现在最先进的编译器已经能对这种条件里面赋值的情况做出警告了吧?

(这里是结束)