【发布时间】:2015-01-05 02:46:40
【问题描述】:
在标准 C99 和 C11 中,如下表达式是 U.B. (未定义的行为):
int x = 2;
int ans = x++ + x++;
在 Bash 中定义了递增/递减运算符,gnu.org 中的官方文档说遵循标准 C 的约定。
此外,Bash 主要符合 POSIX 标准,并且在其标准文档 (http://pubs.opengroup.org/onlinepubs/9699919799/) 中说,对于算术运算,除非另有说明,否则假定为 C 标准。
由于我找不到更多信息,我的结论是在 Bash 中我们也有带有增量运算符的未定义行为:
x = 2
echo $(( x++ + x++ ))
我需要确定我的结论是否正确,或者相反,Bash 中是否存在某种取代 C 标准的约定。
附加说明:在我的系统中尝试(Ubuntu 14.04,Bash 版本 4.3.11)似乎执行了从左到右的评估,并在操作员 ++ 处立即执行增量出现。
【问题讨论】:
-
无论
$(( x++ + x++ ))是什么意思,我保证有一种更清晰、更安全的方式来表达意图。 -
@KeithThompson:我有兴趣了解 Bash 在算术扩展中的规则。是可移植代码吗?我正在尝试了解 Bash 正式规范。
-
Bash 没有正式的规范。我并不是暗示这个问题是重复的,因为它特定于算术评估;然而,在更一般的意义上this has been asked before.
-
@kojiro:在您提供的链接中,在标题评估顺序下,您的答案是
Bash interprets expressions in its primary syntax from left to right。该意见是否基于第 3.7.1 节。的Bash reference manual? -
@R..:不过,这是一个有效的问题。了解规则(如果有的话)很有用。
标签: c linux bash posix post-increment