提问者把好多个问题被混为一谈了。
首先得要承认赋值运算符的设计是有问题的。
事实上这个问题已经在C#中被很大程度上修复了:
if ( a = b )
上面的写法在C#里面大部分情况下是编译错误,只有当a是bool类型时,才可以通过编译。
当然我觉得更彻底更激进的做法应该是表达式严格无副作用的做法,换言之一个运算符如果可以作为表达式的一部分,就必须无副作用,否则只能用单独的语句来描述。这一点也已经有语言尝试,赋值只能是语句而不能是表达式。
===运算符很罕见,最常见的引入这个运算符的语言是JavaScript,对于这个坑明显多的不正常的语言不做评价。
但 以上所有这些问题,和重复都没有什么必然的联系。同样是重复设计,&和&&,|和||,:和::,<和<<,以及>和>>,这些都没有造成什么困扰和问题,所以问题和运算符重复、类似没有什么关系。