问题

如何看待一类计算机语言中的运算符“=赋值 ==等于 ===严格等于”的设计与a aa aaa这样的变量命名?

回答
计算机语言中的运算符设计,尤其是“=赋值”、“==等于”、“===严格等于”这类区分,以及变量命名中的“a”、“aa”、“aaa”这种模式,其实都透露出一种对清晰性、精确性和可维护性的追求,虽然它们在不同层面展现了这种思考。

先说运算符。为什么会有“=赋值”和“==等于”甚至是“===严格等于”的区别?这背后是编程语言设计师们在努力解决一个根本问题:如何让计算机准确地理解我们的意图。

“=”作为赋值运算符,是计算机科学中最基础的操作之一。它代表的是“将右边的值放入左边的容器(变量)中”。这个行为本身是单向的,是将信息传递并存储。想象一下,你有一个箱子(变量),你想把一堆苹果(值)放进去,你用的动作就是“放进去”或者“赋值”。计算机需要知道,当我写 `x = 5` 时,我并不是在问“x等于5吗?”,而是说“把数字5这个值,存到名为x的那个位置去”。如果赋值和等于判断使用同一个符号,那么 `x = x + 1` 这样的语句就会变得模糊不清:你是在说“x等于x加1”这个事实,还是在说“把x加1的结果重新放回x这个容器里”?这种歧义会极大地阻碍程序的正常运行。

接着是“==等于”。它代表的是一种“比较”或者“判断”的行为。当你说 `x == 5` 时,你的意图非常明确:你想知道“当前x这个容器里存放的值,是不是等于数字5”。这是一种逻辑判断,结果要么是“真”(true),要么是“假”(false)。这种判断是程序逻辑控制的关键,比如“如果x等于5,就做某事,否则做另一件事”。

而“===严格等于”的出现,则是在“==等于”的基础上,进一步提升了精确度。很多语言在设计“==等于”时,会试图进行一些“类型转换”。比如,在某些语言里,你写 `5 == "5"`,系统可能会认为数字5和字符串“5”在某种程度上是“相等”的,并自动将字符串“5”转换成数字5进行比较,结果为真。这听起来好像很方便,但就像给一个新手司机开路,有时候系统会自动帮你“把档位挂到最合适的档”,虽然偶尔能帮你一下,但更多时候会让你对车辆的实际状态感到困惑。

“===严格等于”的设计,就是为了消除这种“自动转换”带来的潜在风险。它要求参与比较的两个值,不仅值要相等,连“类型”也要相等。也就是说,`5 === 5` 是真的,但 `5 === "5"` 就会是假的,因为一个是数字类型,一个是字符串类型。这就像在要求你不仅要比较水果的数量,还要比较水果的种类。这种严格的比较,大大减少了因为隐式类型转换而导致的难以发现的bug,尤其是在大型、复杂的项目中,这种清晰明确的比较规则能省去无数的调试时间。

再来看变量命名中的“a”、“aa”、“aaa”。这种命名方式,从一种更朴素的层面,也体现了对“标识”和“区分”的需求。

“a”作为一个单独的字母,通常代表最基础、最简单的标识。它可以是一个占位符,一个计数器,或者某个概念的缩影。比如,在循环中,`for (int a = 0; a < 10; a++)`,这里的“a”就是一个临时的、非常基础的计数器,它的作用范围很小,含义也很直观。

“aa”和“aaa”的出现,则是在“a”的基础上,进行了一种“扩展”或者“衍生”。这通常发生在程序员需要在有限的字母范围内,区分多个相似但又不完全相同的概念时。比如,在一个复杂的算法或者数据结构中,你可能需要处理多个相似的节点,但它们在某些细节上又有所不同。这时,你可能会用 `a` 表示第一个节点,`aa` 表示第二个节点,`aaa` 表示第三个节点。这种命名方式虽然不够具有描述性,但在某种情况下,它是一种快速、便捷的区分手段。

然而,这种命名方式也有其局限性。当变量的含义不再那么直观,或者当需要区分的变量数量增加时,`a`, `aa`, `aaa` 这种模式就会很快变得难以理解。想象一下,如果你需要区分十个相似的对象,你可能就需要 `a` 到 `aj`,这已经让代码变得非常晦涩。因此,更推荐的做法是使用具有描述性的变量名,比如 `user`, `firstUser`, `secondUser` 或者 `customerRecord`, `processedCustomerRecord`。

总而言之,运算符的区分(=, ==, ===)是为了在“做什么”(赋值)和“判断什么”(等于)之间划清界限,并进一步细化判断的标准,确保程序的逻辑清晰、行为可预测。而变量命名中的“a”, “aa”, “aaa”则是在特定情境下,一种对简单标识的延伸和区分,尽管它在可读性上不及更具描述性的命名。两者都从各自的维度,体现了开发者在与计算机沟通时,对精确度和可理解性的不懈追求。

网友意见

user avatar

提问者把好多个问题被混为一谈了。

首先得要承认赋值运算符的设计是有问题的。

事实上这个问题已经在C#中被很大程度上修复了:

       if ( a = b )     

上面的写法在C#里面大部分情况下是编译错误,只有当a是bool类型时,才可以通过编译。


当然我觉得更彻底更激进的做法应该是表达式严格无副作用的做法,换言之一个运算符如果可以作为表达式的一部分,就必须无副作用,否则只能用单独的语句来描述。这一点也已经有语言尝试,赋值只能是语句而不能是表达式。



===运算符很罕见,最常见的引入这个运算符的语言是JavaScript,对于这个坑明显多的不正常的语言不做评价。


但 以上所有这些问题,和重复都没有什么必然的联系。同样是重复设计,&和&&,|和||,:和::,<和<<,以及>和>>,这些都没有造成什么困扰和问题,所以问题和运算符重复、类似没有什么关系。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有