gpt4 book ai didi

delphi - 三重等式表达式求值

转载 作者:行者123 更新时间:2023-12-03 15:07:15 26 4
gpt4 key购买 nike

假设我们有 3 个变量,我们需要断言它们要么都等于 -1,要么都不等于 -1。我编写了以下代码:

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

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

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

ASSERT( False = False = False );

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

最佳答案

首先,= 运算符是一个二元运算符:它始终适用于一对值。所以不存在所谓的“三重平等”。编译器将评估一对,并使用结果来评估另一对。

当编译器看到多个链接运算符时,它需要使用所谓的“运算符优先级”将它们分组。如果你想想我们在小学学到的基本算术运算符,就很清楚了。毫无疑问:3+2*4 的计算结果是:它相当于 3+(2*4)。如有疑问,请务必自行添加分组。如果这样做,您会看到您的表达式相当于:

((False = False) = False),很明显它的计算结果为:

(真=假)

您可能想要的是使用 AND 运算符并对初始 Assert 进行分组,如下所示:

ASSERT(((x = -1) = (y = -1)) 和 ((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 秒才能确定运算符的优先级,请添加括号。

关于delphi - 三重等式表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com