【问题标题】:A series of && / || operators [duplicate]一系列 && / ||运营商 [重复]
【发布时间】:2016-02-27 08:09:59
【问题描述】:

这样做在逻辑上是否相同:

if ( a || b || c || d) 

if ((a || b) || (c || d))

也就是说&&和||的顺序如何操作员工作是从左到右还是从右到左?

怎么样:

if ( a && b && c && d) 

if ((a && b) && (c && d))

【问题讨论】:

  • 运算符的所有参数总是从左到右计算。优先级是另一回事(即选择从哪个运算符开始)。
  • @bizclop 所有操作数都是从左到右计算的。运算符根据它们的关联性和优先级进行评估。
  • @EJP 是的,我澄清了那个声明。右关联性意味着从右到左进行评估,这只是一种普遍存在的误解。
  • @bizclop 这根本不是一个“普遍存在的误解”。这是真的。请参阅JLS:“有 12 个赋值运算符;所有在语法上都是右关联的(它们从右到左分组)。因此,a=b=c 表示 a=(b=c),它分配的值c 给 b,然后将 b 的值赋给 a。"

标签: java


【解决方案1】:

如果是左关联,则从左到右评估相同运算符的序列,如果是右关联,则从右到左评估。比如

a || b || c

一样
(a || b) || c

但是,如果你混合 ||和 && then 运算符优先级接管。

【讨论】:

    【解决方案2】:

    我想提供一个详细的答案,以便您不仅了解逻辑 (AND) 和 (OR),而且了解通常如何评估运算符以及它们的优先顺序是什么。有很多方法可以计算多个逻辑表达式。

    第一步是理解OR和AND的真值表如下所示(Source):

    如上所示,对于不同的 x 和 y 值,X AND Y (X && Y) 和 X OR Y (X || Y) 会产生不同的值。如果您注意下面的 AND 操作,则需要 X 和 Y 都为真才能使结果为真,但是在 OR 的情况下,如果 X 或 Y 为真,则结果为真。

    您需要牢记上表中的 AND 和 OR。

    如果您希望能够计算多个逻辑表达式(AND 和 OR),De Morgen's law 可以帮助您如何使用 NOT 操作来做到这一点。

    规则可以用英文表示为:

    连词的否定是否定的析取。这 析取的否定是否定的合取。

    或非正式地:

    "not (A and B)" 等同于"(not A) or (not B)"

    还有,

    "not (A or B)" 与 "(not A) and (not B)" 相同。

    herehere 中阅读有关德摩根定律以及如何使用它评估多个逻辑表达式的更多信息。

    逻辑 AND 和 OR 的优先级从左到右。请参见下表 (Source),这应该让您了解哪些运算符是从右到左的,哪些是从左到右的以及它们的优先顺序,例如 () and [] 具有最高优先级,而赋值具有最低优先级运营商之间。如果你注意到了

    回到你的例子

    if ( a || b || c || d)
    

    根据真值表,从

    开始有16种可能的组合
    a=true,b=true,c=true,d=true 
    ...
    ... 
    ... 
    a=false,b=false,c=false,d=false 
    

    只要 a,b,c,d 中的任何一个为真,则结果为真,因此,在 16 种可能的组合中,15 种为真,最后一个为假,因为所有 a,b,c,d 都是假的.

    ON 下面是否和上面一样?是的。

    if ((a || b) || (c || d))
    

    2 之间的唯一区别是,在第二个中,括号首先被评估,因此 (a || b) 被评估然后 ORd 与 (c || d) 但是的评估结果。上述相同的逻辑在这里也适用。只要 a,b,c,d 之一为真,则结果为真。

    关于以下,是的,两者的评估结果相同。

    if ( a && b && c && d) 
    vs
    if ((a && b) && (c && d)) 
    

    a,b,c,d 的不同值的 16 种可能组合与上述相同。上述唯一真实的结果是当所有 a,b,c,d 都为真时。因此只有一个是真的,另一个是 15 个假的。

    【讨论】:

      【解决方案3】:

      如果其中一个变量为真,则语句 if ( a || b || c || d)if ((a || b) || (c || d)) 都将返回 true

      只有当所有变量都不为假时,声明 if ( a && b && c && d)if ((a && b) && (c && d)) 才会返回真。

      评估也是从左到右。

      【讨论】:

      • 还有短路的问题,但这也不会改变。
      【解决方案4】:

      这些是从左到右操作的短路运算符,这意味着只要整个表达式的逻辑值不能被其余项更改,执行就会停止。只要|| 碰到true,它就会停止,整个事情都是真的,而一旦&& 碰到false,它整个事情都是假的。因此,尽管这些运算符在理论上是关联和交换的,但排序和分组确实具有实际效果。事实上,这样做很常见:

      if (foo == null || foo.someProperty())
      

      if (foo != null && foo.someProperty())
      

      这两个都保证不会出现空指针异常,因为如果 foo 为空,则不会计算第二个。

      【讨论】:

        猜你喜欢
        • 2010-12-26
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        相关资源
        最近更新 更多