未定义的行为,或者:Swift是否有序列点?

Mar*_*n R 6 undefined-behavior sequence-points swift

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

int i = 0;
int j = i++ + i++ + ++i;
Run Code Online (Sandbox Code Playgroud)

调用两者

  • 未指定的行为,因为操作数的评估顺序未指定,并且
  • 未定义的行为,因为对同一对象的副作用i相对于彼此是无序的.

例如,参见

现在,鉴于Swift被设计为一种安全的语言,这里的相应情况是什么?结果是

var i = 0
let j = i++ + i++ + ++i
Run Code Online (Sandbox Code Playgroud)

明确界定?可以从Swift书中的语言参考中得出结论j == 4吗?

Mar*_*n R 6

Apple开发人员和Swift设计师Chris Lattner在Apple开发者论坛https://forums.developer.apple.com/thread/20001#63783回答了这个问题:

是的,该表达式的结果将始终为4. Swift从左到右计算表达式,它不是未定义的或实现定义的行为,如C.

克里斯还补充说:

也就是说,如果你编写这样的代码,那么试图维护它的人可能会对你不满意

同意!这是一个证明问题的极端例子.