【问题标题】:need explanation on past paper, & Operator [duplicate]需要对过去的论文进行解释,&运算符 [重复]
【发布时间】:2014-01-29 09:44:56
【问题描述】:

我正在做过去的试卷

public static void triangleTest( int a, int b, int c) 
{
    if ( a > 0 & b > 0 & c > 0 ) 
    { 
        if ( a==b || b==c ); 
        { 
            System.out.println("Equilateral"); 
        }
        else if ( a==b || a==c || b!=c ) 
            System.out.println("Scalene"); 
        }
        else if ( a+b>c && a+c>b || b+c>a ); 
        {
            System.out.println(Isoceles); 
        } 
    }
    else 
    { 
        System.out.println(""); 
    } 
} 

我已收到此代码并告诉我找出错误,当我检查答案时

if ( a > 0 & b > 0 & c > 0 ) 

这已被确定为错误,&& 是用来代替& 我运行了代码,它与& 一起工作得很好,所以我的问题是这背后的原因是什么?

【问题讨论】:

  • 你是如何在代码中复制行号的?
  • if ( a==b || b==c );中有分号。 "Equilateral" 将始终被打印,无论 a、b 和 c 的值是什么。
  • 另请注意System.out.println(Isoceles); 不会编译(使用您提供的代码)。
  • 至少您可以在发布之前正确格式化问题:p 但是您可以参考答案。

标签: java operators logical-operators


【解决方案1】:

&bitwise operator&&logical and operator

短路原理不适用于按位和运算符,即&

&

&&

【讨论】:

  • 对于布尔参数,我说那没关系是正确的吗?而且区别在于 & 没有短路?
  • & 也可用作逻辑与运算符。
  • @RichardTingle 是的,短路原理不适用于按位和运算符,即&
  • @Keppil 是的,它可以使用,但术语是这样的。 & 是按位的,&& 是逻辑的。你可以参考这个question接受的答案。
  • @AniketThakur:那么也许在 cmets 中提供一个指向该答案/问题的链接比在此处复制它作为新答案更合适?
【解决方案2】:

& 评估这两个值

如果 && 检查第一个是否为假,则将结果设置为假。

【讨论】:

  • 因此可以公平地说,编写的代码效率较低,但并非真正“错误”
  • 就这个问题而言,如果 ( a > 0 & b > 0 & c > 0 ) 这对我来说很好。
【解决方案3】:

如果您使用&,它将检查第二个条件,尽管第一个条件是false。 在&& 中,如果第一个是false,它不会检查下一个条件。

在某些情况下它可能会导致异常。 例如:

// Some Code

if ( a != null & a.length() > 0 ){
//coding part
}

如果anull,上述代码将抛出NullPointerException&。因为它会在每次第一个是truefalse 时检查第二个条件。

所以它会像这样......

// Some Code

if ( a !=null && a.length() > 0 ){
//coding part
}

更多:refer this SO Que

【讨论】:

    【解决方案4】:

    短路导致高效代码

    && 是logical and,它被短路了。 & 是bitwise and。尽管对于其他情况,情况非常不同;对于布尔值,(实际)区别在于它不会短路。

    短路意味着它会跳过不会影响结果的评估条件。例如

    if(cheapTest() && expensiveTest() && expensiveTest2())
    

    如果第一个测试是假的,则表达式必须是假的,所以它不会打扰昂贵的测试。

    if(FALSE && DONTCARE && DONTCARE)
    

    对于 | 则相反。与 ||。

    防止异常

    这可能更重要,例如,第二个测试在评估时可能会引发异常

    if (someObject!=null && someObject.someTest())
    

    在这种情况下,如果someObject 为空,则someObject.someTest() 永远不会运行,这是预期空值时的常见模式。在您使用bitwise and 的地方,两个测试都将在所有情况下运行,如果someObject 为空,您将收到NullPointerException

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 2017-11-09
      • 2012-07-08
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多