那是我的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 检查它们不相等。
在更复杂的情况下,这可能是正确的,但这是我能想到的最简单的情况。