在 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,这将返回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

以上是关于在 if 语句中使用 == 运算符两次的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mySQL 的 SELECT 语句中使用 If 语句和关系运算符? [复制]

在 if 语句中使用 && 运算符

为了在 if 语句中使用我的类,要重载哪个运算符? [复制]

如何在 if 语句中使用重载运算符作为条件?

不能在 const 声明中使用 if 语句,但三元运算符有效[重复]

python中if语句的使用(比较逻辑成员运算符,语句结构)