我理解在Smalltalk数值计算中,如果没有圆括号,一切都从左到右开始计算。乘法和除法的规则没有遵循加法和减法的优先顺序。
与以下代码一样
3 + 3 * 2
打印输出为12,而在数学中我们得到9
但是当我开始尝试功率计算时,比如
91 raisedTo: 3 + 1.
我认为答案应该是753572
我实际得到的是68574964
为什么?
是因为+, -, *, /
优先于权力吗?
答案 0 :(得分:6)
是的,String withSpaces = " a b c ";
String trimmed = withSpace.trim(); // "a b c"
,+
,-
,*
的优先级高于/
,有趣的方面就是这种情况发生的原因
在Smalltalk中有三种类型的消息:一元,二元和关键字。在我们的示例中,raisedTo:
,+
,-
和*
是二进制消息的示例,而/
是关键字1。您可以这样说,因为二进制消息是由不是字母或数字的字符组成的,不像一元或关键字,以字母或下划线开头,后跟数字或字母或下划线。此外,您可以判断选择器何时是一元的,因为它们不以冒号结尾。因此,raisedTo:
是关键字消息,因为它以冒号结尾(并且不是由非字母或数字符号组成)。
因此,表达式raisedTo:
包括两个选择器,一个二进制(91 raisedTo: 3 + 1
)和一个关键字(+
),优先规则说:
首先评估一元消息,然后评估二元消息,最后评估带有关键字的消息
这就是首先评估raisedTo:
的原因。当然,您始终可以使用括号更改优先级。例如:
3 + 1
将首先评估(91 raisedTo: 3) + 1
,然后评估raisedTo:
。请注意,您可以写
+
太。但通常不会这样做,因为Smalltalk优先规则很容易记住,你不需要强调它们。
常用二进制选择器
91 raisedTo: (3 + 1)
@
Point
创建消息
x @ y
大于或等于等等。
>=
->
Association
条消息
PetitParser使用的 key -> value
生产转换
==>
等于
=
相同(非常相同的对象)
==
不等于
~=
不相同
~~
余下
\\
商
还有更多。当然,您总是有权创建自己的。
答案 1 :(得分:6)
Smalltalk没有优先级的运算符。相反,有三种不同的消息。每种都有自己的优先权。
他们是:
squared
或asString
中没有3 squared
或order asString
参数; !%&*+,/<=>?@\~-
个符号组成,并且在+
或{{1}中有一个参数->
和3 + 4
}}; key -> value
和raisedTo:
中的to:by:do:
和4 risedTo: 3
一元消息优先于二进制,它们都优先于关键字消息。换句话说:
1 to: 10 by: 3 do: [ … ]
所以例如
unary > binary > keyword
由于评估了第一个一元5 raisedTo: 7 - 2 squared = 125
导致2 squared
,因此评估二元4
,结果为7 - 4
,最后关键字3
的计算结果为125。 / p>
当然,括号的优先级最高。
为了简化对这个概念的理解,不要考虑数字和数学,所有数字都是对象,所有运算符都是消息。原因是5 risedTo: 3
并不意味着a + b * c
,a
和b
都是数字。它们可以是人类,汽车,在线商店文章。他们可以定义自己的c
和+
方法,但这并不意味着*
(这不是&#34;乘法&#34;,它只是一个&#34;明星消息&#34;)应该在*
之前发生。