【问题标题】:Understanding parentheses within if statements [duplicate]理解 if 语句中的括号 [重复]
【发布时间】:2019-12-14 14:07:32
【问题描述】:

我正在完成一些 C# 编码练习,并遇到了一些令我难以理解的运算符逻辑。

以下代码行的计算结果为 false:

int a = 40, int b = 50;

if (a >= 20 && a <= 30 && (b < 20 || b > 30))
    {
       return a;
    }

但是,如果我从 if 语句中删除括号,它的计算结果为 true。

if (a >= 20 && a <= 30 && b < 20 || b > 30)
     {
            return a;
     }

谁能解释我错过了什么?鉴于 a 不在 20 到 30 之间,它不应该返回 false 吗?我不明白为什么将 if 语句的 b 部分放在括号中会使其评估为 false。

它是否将“b > 30”之前的所有内容都作为单个条件进行评估?

【问题讨论】:

  • 运算符优先级决定了不使用括号时表达式的分组方式。
  • @Sweeper:这仅适用于您混合的所有运算符具有相同优先级的情况。 ||&amp;&amp; 没有。并且评估顺序不会受到影响。
  • @BenVoigt 是的,你是对的,刚刚检查了规范。
  • 感谢所有反馈。我现在明白我哪里出错了。

标签: c#


【解决方案1】:

如果您查看删除括号的第二部分,它现在分为两个子部分。

第一个是:a &gt;= 20 &amp;&amp; a &lt;= 30 &amp;&amp; b &lt; 20 这评估为假。 第一个是:b &gt; 30 此语句的计算结果为真。

所以最后你有这样的东西 F || T 来自这两个陈述,最终结果应该是真实的

【讨论】:

  • && 和 || 是否有优先顺序?因为在我看来这是正在发生的事情的一部分
  • 是的。 && 的优先级高于 || .你是对的:)
  • 如果表达式是 A && B || C 然后它被重新组合为 (A&&B) || C
【解决方案2】:

这与运算符优先级有关。

就像*+ 之前被评估(我们说* 的优先级高于+),&amp;&amp;||as specified 之前被评估。

在第一个代码 sn-p 中,您使用括号“覆盖”此优先级,使 || 部分首先计算,就像您可以将括号添加到表达式 1 + 2 * 3 以使其计算为 9 7 个。

a >= 20 && a <= 30 && (b < 20 || b > 30)
                      ^^^^^^^^^^^^^^^^^
                        this part first

变成:

a >= 20 && a <= 30 && true
^^^^^^^    ^^^^^^^
now these parts

变成:

false && false && true

导致false

然而,在第二个示例中,没有括号,因此根据正常的优先级规则计算表达式:

a >= 20 && a <= 30 && b < 20 || b > 30
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This part first

变成:

false || b > 30
         ^^^^^^
         then this

变成:

false || true

导致true

【讨论】:

  • 谢谢你。由于你的解释,它终于和我一起点击了。
  • @JamesMacDonald 请考虑通过单击该复选标记来接受您认为对您最有帮助的答案! :)
猜你喜欢
  • 2019-11-03
  • 2015-02-13
  • 1970-01-01
  • 2014-11-11
  • 2017-06-14
  • 2014-09-09
  • 2013-08-29
相关资源
最近更新 更多