为什么在 Awk 中未定义用于连接的表达式的求值顺序?

fed*_*qui 6 awk

在 GNU Awk 用户指南中,我浏览了6.2.2 字符串连接部分,并发现了有趣的见解:

由于字符串连接没有显式运算符,因此通常需要通过使用括号将要连接的项括起来来确保它在正确的时间发生。

然后,我很惊讶地阅读以下内容:

除了最常见的上下文外,所有的连接都应该使用括号,例如在“=”的右侧。请注意字符串连接中使用的表达式类型。特别是,用于连接的表达式的求值顺序在 awk 语言中是未定义的。考虑这个例子:

BEGIN {
   a = "don't"
   print (a " " (a = "panic"))
}
Run Code Online (Sandbox Code Playgroud)

未定义对 a 的第二次赋值是在检索 a 的值以生成连接值之前还是之后。结果可能是“不要惊慌”或“惊慌失措”。

特别是,在我的 GNU Awk 5.0.0 中,它是这样执行的,在打印值之前进行替换:

$ gawk 'BEGIN {a = "dont"; print (a " " (a = "panic"))}'
dont panic
Run Code Online (Sandbox Code Playgroud)

但是,我想知道:为什么没有定义表达式的求值顺序?根据您运行的 Awk 版本的不同,拥有“未定义”的输出有什么好处?

Hen*_*eld 2

这个特定的例子是关于带有副作用的表达式。传统上,在 C 和 awk 语法(深受 C 启发)中,允许在表达式内进行赋值。如何评估这些表达式取决于实现。

留下未指定的内容将确保人们不会使用可能令人困惑或模棱两可的语言结构。但这是假设他们意识到缺乏规范。