1

我可以创建以下语句为真的 a 和 b 变量吗?

    (a != b && a == b)
4

5 回答 5

4

通常你不能做这个条件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));
         }
      }
   }
}

线程不断更新ab。主线程不断检查条件。更新程序线程可能在更新之后a但在更新之前被中断b。然后第一个检查a != btrue。然后更新线程更新b并再次被中断。主线程执行第二次检查,a == btrue也是。对我来说,这个程序在 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
于 2013-11-06T22:51:36.720 回答
3

在多线程环境中,一些变量在执行时可能具有不同的值a != b,然后在之前将值更改为相等的值a==b

但我不确定您是否正在寻找这种答案,因为这表明此类应用程序中存在同步问题。

于 2013-11-06T22:40:43.357 回答
0

这在逻辑上是不可能的。

有趣的是,在 C++ 中,您在技术上可以,因为 C++ 允许运算符重载(您可以重新定义 != 和 == 的含义)

有些东西不能同时相等和不相等,所以不,不是在普通代码中也不是在现实世界中。

如果有人关心的话,还有一些其他语言也可以,例如 SQL 和 Haskell。

于 2013-11-06T22:36:49.157 回答
0

嗯,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 
于 2013-11-06T22:42:00.243 回答
0

不,没有任何语言。我的意思是,您可以通过在比较之间更改其中一个变量的值,但这会破坏很多事情,这样做是愚蠢的。

于 2013-11-06T22:36:05.193 回答