【问题标题】:Using the == operator twice in a if statement在 if 语句中使用 == 运算符两次
【发布时间】:2011-05-15 21:14:41
【问题描述】:

在java中可以这样做,它有效吗?

if (turtles.get(h).getX() == turtles.get(g).getX() == 450) { 
    //stuff here
}

基本上,我想检查 X 是否与 Y 相同,该值是否应为 450。

【问题讨论】:

  • 它可以编译吗?如果没有,那么它可能不起作用。

标签: java if-statement equality-operator


【解决方案1】:

没有。您希望那里发生什么?

"a == b" 计算为布尔值,因此 "int == (int == int)" 将计算为 "int == boolean",并且不能比较 int 和布尔值。

此外,你想在这里做什么逻辑? if ((a == b) && (b == c))?

【讨论】:

  • 我想检查 X = Y,并且 X 和 Y 的值都是 450。我该怎么做?
  • @Jake:(x == y) && (y == 450)(x == 450) && (y == 450)
  • ...或(x == z) && (y == z),此处的 z 为 450。 (计算 y 可能很昂贵或有副作用)。
【解决方案2】:

不,不是。这是因为a == b 的结果是一个布尔值。如果您执行a == b == c,您首先要比较a == b,这将返回truefalse,然后将该真值与c 进行比较。

通常不是你想做的事!

请注意,这个技巧可以用于赋值,因为a = b 的结果是ba 的新值),这意味着a = b = c 甚至(a = b) == c 进来偶尔有用。

【讨论】:

  • 在Java中,赋值是语句,不是表达式,所以不能"(a = b) == c"
  • @Lie:在评论之前尝试/研究它。它工作得很好,并且经常用于 I/O 习惯用法,例如for (String line = null; (line = reader.readLine()) != null; ) { //...
  • @Lie:那是因为您在语句上下文中使用了它。任何表达式都不能用作单个语句。像这样使用它:if ((a = b) == c) { //... 它会工作得很好。或者,如果您更喜欢声明,boolean myBool = (a = b) == c;
【解决方案3】:

没有。它与 (turtles.get(h).getX() == turtles.get(g).getX()) == 450 -“无与伦比的类型”相同。 if(turtles.get(h).getX() == 450 && turtles.get(g).getX() == 450).

【讨论】:

    【解决方案4】:

    或者使用辅助方法避免所有可读性较差(且容易出错)的重复...

    public boolean areEqual( int a, int b, int c )
    {
        return ( a == b ) && ( b == c ) ;
    }
    

    【讨论】:

      【解决方案5】:

      这行不通,因为== 运算符是二进制的。
      即使它按顺序工作,第一个集合也会返回一个布尔值,它不会对后面的整数起作用。

      【讨论】:

      • == 不是二元运算符的问题。在 OP 的示例中,== 的两个实例都对两个操作数起作用。这是类型不兼容的问题(您的第二点)。
      • @Mark Peters -- 我不确定。您认为if("1" == "2" == "3") 行现在可以工作,因为它们是兼容的类型?我对此表示怀疑。
      • 那些仍然不是兼容的类型。它在第二个== 处将布尔值与引用类型(字符串)进行比较。兼容的类型是myBool1 == myBool2 == true,它工作得很好(但这是一个愚蠢的表达)。
      • @Mark Peters -- 是的,true == true == true 可以工作,但在意想不到的结果,例如true == false == false 将评估为true =)
      • 来自 JLS:“Java 编程语言保证运算符的操作数看起来是按特定的计算顺序计算的,即从左到右。”您的表达式的两个结果都符合此规则: (((true == true) => true) == true) => true, (((true == false) => false) == false) => true
      【解决方案6】:

      不,它不会起作用,正如其他帖子中所解释的那样。但你可以这样做

      if (turtles.get(h).getX() - turtles.get(g).getX() + 450 == 0) 
      

      【讨论】:

      • 可以 - 但这根本不是同一件事。
      • 确实如此。在工作 12 小时后试图变得聪明可能不是一个好主意;)。
      • 也许你的意思是if (a+b == 450*2),但你会在那里得到大量的误报(a=449,b=451)。如果要检查两个变量,则需要进行两次离散检查。
      • 啊,等等,你真的想偷偷摸摸吗?让我们来看看。 if ((a^450)|(b^450)) == 0。怎么样? :P
      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多