2011-07-01 21 views
5

3つの変数があり、それらがすべて-1に等しいかどちらも-1に等しくないことをASSERTする必要があるとします。私は次のコードを書いた:トリプル等価式評価

x := 1; 
y := 1; 
z := 1; 

ASSERT((x = -1) = (y = -1) = (z = -1)); 

私はしばしばこの種のチェックを書いているが、2つの変数について書いている。驚いたことに、トリプル比較もコンパイルされましたが、期待どおりに動作しません。 (1,1,1)の値については、それが真であると評価すると期待します。変数値および簡素化の置換した後、我々が得る:

ASSERT(False = False = False); 

を、私はそれがTrueに評価すべきと思ったが、それはしません。だからこの三重比較はどのように評価されますか?

+0

どちらもありませんか?どのように3つの条件で可能ですか? –

+0

+1の奇妙な表現!ブール値以外の値があれば、 '互換性のない型'コンパイラエラーが発生します。 BOOLEANの値が '= '演算子と比較されることはほとんどないので、私はこれがコーナーケースであると思います。 –

+2

何も変わっていない、False = FalseはTrue、Trueは> True False –

答えて

8

まず、=演算子はバイナリ演算子です。常に値のペアで動作します。だから、「三重平等」というものはありません。コンパイラは1つのペアを評価し、その結果を使用して他のペアを評価します。

コンパイラが複数のリンクされた演算子を参照するとき、 "演算子の優先順位"と呼ばれるものを使用してペアにグループ化する必要があります。小学校で学んだ基本的な算術演算子について考えるのは明らかです。疑問の余地はありません:3+2*4は:3+(2*4)に相当します。不確かな場合は、常に自分でグループを追加してください。あなたがそれを行う場合は、あなたが見るあなたの式は同等です:

((False = False) = False)、そしてそれがあると評価明らかです:

(True = False)。 (

ASSERT(((x = -1) = (y = -1)) and ((y = -1) = (z = -1)))

その後、私はおそらくどちらかANDオペレータが明白にするために複数の行にその式を記述します:あなたはおそらく欲しい

は、このようなあなたの最初のAssertANDオペレータとグループを使用することですSQLの習慣、私が知っている)、またはそれを完全に書き直し:

Assert (
    ((x = -1) = (y = -1)) 
    and 
    ((x = -1) = (z = -1)) 
); 

またはこのバリアントを:

Assert (
    ((x = -1) and (y = -1) and (z = -1)) 
    or 
    ((x <> -1) and (y <> -1) and (z <> -1)) 
); 

私のルールは次のとおりです。演算子の優先順位を調べるのに1秒以上かかる場合は、かっこを追加します。

+3

+1 "私のルール"。 –

2

比較は連想である:は= FALSE FALSE =偽が(偽=偽)に相当する= Falseを。最初偽=偽は、比較順番にある真= Falseのにつながる、に評価されます。