加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 三重平等表达式评估

发布时间:2020-12-15 04:16:55 所属栏目:大数据 来源:网络整理
导读:假设我们有3个变量,我们需要ASSERT它们都可以等于-1或者都不能等于-1.我写了以下代码: x := 1;y := 1;z := 1;ASSERT( (x = -1) = (y = -1) = (z = -1) ); 我经常写这种检查,但两个变量.令人惊讶的是,三重比较也被编译,但它没有按预期工作.对于(1,1,1)值,我
假设我们有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,但事实并非如此.那么三重比较如何评估?

解决方法

首先,=运算符是一个二元运算符:它总是在一对值上运行.所以没有“三重平等”这样的东西.编译器将评估一对,并使用结果来评估另一对.

当编译器看到多个链接的运算符时,需要使用所谓的“运算符优先级”将它们分组.很清楚你是否考虑过我们在小学学到的基本算术运算符.毫无疑问: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秒才能确定运算符的优先级,请添加括号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读