我正在研究Ivan Bratko的书:“人工智能编程”
现在我正在研究运营商,我对此有些怀疑,在本书上我可以阅读以下内容:
因此运算符的优先级决定了表达式的正确解释。例如,表达式 a + b * c 原则上可理解为:
1。 +(a, *(b,c))
或作为:
2。 *(+(a,b), c)
现在我开始怀疑第一个疑问:“这意味着什么?看起来我非常沮丧,因为这两个表达方式给出了不同的三个不同的结果!
例如,如果我有:a=2
,b=3
,c=4
第一个的结果是14,第二个的结果是20,所以有不同的:不同的thress意味着不同的操作员执行顺序,这意味着不同的结果!
所以我认为(使用算术运算符的通常优先级:首先执行乘法和总和之后)正确的表达式是第一个,第二个是错误的。
这是对的吗?
继续读这本书,我也可以阅读:
一般规则是具有最高优先级的运算符是该术语的主要函子。如果要根据我们的常规约定理解包含+和*的表达式,那么然后+具有更高的优先级,然后*运算符
现在我有第二个疑问:正如我所说,在正常的算术惯例中,我首先执行乘法,然后执行求和,所以在我看来,*运算符具有优先权而不是+
我对此缺少什么?为什么在书中说+
的优先级高于*
?
答案 0 :(得分:1)
“术语的主要函子”表示要执行的 last 操作,或前缀表示法中最外面的操作。这个定义与你的定义相反,因而是矛盾。
答案 1 :(得分:1)
因此,运算符的优先级决定了对表达式的正确解释。例如,表达式
a + b*c
原则上可以理解为:+(a, *(b,c))
或作为:
*(+(a,b), c)
它表示没有优先权,这两种方法可以解释表达式(解析表达式的不同方式会产生不同的结果)。当您知道a + (b * c)
应该在*
之前执行时,您才知道要对+
进行分组。 (我在这里避免用优先级解释,因为它如下所述令人困惑。)
+
和*
只是符号,只是它们被用作具有某些已定义优先级的运算符。一般来说,您可以将任何内容定义为运算符,并赋予它优先权。
一般规则是具有最高优先级的运算符是该术语的主要函子。如果要根据我们的常规惯例理解包含
+
和*
的表达式,则+
具有优先级而不是*
运算符
英语中优先级的定义是“被认为比某人或其他人更重要的条件;重要性,顺序或等级的优先级”。只要事情必须在其他事情发生之前,我们就有优先级。
在C中,operator precedence是表达式中绑定的顺序。 C中的高优先级运算符将在低优先级运算符之前执行。
在Prolog中,precedence是获取仿函数的顺序,这与C运算符的绑定顺序相反。当我们使用=..
分析表达式时,较高的优先级运算符将出现在之前。