为什么这个程序不会短路?

nlt*_*lta 6 awk logical-operators

运行 gnu awk 时出现 div/0 错误。Mawk 没有同样的错误。

\n
>>> awk \'BEGIN { print (0 && (4/0)) }\'\nawk: cmd. line:1: error: division by zero attempted\n>>> mawk \'\'BEGIN { print (0 && (4/0)) }\'\n0\n
Run Code Online (Sandbox Code Playgroud)\n

如果我在 4 周围添加括号,它的行为是相同的

\n
>>> awk "BEGIN { print (0 && ((4)/0)) }"\n0\n>>> mawk "BEGIN { print (0 && ((4)/0)) }"\n0\n
Run Code Online (Sandbox Code Playgroud)\n

这似乎并不重要。

\n

浏览posix 标准,我实际上找不到“短路”这个词,那么两者都正确吗?只是莫克?

\n

GNU awk 确实这么说

\n
\n

\xe2\x80\x98&&\xe2\x80\x99 和 \xe2\x80\x98||\xe2\x80\x99 运算符因其工作方式而被称为短路运算符。如果可以在计算过程中确定结果,则完整表达式的计算为 \xe2\x80\x9cshort-circled\xe2\x80\x9d。

\n
\n

jhn*_*hnc 6

默认情况下,gawk 使用constant-folding优化代码。
这发生在程序运行之前。

可以通过以下方式关闭它-s

$ gawk 'BEGIN { 0 && 4/0; print "ok" }'
gawk: cmd. line:1: error: division by zero attempted
$ gawk -s 'BEGIN { 0 && 4/0; print "ok" }'
ok
$
Run Code Online (Sandbox Code Playgroud)

  • @jhnc,正如您提到的,错误报告是由于不断折叠造成的,我很高兴他们这样做,因为我想知道我是否有一行代码总是除以零,但我带来了 `( 4)/0` 和 `4/0` 取决于 gawk 提供者,他们现在将修复 `print (0 && ((4)/0))` 情况以及其他评估为常量 NOT 的类似结构在即将发布的 gawk 版本中生成错误消息(请在即将发布的发行说明中查看)。 (4认同)
  • [`print (0 && ((4)/0))` 的问题不会立即失败](/sf/ask/5134316631/#comment129540726_73347579 ) 在 gawk 版本 5.2 中得到修复,这样常数 0 的分母将始终产生预运行错误消息,除非通过“-s”参数停用代码优化。 (2认同)