HPCC-ECL 逻辑运算符 - 为啥 OR 不短路?

Posted

技术标签:

【中文标题】HPCC-ECL 逻辑运算符 - 为啥 OR 不短路?【英文标题】:HPCC-ECL Logical Operators - Why is OR not short-circuiting?HPCC-ECL 逻辑运算符 - 为什么 OR 不短路? 【发布时间】:2016-10-14 12:05:59 【问题描述】:

The documentation 表示 OR 逻辑运算符应该短路:

如果发生概率已知, 您应该将它们从最可能发生到最不可能发生的顺序排列,因为一旦复合的任何部分 OR 条件计算为 TRUE,表达式的其余部分被绕过

除非我弄错了,否则这与预期的不同。 当它必须评估返回 TRUE 的表达式时,它似乎会继续评估 OR 之后的下一个表达式。 似乎对于硬编码的 TRUE 值,它按预期工作。

我是否做错了什么或误解了代码/文档?

考虑下面的代码:

IMPORT STD;
superFileName   := 'temp::superFile';
fileName        := 'temp::regularFile';
returnsTrue     := ~STD.File.FileExists(fileName, TRUE); // File does not exist, so will return true as expression is negated
getSubCount     := NOTHOR(STD.File.GetSuperFileSubCount(superFileName)) > 0; // "Could not locate superfile: thor::nonExistent"

deleteFile      := STD.File.DeleteLogicalFile(fileName);
deleteSuperFile := STD.File.DeleteSuperFile(superFileName);

SEQUENTIAL(
  deleteFile,
  deleteSuperFile,
  OUTPUT(returnsTrue), // true
  OUTPUT(IF ((TRUE OR getSubCount), 'true', 'false')), // 'true'
  OUTPUT(IF ((returnsTrue OR getSubCount), 'true', 'false')), // "Could not locate superfile: thor::temp::superFile"
);

【问题讨论】:

【参考方案1】:

HPCC 论坛主题here 上提供的回复表明这是一个已知问题:

在这种情况下,您的 getSubCount 定义是一个动作,编译器在一个条件下执行所有动作是一个已知问题。

我已经为这个here 提出了一个错误,但是我猜这个问题的答案目前是“它应该短路,但它没有”

【讨论】:

以上是关于HPCC-ECL 逻辑运算符 - 为啥 OR 不短路?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 VS 不为逻辑运算符定义替代标记?

为啥 JavaScript 中的逻辑运算符是左关联的?

当按位运算符做同样的事情时,为啥要使用逻辑运算符?

为啥 ~= 在 C++ 中缺少唯一的非逻辑赋值运算符? [关闭]

当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符

为啥这个逻辑/按位运算返回 1?