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



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

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

调用两个

  • 未指定的行为,因为操作数的求值顺序未指定,并且
  • 未定义的行为,因为同一对象i上的副作用是相对于彼此未排序的

参见示例

  • 为什么这些构造(使用++(是未定义的行为
  • 未定义的行为和序列点

现在,考虑到Swift被设计为安全语言这里的相应情况?是的结果吗

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

定义明确?一个人能从中的语言参考得出结论吗Swift book that j == 4

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

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

Chris还补充道:

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

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

相关内容

最新更新