大多数二进制算术运算符在大多数情况下是左关联的 编程语言。但是,大多数编译器都可以自由评估 任意顺序的二元运算符的操作数。这些是 陈述矛盾吗?为什么或为什么不呢?
修改
这来自我正在阅读的书“编程语言语用学”第6章,练习6.1,我看到这本书在Steve Yegge的博客上得到了很好的推荐。所以我决定把它检查出来。
答案 0 :(得分:1)
嗯,不,他们并不矛盾,只是因为句子说的“最”: - )
在任何一种情况下,如果操作顺序不影响结果,编译器应该可以自由选择最有效的方法。无论你如何切片和切块,7 * 2
总是等于2 * 7
。
考虑声明:
a = (b + 1) * (c + 2)
编译器可以选择是否使用:
(b + 1) * (c + 2)
(c + 2) * (b + 1)
甚至:
(b * c) + b + b + c + 2
只要结果相同(在预期的准确范围内)。
事实上,只要结果相同,即使是如下声明:
newval = 100 * PI * E / val * tot / 0.2
可以将其各个组件移动而不会出现问题。如果编译器可以用更快或更小的代码实现相同的目的,那么它应该。
语言标准倾向于指定必须达到某个结果,而不是如何达到该结果。
答案 1 :(得分:1)
事实证明,Associativity确定哪些子表达式是哪些运算符的参数。但它并不确定它们的评估顺序。
例如,左关联性将确定f(a) - g(b) - h(c)变为(f(a) - g(a)) - h(c)但它不确定是否f( a)将在g(b)之前进行评估。
答案 2 :(得分:0)
以相反的顺序评估二进制操作会发生什么?