未定义行为,或:Swift 有序列点吗?

8

在C/C++中,第二条语句

int i = 0;
int j = i++ + i++ + ++i;

调用会导致两种不确定行为:

  • 未指定的行为,因为操作数的求值顺序是未指定的。
  • 未定义的行为,因为对同一对象 i 的副作用在彼此之间是未排序的。

例如,请参见:

现在,考虑到 Swift 被设计成一种 安全 语言,那么这里的对应情况是什么呢?执行

var i = 0
let j = i++ + i++ + ++i

这段代码是否定义良好?从Swift书中的语言参考可以得出j == 4的结论吗?


2
这是一个很好的问题,但不幸的是,我有一种感觉,目前的答案是“没有人知道”... - jtbandes
@jtbandes:谢谢(但有人持不同意见 :) - 你可能是对的。我现在已经在苹果开发者论坛上发布了这个帖子,也许可以得到一些反馈:https://forums.developer.apple.com/thread/20001。 - Martin R
1
太棒了 - Chris Lattner 回复了。我私下里希望答案是“从左到右” :) - jtbandes
1个回答

7
问题由苹果开发人员和Swift设计师Chris Lattner在苹果开发者论坛中回答:https://forums.developer.apple.com/thread/20001#63783
是的,该表达式的结果始终为4。Swift从左到右评估表达式,不像C语言那样未定义或实现定义行为。
Chris补充道:
尽管如此,如果你写这样的代码,试图维护它的人可能不会很高兴。
同意!这只是一个极端的例子,用来说明问题。

1
更新:根据现在开源的[Swift Evolution](https://github.com/apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-inc-decrement.md)过程,`--`和`++`将从未来的Swift版本中删除。 - rickster
@rickster:你说得对,感谢你在这里添加信息!- 但即使没有这些运算符,Swift从左到右评估表达式的事实仍然很有趣(在我看来)。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接