これが私の while ループです。問題は、どうすれば真の条件を取得できるかということです。
s
そして変数t
ですInteger
while (s<=t && s>=t && s!=t )
編集
tl;dr元の質問は次のように述べています:
s
そして変数です(そしてOPは変数ではないとコメントしましt
た)int
Integer
これが私の while ループです。問題は、どうすれば真の条件を取得できるかということです。
s
そして変数t
ですInteger
while (s<=t && s>=t && s!=t )
編集
tl;dr元の質問は次のように述べています:
s
そして変数です(そしてOPは変数ではないとコメントしましt
た)int
Integer
一度もない!
s
とt
はint
変数であるためs == t
、3 番目のオペランドが失敗するs != t
と、最初の 2 つのオペランドのいずれかが失敗します。
volatile int s, t;
マルチスレッド アプリケーションのように宣言されている場合は可能ですが、ほとんどありません。
編集
質問が変更されました。s
と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
すべてのクラスによって実装されるまで残され、通常は、比較されるオブジェクトのコア値が同じであることを意味しますが、必ずしも同じであるとは限りません。クラスインスタンス (別名オブジェクト)。ボックス化されたプリミティブの> and <
for は、プリミティブ値に対して評価されます==
が、オブジェクトの同一性をチェックしています。
それは実際に可能です:
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");
}
}
}
これをコンパイルし、2つの等しい整数の引数を使用して実行すると、次のようになります。
$ java EqualsTest 5 5
equal
これが機能する理由は、オートボクシングと、オブジェクト==
の場合、参照が同じであるかどうか(上記の場合はそうではない)のみをチェックするという事実によるものです。
最初の 2 つの条件が真になる唯一の方法は、s が t に等しく、3 番目の条件がこの事実を否定する場合です。
したがって、私はその可能性があるとは思わない
2 つの値が複数のスレッド ( 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
true になります。
したがって、スレッド 1 が と が等しいことを設定s
しt
、次にスレッド 2 がそれらが等しいことを確認し、次にスレッド 1 がそれらが等しくないことを設定し、次にスレッド 2 がそれらが等しくないことを確認します。
これが真である可能性があるより複雑な状況がありますが、これは私が考えることができる最も単純な状況です.
決して男ではありません。
s<=t && s>=t は、s == t の場合に true を返し、s == t && s != t は、常に false を返します。