我可以创建以下语句为真的a和b变量吗?
(a != b && a == b)
答案 0 :(得分:4)
通常情况下,您不能将此条件设为true
,因为其中一个子条件true
会使另一个子条件为false
,从而使整体表达式false
。< / p>
但是Thread
可以通过在评估之间更新其中一个条件{2}来同时生成条件true
。
public class ComparisonTest
{
static int a = 0;
static int b = 0;
static int caught = 0;
public static void main(String[] args)
{
new Thread(new Runnable() {
public void run() {
while (b < 100000)
{
a++;
b++;
}
}
}).start();
while (b < 100000)
{
if ((a != b) && (a == b))
{
System.out.println("Caught it! #" + (++caught));
}
}
}
}
该主题不断更新a
和b
。主线程不断检查条件。 updater线程在更新a
之后但在更新b
之前可能会被中断。然后,第一次检查a != b
为true
。然后更新程序线程更新b
并再次中断。主线程执行第二次检查,a == b
,也是true
。对我来说,这个程序在100,000次更新中发现了82次:
Caught it! #1
Caught it! #2
Caught it! #3
Caught it! #4
Caught it! #5
Caught it! #6
Caught it! #7
Caught it! #8
Caught it! #9
Caught it! #10
Caught it! #11
Caught it! #12
Caught it! #13
Caught it! #14
Caught it! #15
(剪断)
Caught it! #80
Caught it! #81
Caught it! #82
答案 1 :(得分:3)
在多线程环境中,某些变量在执行a != b
时可能具有不同的值,然后在a==b
之前将值更改为相等的值。
但我不确定您是否正在寻找这种答案,因为这会表明此类应用程序存在同步问题。
答案 2 :(得分:0)
没有。没有任何语言。我的意思是,你可以通过在比较之间改变其中一个变量的值,但这会破坏很多东西,这样做会很愚蠢。
答案 3 :(得分:0)
这在逻辑上是不可能的。
有趣的是,在C ++中,你在技术上可以,因为C ++允许运算符重载(你可以重新定义!=和==的含义)
某些东西在同一时间是不平等和不平等的,所以不,不是在正常的代码中,也不是在现实世界中。
如果有人关心,还有一些其他语言也可以,例如SQL和Haskell。
答案 4 :(得分:0)
嗯,a != b && a.equals(b)
是可能的。但不,a !=b && a==b
不可能是true
。
as:
true & false = false
false & true = false
然而,
String a = "asd";
String b = new String("asd"); // created just to show as example
if(a!=b && a.equals(b))
System.out.println("duck duck"); // print duck duck