是否存在等于而不等于的变量?

时间:2013-11-06 22:33:29

标签: java

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

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

5 个答案:

答案 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));
         }
      }
   }
}

该主题不断更新ab。主线程不断检查条件。 updater线程在更新a之后但在更新b之前可能会被中断。然后,第一次检查a != btrue。然后更新程序线程更新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