-2

那是我的while循环,问题是,我怎样才能得到一个真实的条件?

s并且tInteger变量

while (s<=t && s>=t && s!=t )

编辑

tl;博士原来的问题说:

s并且tint变量(并且OP评论说它们不是Integer变量)

4

6 回答 6

3

绝不! stint变量,所以当s == t第三个操作数失败时s != t,前两个操作数之一将失败。

如果将它们声明为volatile int s, t;在多线程应用程序中,则可能,但不太可能。

编辑

问题已修改。Nowst是整数变量,这使得引用Integer对象的答案更加相关。

于 2012-12-10T18:25:21.487 回答
2

通过在对象中装箱原始值:

    Integer s = new Integer(5);
    Integer t = new Integer(5);

    boolean rslt = (s <= t && s >= t && s !=  t);

    System.out.println("Result = " + rslt);

这里的rslt布尔值确实会评估为true

但是,以下将返回 false:

s <= t && s >= t && !s.equals(t)

这是因为在 Java 中,对于对象,==意味着它确实是同一个实例,而equals由每个类实现,通常意味着比较对象的核心值是相同的——但不一定相同类实例(AKA 对象)。> and <盒装原语是根据原语值评估的,但是正在==检查对象身份。

于 2012-12-10T18:31:45.647 回答
1

实际上是可能的:

public class EqualsTest
{
    public static void main(String[] args)
    {
        Integer x = new Integer(Integer.parseInt(args[0]));
        Integer y = new Integer(Integer.parseInt(args[1]));

        if(x <= y && y <= x && y !=x)
        {
            System.out.println("equal");
        }
        else
        {
            System.out.println("not equal");
        }
    }
}

编译它并使用两个相等的整数参数运行它会产生:

$ java EqualsTest 5 5
equal

这个工作的原因是由于自动装箱和事实,对于对象,==只检查引用是否相同(在上面的例子中,它们不是)。

于 2012-12-10T18:35:52.760 回答
0

从来没有人,没有办法。

s<=t && s>=t 如果 s == t 则返回 true,并且 s == t && s != t 永远返回 false。

于 2012-12-10T18:26:37.130 回答
0

前两个条件结果为真的唯一方法是当 s 等于 t 而第三个条件否定这个事实。

因此我认为不可能

于 2012-12-10T18:28:50.787 回答
0

如果这两个值可以被多个线程访问(或者static多个线程之间共享的对象的成员变量),你可以这样做:

线程 1:

s = 1; // 1
t = 1; // 2
t = 2; // 5

线程 2:

这相当于你的表达,但更容易标记。

boolean result = s <= t; // 3
if(result) {
    result = s >= t; // 4
}
if(result) {
    result = s != t; // 6
}

假设一切都按照注释数字给出的顺序发生,那么在线程 2 的代码结束时,result将是真的。

因此,线程 1 设置st相等,然后线程 2 检查它们是否相等,然后线程 1 将它们设置为不相等,然后线程 2 检查它们不相等。

在更复杂的情况下,这可能是正确的,但这是我能想到的最简单的情况。

于 2012-12-10T18:40:31.153 回答