1

文档表明 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"
);
4

1 回答 1

1

此处HPCC 论坛主题提供的响应表明这是一个已知问题:

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

我在这里提出了一个错误,但是我想这个问题的答案目前是“它应该短路,但它没有”

于 2016-10-19T13:58:58.253 回答