如何在java中将真正的逻辑条件变为true

时间:2012-12-10 18:24:11

标签: java loops while-loop logic

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

stInteger变量

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

修改

tl; dr 原来的问题说明了:

stint个变量(OP表示它们不是Integer变量)

6 个答案:

答案 0 :(得分:3)

从不! stint个变量,因此当s == t第三个操作数失败时,前s != t个前两个操作数中的一个将失败。

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

修改

问题已被修改。现在st是整数变量,这使得引用Integer个对象的答案更具相关性。

答案 1 :(得分: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 <被评估为原始值,但是==正在检查对象标识。

答案 2 :(得分: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

这可行的原因是由于autoboxing以及对于对象,==仅检查引用是否相同(在上面的情况下,它们不是)。

答案 3 :(得分:0)

绝不是男人,不可能。

s&lt; = t&amp;&amp; s> = t如果s == t则返回true,并且s == t&amp;&amp; s!= t永远地返回false。

答案 4 :(得分:0)

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

因此我认为不可能

答案 5 :(得分: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检查它们是否相等不等于。

有更复杂的情况,这可能是真的,但这是我能想到的最简单的。