那是我的while循环,问题是,我怎样才能得到一个真实的条件?
s
并且t
是Integer
变量
while (s<=t && s>=t && s!=t )
编辑
tl;博士原来的问题说:
s
并且t
是int
变量(并且OP评论说它们不是Integer
变量)
那是我的while循环,问题是,我怎样才能得到一个真实的条件?
s
并且t
是Integer
变量
while (s<=t && s>=t && s!=t )
编辑
tl;博士原来的问题说:
s
并且t
是int
变量(并且OP评论说它们不是Integer
变量)
绝不!
s
和t
是int
变量,所以当s == t
第三个操作数失败时s != t
,前两个操作数之一将失败。
如果将它们声明为volatile int s, t;
在多线程应用程序中,则可能,但不太可能。
编辑
问题已修改。Nows
和t
是整数变量,这使得引用Integer
对象的答案更加相关。
通过在对象中装箱原始值:
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 <
盒装原语是根据原语值评估的,但是正在==
检查对象身份。
实际上是可能的:
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
这个工作的原因是由于自动装箱和事实,对于对象,==
只检查引用是否相同(在上面的例子中,它们不是)。
从来没有人,没有办法。
s<=t && s>=t 如果 s == t 则返回 true,并且 s == t && s != t 永远返回 false。
前两个条件结果为真的唯一方法是当 s 等于 t 而第三个条件否定这个事实。
因此我认为不可能
如果这两个值可以被多个线程访问(或者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 检查它们不相等。
在更复杂的情况下,这可能是正确的,但这是我能想到的最简单的情况。