是
您应该始终使用括号...您无法控制优先级顺序...编译器的开发人员可以。这是我发生的一个不使用括号的故事。这在两周内影响了数百人。
现实世界中的原因
我继承了一个大型机应用程序。有一天,它突然失去作用了。就这样... po声就停了下来。
我的工作是使它尽快运行。源代码已经有两年没有被修改,但是突然间它就停止了。我试图编译代码,但它在XX行上中断了。我看着XX行,但我不知道是什么使XX行中断。我询问了此应用程序的详细规格,但没有。XX行不是罪魁祸首。
我打印出了代码,并开始从上至下进行审查。我开始创建正在发生的事情的流程图。代码太复杂了,我什至无法理解。我放弃尝试绘制流程图。我很害怕做出更改,却不知道该更改将如何影响其余的过程,尤其是因为我没有应用程序的功能或依赖链中的位置的详细信息。
因此,我决定从源代码的顶部开始,并添加whitespce和行制动器,以使代码更具可读性。我注意到,在某些情况下,如果条件组合在一起AND
,OR
并且在AND
编辑什么数据和编辑什么数据之间并没有明显的区别OR
。因此,我开始在AND
和OR
条件周围加上括号,以使其更具可读性。
当我慢慢进行清理时,我会定期保存工作。有一次我尝试编译代码,然后发生了一件奇怪的事情。该错误已跳过原始代码行,而现在进一步降低了。所以我继续,用括号分隔了AND
和OR
条件。当我完成清理工作时。去搞清楚。
然后,我决定访问操作车间,询问他们最近是否在主机上安装了任何新组件。他们说是的,我们最近升级了编译器。嗯
事实证明,旧的编译器无论如何都从左到右评估表达式。新版本的编译器还从左到右评估表达式,但是代码含糊不清,这意味着不清楚的组合AND
并且OR
无法解决。
我从中学到的教训...总是,总是,总是使用括号将AND
条件和OR
条件相互结合使用。
简化示例
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(其中的代码杂乱无章)
这是我遇到的问题的简化版本。复合布尔逻辑语句还有其他条件。
我记得将它赶到:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
我无法重写它,因为没有规范。原始作者早已不复存在。我记得压力很大。一整艘货船被困在港口,无法卸载,因为这个小程序不起作用。没有警告。无需更改源代码。在我发现添加括号改变了错误之后,我才问网络运营商是否修改了任何内容。