识别冗余括号

Recognizing Redundant parenthesis

通常很容易在您的程序中发现不必要的括号,但我对在 if 语句中使用括号感到有点困惑。

public class TestClass {
    void method(String sectionName) {
        if ("Content".equals(sectionName) || "Overview".equals(sectionName)
                // suppression list
                || (!"AbbreviationAsWordInName".equals(sectionName)
                        && !"AbstractClassName".equals(sectionName)
                        )) {
             System.out.println();
         }
    }
}

我觉得第 5 行(!"AbbreviationAsWordInName" 之前)的括号是不必要的。现在的问题是,通常我可以测试代码然后得出结论,但现在我正在修复一个开源程序中的一些错误,而该插件又被许多其他程序使用,所以我有点困惑。

更多例子-

if (active == (forward ? past : future) &&
    ((increasing && switchOnIncrease) || (!increasing && switchOnDecrease))) 

在上面的例子中,我觉得第 2 行有不必要的括号。
另一个例子-

else if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {}

我觉得上面的例子多了一个括号,应该是-

else if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F') {}

求大神帮我解决一下

如果将此 if 语句格式化为单行代码,您将更清楚地了解语句中实际发生的情况。

if ("Content".equals(sectionName) || "Overview".equals(sectionName) || (!"AbbreviationAsWordInName".equals(sectionName) && "AbstractClassName".equals(sectionName) )) {

现在,如果您查看它并将其分解成多个部分,您会发现只需要满足 3 个条件。

  • 第一。 if ("Content".equals(sectionName))
  • 第二。 if ("Overview".equals(sectionName))
  • 第三。 if (!"AbbreviationAsWordInName".equals(sectionName) && "AbstractClassName".equals(sectionName) )

虽然在 || 之后和右括号之前在第三个条件中省略括号可能是正确的,但代码将被评估为单个条件 - 对于任何查看第三个条件的人来说,这些'redundant' 括号实际上提供了一些清晰度,说明什么构成了这个条件的一部分。毫无疑问,这两个 "AbbreviationAsWordInName".equals(sectionName)"AbstractClassName".equals(sectionName) 都必须满足才能评估为真。

如果省略这个括号,人们可能会对这两个是否构成一个条件的一部分感到困惑。

另外值得一提的是,逻辑表达式有一定的优先级,如下所示:src

就像算术运算符一样,逻辑运算符也有一个运算顺序:首先是 NOT,然后是 AND,然后是 OR。如果您在实际需要的地方(甚至没有注意到)在逻辑表达式中遗漏了括号,这可能会导致逻辑上不同的表达式。始终使用括号以确保计算机按预期顺序计算条件。

我想归根结底(至少在我看来)最好清楚地隔离逻辑条件,这样它们更容易理解,但也有额外的括号,就像缩进、空格和其他样式标准一样,帮助以符合逻辑的方式直观地组织代码。