程序员是否应该彻底了解运算符优先级?使用大括号对表达式进行分组应该没问题,不是吗?我总是使用牙套来更安全。当被问及优先级问题时,我不能轻易回答。
18 回答
对于非常常见的运营商 - 是的,值得了解。如果您将括号括起来,否则将依赖于运算符优先级,您的代码将不可读(或容易与 Lisp 混淆)。
对于更晦涩的运算符 - 我明确避免学习它们。如果我开始认为有太多我无法合理地期望其他开发人员知道的事情是理所当然的,那么我将开始编写我可以轻松阅读但其他人无法阅读的代码。最好的例子是移位运算符。我什至不知道(当然 - 我有一个暗示)如果没有括号,哪些会被同等对待,但我绝对确定哪个更清楚:
int x = (y << shift) + offset;
或者
int x = y << (shift + offset);
是的,了解运算符优先级很重要。但是,我认为使用括号来完全清楚您的意图是有价值的。它将有助于可读性和可维护性。
几年前,我看到了 C 的优先级表:
- 乘法和除法发生在加法和减法之前。
- 使用括号。
这有点过于简化,但它有正确的想法。
除了最常见的算术运算符外,我使用备忘单。如果有一点点棘手,我会使用明确的括号来明确我的意图。
我喜欢使用书面指南而不是记住优先级的原因是我经常使用多种语言工作,但规则略有不同。当我开始过度依赖记忆时,记住最常见运算符之外的任何内容都会导致错误。
你应该理解它,但你不应该假设其他人会。我总是使用括号来明确优先级。
我知道基础知识(例如,除法和乘法高于加法和减法),但我必须查找更深奥的东西。
我通常用括号来表达我的意图。我认为它读起来更好,并且避免了由于不正确的假设而导致的错误。
它当然不会有什么坏处,并且可以帮助您阅读其他人编写的优先级微妙的代码。
但是,在实践中,最好不要假设那些维护您的代码的人将具有相同的技能,因此虽然应该能够阅读此代码,但您可能不想编写过多利用交互的代码。最好使用明确无误的结构,即使这意味着这里和那里有一些额外的括号。
我和你在这件事上;使用大括号明确优先级始终是一个好主意。它使您的代码更易于阅读,并且您的意图很明确。
话虽如此,您应该知道在哪里查找有关运算符优先级的信息,以防您维护其他人的代码。
您应该理解它以便能够阅读由没有在任何地方使用过括号的人编写的代码。
我不认为“总是大括号”是一个好的经验法则。有太多括号的代码变得比必要的更难阅读。像:
(a * b) + c
很傻。某处存在平衡,而挑战在于找到它。像许多其他事情一样,它是关于应用常识的。
实际上:不是。如果它太复杂以至于您必须知道运算符优先级,那么您可能应该将表达式分解成块。另外,括号会拯救你!
专业:学习您选择的语言的顺序并不需要很长时间,并且在阅读其他人的代码时可以派上用场。如果不出意外,只需将其放在立方体墙上的备忘单上。
Quick,在 T-SQL 中具有更高的优先级:AND 与 OR。
SELECT c.Name
FROM [Customer] c LEFT JOIN [Order] o
ON c.CustomerKey = o.CustomerId
WHERE c.Name like 'B%'
OR c.Name like 'Z%'
AND o.CustomerId is NULL
一旦您了解了这些运算符的优先级到您依赖该优先级的程度,您就注定要:
- 自己错误地使用它们。
- 遭受其他人的错误,他们不会学习这些运算符,也无法阅读您的代码。
我认为了解基本的优先规则很重要。我发现了解细节并不值得花时间。主要是因为任何先行不明确的情况都可以通过一组简单的括号来解决。其次,因为不是每个人都知道它们,最好让你的代码对你组中的用户可读。
在大学的时候,我曾经牢记所有的优先规则。一旦我进入现实世界,我发现大多数人并没有熟记于心。如果我签入了一些取决于某些优先规则的有效代码,我始终会得到相同的反馈“添加括号以使其明显”。
不!
如果您不确定优先级,那么其他阅读代码的人很可能会错误地解释它。
如果你不确定只是
( .. )相关的代码位,那么对您或其他任何人来说都没有歧义。
还有第三种选择。而不是记住所有这些规则,或者使用括号来确保一切......
如果您的表达式太长以至于不清楚首先发生什么,请将其分成多行,使用临时变量作为中间结果。然后,您将在没有括号的混乱情况下引入清晰度,并且您可以为临时变量使用描述性名称以使事情更加清晰。
我从来没有 100% 地掌握优先规则,因为我使用多种语言(C、C++、perl、bash,偶尔还会使用一些 TCL/TK)。多年来,我曾多次使用过几种不同的汇编语言和一两个不合格的编译器。
我无法将完整详细的优先规则直接记在脑海中——我不得不经常在规则集之间切换。
是 对于:
- * / + -
- && || 或者
否/也许:
- << >> & | ^
写作时很容易自欺欺人a == a & some_flag
。
即使我建议不要学习优先规则,为了清楚起见使用括号和临时规则(记住:代码是供人类阅读的),有时运算符优先表也会派上用场。
假设您了解运算符优先级的概念(我假设每个人都知道,来自数学课),我宁愿不假设读者有任何知识......
...除了常识:正如已经指出的那样,a * b + c
可以使用数学课上的知识来理解诸如此类的表达式。布尔表达式 likea < 4 && a > 0
可以理解,因为比较绑定比&&
.
另一方面,将按位运算符与普通算术混合没有常识,因此最好在此处使用括号。&&
over的优先级也没有常识||
(或者相反?),所以也使用括号。