java计算器加减乘除_JAVA、PHP和C语言,“过度设计”了小学生学的“先乘除”

微软最近释放出了计算器的源代码,这引起了不少人对计算器、这个看似简单程序的兴趣,而我们今天要聊一聊的,也是有关加减乘除的事。

在我看来,绝大多数的计算机语言,都存在“过度设计”的问题,也就是说,原本不该由语言编译器操心的事,它们却费心费力的帮我们操心,替我们做主,而且还做的名正言顺、理所应当似的。

下面就有请今天的三位被告登场,它们分别是:JAVA、PHP和C语言。当然、它们只是被告团代表,这个世界上的数千种计算机语言中相当大部分都存在着相似的问题。

9c77ef06621e096cebf43d054ee94237.png

首先让我们用三种语言分写出相同逻辑的代码:

dd5b2d5263a23c34ab3af3e64fb08fe3.png

下面是三段代码

c8c5d1714ea844d35d5c0b1fa6c71334.png

三段代码通俗易懂,运行结果显而易见。但是先等一等,为什么这个结果是7呢?你也许会说当然是7了,不然还能是几?但我觉得这个结果应该是9,而不应该是7,原因很简单,1+2的结果是3,而3*3的结果是9。你肯定开始笑话我了,学过算数的人都知道乘号的优先级比加号的优先级要高,所以上边的1+2*3的运算应该先计算2*3,在进行加法运算1+6这样得到7。

但是请注意你说的得到结果7的前提,是因为你知道优先级的概念,而你之所以知道是因为你学习过算数,但是计算机并没有上过小学,更没有学过算数,它凭什么要知道优先级的概念呢!他又如何知道乘号要高于加号呢!这便是我所说的“过度设计”。

计算机语言的发明者对语言进行了过度设计,在其中隐含了对数学运算符号优先级的定义。之所以这样做,目的是让计算机的运行结果符合我们的经验预期,符合我们的“潜规则”结果。

然而,我们的这套运算符优先级又是如何诞生、为何要存在的呢?仔细想想你会意识到,这套优先级规则只会额外浪费大脑记忆空间,并没有什么显著好处。

计算机虽然与数学关系紧密,但它应该具有自己的个性,在我看来一个优秀的计算机语言在设计之初就摒弃掉运算符号优先级的概念将所有符号优先级拉平,也就是说当你在研读某篇论文看到1+2*3这样的公式的时候,如果想将公式转换成计算机语言,也要通过小括号补全“优先级”,如果你不写小括号,那么这门计算机语言将不对符号优先级进行处理,而是依据从左往右的顺序进行运算,这样的好处大概是可以让语言的设计者在写分析器的时候少做不少工作,同时也在强迫程序员明确定义运算顺序。这个运算顺序不应该让语法分析器代劳,而是要由程序员明确指出。

好在这样的计算机语言是存在的,例如Scheme就是这样的语言。

dd89dd1a8aead3a154cd4b13b8406352.png

如果用Scheme来写,大概要写成这样(+1(*23))不要关心加号和乘号位置的错误,其实这并不是错误,它其实是叫做“前缀表达式”、也被称为“波兰式”就是将运算符号放在运算项的前面,如果我们用熟悉的“中缀表达式”来写,它的形式就是我们熟悉的样子,只不过对于Scheme语言而言它只接受前缀表达式。我们更要注意的是它兴奋的括号,你会发现Scheme语言中的括号是不能省略的。如果没有括号,它首先是报错,但假设没有括号对于Scheme是允许的,那么它很有可能从左往右进行计算,而不去考虑符号的优先级。当然这只是一个假设这样的语言是前面我们提到的“很有自我个性的计算机语言”,它要用“波兰式”来写表达式,它不接受你把括号省略这种懒散的形式。如此一个放纵自己、严苛程序员的语言,难道不正是我们梦寐以求的么?

7e17d4242197863efe602b8355a26d3a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值