这是我的while循环,问题是,我怎样才能得到真实的条件?
s
和t
是Integer
变量
while (s<=t && s>=t && s!=t )
修改
tl; dr 原来的问题说明了:
s
和t
是int
个变量(OP表示它们不是Integer
变量)
答案 0 :(得分:3)
从不!
s
和t
是int
个变量,因此当s == t
第三个操作数失败时,前s != t
个前两个操作数中的一个将失败。
如果在多线程应用程序中将它们声明为volatile int s, t;
,则可能但不太可能。
修改强>
问题已被修改。现在s
和t
是整数变量,这使得引用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将s
和t
设置为相等,然后线程2检查它们是否相等,然后线程1将它们设置为不相等,然后线程2检查它们是否相等不等于。
有更复杂的情况,这可能是真的,但这是我能想到的最简单的。