三重平等表达评估

时间:2011-07-01 09:25:26

标签: delphi expression

假设我们有3个变量,我们需要ASSERT它们都可以等于-1或者都不能等于-1。我写了以下代码:

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

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

我经常写这种检查,但是有两个变量。令人惊讶的是,三重比较也被编译,但它没有按预期工作。对于(1,1,1)值,我希望它评估为真。在替换变量值和简化后,我们得到:

ASSERT( False = False = False );

我认为应该评估为True,但事实并非如此。那么如何评估这种三重比较呢?

2 个答案:

答案 0 :(得分:8)

首先,=运算符是二元运算符:它始终适用于一对值。所以没有“三重平等”这样的东西。编译器将评估一对,并使用结果来评估另一对。

当编译器看到多个链接的运算符时,需要使用所谓的“运算符优先级”将它们分组。很清楚你是否考虑过我们在小学学到的基本算术运算符。毫无疑问:3+2*4评估为:它等同于3+(2*4)。如有疑问,请始终自行添加分组。如果你这样做,你会发现你的表达式相当于:

((False = False) = False),很明显它评估为:

(True = False)

您可能想要的是使用AND运算符并将您的初始Assert分组为:

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

然后我可能要么在多行上写这个表达式以使AND运算符显而易见(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秒来计算运算符的优先级,请添加括号。

答案 1 :(得分:2)

比较是关联的: False = False = False 相当于(False = False)= False 。第一个 False = False 评估为 True ,导致比较 True = False ,而 False 。< / p>