在 if 语句中使用 == 运算符两次
Posted
技术标签:
【中文标题】在 if 语句中使用 == 运算符两次【英文标题】:Using the == operator twice in a if statement 【发布时间】:2011-05-15 21:14:41 【问题描述】:在java中可以这样做,它有效吗?
if (turtles.get(h).getX() == turtles.get(g).getX() == 450)
//stuff here
基本上,我想检查 X 是否与 Y 相同,该值是否应为 450。
【问题讨论】:
它可以编译吗?如果没有,那么它可能不起作用。 【参考方案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
,这将返回true
或false
,然后将该真值与c
进行比较。
通常不是你想做的事!
请注意,这个技巧可以用于赋值,因为a = b
的结果是b
(a
的新值),这意味着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以上是关于在 if 语句中使用 == 运算符两次的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mySQL 的 SELECT 语句中使用 If 语句和关系运算符? [复制]
为了在 if 语句中使用我的类,要重载哪个运算符? [复制]