为什么不简单地评估从左到右?有人可以解释优先级如何使代码更具可读性?对我而言似乎需要更多的思考和更多的错误可能性。爱因斯坦说:“一切都应尽可能简单,但不能简单。”我猜他不是程序员。
答案 0 :(得分:5)
因为在数学中,在任何计算机语言的发明之前,都有运算符优先权,例如
2 + 5 * 3 = 17 (and not 21)
*
运算符优先级高于+
运算符的语言会产生混淆。
C ++的另一个例子:
std::cout << 7 * 8 << std::endl;
如果*
运算符没有<<
运算符的优先级,则无法编译:
std::cout << 7
将首先评估,结果会产生std::cout
(副作用会打印7
)std::cout * 8
- 除非有人定义了一个非常奇怪的运算符*
,用于将outputstream
乘以整数 - 未定义。运算符优先级允许不必在常识中放置不必要的括号(尽管我同意在某些情况下人们会引入错误,因为他们不知道实际的优先级)
现在你可能会问:为什么数学有运算符优先权? This wikipedia article提到了一些历史事实和a discussion forum的链接。对我来说,一个重要的论点就是在写多项式时,例如
ax^2 + bx + c
没有运算符优先级,必须将它们写为:
(a(x^2)) + (bx) + c
答案 1 :(得分:2)
优先权的目的不是为了使其更具可读性,而是为了(a)标准化和(b)与数学中设定的标准保持一致,例如PEMDAS。
答案 2 :(得分:2)
APL没有运算符优先级(括号除外);代码从右到左阅读(如希伯来语或阿拉伯语)。也就是说,APL是一种利基语言,这也是其中一个原因。大多数其他语言,正如其他答案已经指出的那样,模仿了长期建立的算术优先级规则,而这在我看来是由于典型用例(即现实世界问题)如何用最小数量的模型来建模的。括号中。
答案 3 :(得分:1)
数字世界只是遵循BEDMAS
规则的老派“真实”世界:括号,指数,除法,乘法,加法,减法。
更好地追随现实世界,而不是试图重新定义现实并最终与程序员一起做
1 + 2 * 3
as
(1 + 2) * 3 = 9
v.s。一个真正的工作者
1 + (2 * 3) = 7
并将数百万美元的探测器发送到无效的大气下降情况,因为某人“误拿了1”。
答案 4 :(得分:1)
可以取消优先级规则 - 或者更准确地说,只有一条这样的规则 - 如APL所示。
“它只有一个简单,一致和递归的优先规则:函数的右参数是该函数右侧整个表达式的结果。”
例如,在“J”(APL变体)中:
1+2*3 => 7 Computed as 1+(2*3)
2*3+1 => 8 Computed as 2*(3+1)
APL(和J)拥有如此多的运营商,很难记住每一个运营商的优先级和关联性规则。
答案 5 :(得分:1)
存在运算符优先级的原因是因为您应该看到像2*4
这样的总和作为整数。
所以你可以用2*4
不存在的方式来思考它。它只是8
。
所以你基本上做的是“简化”总和,例如:2+10*2
这基本上说:2+20
。
如以下总和:2143+8^2+6^9
。你不想写出2143+262144+10077696
。 (想象一下如果你有一个更大的公式,这会是怎样的)
这基本上是为了简化总和的外观。加法和减法都是最基本的操作形式。这就是为什么有一个优先权,它是为了增加总和的可读性。
就像我说的那样,由于+
和-
运算符是最基本的运算符,因此首先解决更“复杂”的运算符是有意义的。
答案 6 :(得分:0)
例如,对于运算符优先级,以下评估为 14 :
2 + 3 * 4
没有它会评估 20 ,这是意料之外的,imho。
答案 7 :(得分:0)
举个例子,如果没有运算符优先级,你将如何评估这个表达式:
1+2/3
好吧,有些人会说你要将1+2
的总和除以3
。您要将2/3
添加到1
的其他人!