未定义的行为,或者:Swift 是否有序列点?
Undefined behavior, or: Does Swift have sequence points?
在C/C++中,
中的第二条语句
int i = 0;
int j = i++ + i++ + ++i;
同时调用两者
- 未指定的行为,因为操作数的计算顺序
未指定,并且
- 未定义的行为,因为对同一对象的副作用
i
相对于彼此是无序的。
例子见
- Why are these constructs (using ++) undefined behavior?
- Undefined behavior and sequence points
现在,鉴于 Swift 被设计为 安全 语言,什么是
这里对应的情况?是
的结果
var i = 0
let j = i++ + i++ + ++i
定义明确?可以从中的语言参考中得出结论吗?
Swift 预订 j == 4
?
Apple 开发人员和 Swift 设计师 Chris 回答了这个问题
Lattner 在 Apple 开发者论坛 https://forums.developer.apple.com/thread/20001#63783:
Yes, the result of that expression will always be 4. Swift evaluates
expressions left to right, it isn't undefined or implementation
defined behavior like C.
克里斯还补充道:
That said, if you write code like that, someone trying to maintain it
will probably not be very happy with you
同意!这是一个极端的例子来证明这个问题。
在C/C++中,
中的第二条语句int i = 0;
int j = i++ + i++ + ++i;
同时调用两者
- 未指定的行为,因为操作数的计算顺序 未指定,并且
- 未定义的行为,因为对同一对象的副作用
i
相对于彼此是无序的。
例子见
- Why are these constructs (using ++) undefined behavior?
- Undefined behavior and sequence points
现在,鉴于 Swift 被设计为 安全 语言,什么是 这里对应的情况?是
的结果var i = 0
let j = i++ + i++ + ++i
定义明确?可以从中的语言参考中得出结论吗?
Swift 预订 j == 4
?
Apple 开发人员和 Swift 设计师 Chris 回答了这个问题 Lattner 在 Apple 开发者论坛 https://forums.developer.apple.com/thread/20001#63783:
Yes, the result of that expression will always be 4. Swift evaluates expressions left to right, it isn't undefined or implementation defined behavior like C.
克里斯还补充道:
That said, if you write code like that, someone trying to maintain it will probably not be very happy with you
同意!这是一个极端的例子来证明这个问题。