我可以创建以下语句为真的 a 和 b 变量吗?
(a != b && a == b)
通常你不能做这个条件true
,因为其中一个子条件是true
做另一个是false
,做整体表达false
。
但是 a可以通过在两次评估之间更新其中一个条件的值Thread
来创建两个条件。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
。主线程不断检查条件。更新程序线程可能在更新之后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
在多线程环境中,一些变量在执行时可能具有不同的值a != b
,然后在之前将值更改为相等的值a==b
。
但我不确定您是否正在寻找这种答案,因为这表明此类应用程序中存在同步问题。
这在逻辑上是不可能的。
有趣的是,在 C++ 中,您在技术上可以,因为 C++ 允许运算符重载(您可以重新定义 != 和 == 的含义)
有些东西不能同时相等和不相等,所以不,不是在普通代码中也不是在现实世界中。
如果有人关心的话,还有一些其他语言也可以,例如 SQL 和 Haskell。
嗯,a != b && a.equals(b)
是可能的。但是不,a !=b && a==b
不可能true
。
作为:
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
不,没有任何语言。我的意思是,您可以通过在比较之间更改其中一个变量的值,但这会破坏很多事情,这样做是愚蠢的。