//Post and Pre-Increment Test
func FindValueOFC() -> String
{
var a : Int = 10
var b : Int = 20
var c = a++ + a++ + b++ + b++ + ++a + ++b
return "The value Of variable C is \(c)"
}
let whatsTheValueOfC = FindValueOFC()
println(whatsTheValueOfC)
为什么这个程序打印出The value Of variable C is 98
?
从逻辑上讲,它应该是96,因为a++ + a++ + b++ + b++ + ++a + ++b
可以转换为10+11+20+21+12+22 = 96
答案 0 :(得分:2)
请不要永远在真实计划中执行此操作。当您在同一表达式中混合多个mutator时,它会导致 undefined behavior 。语言中没有任何内容可以保证预增量运算符在访问值之前立即发生,或者 post-increment 运算符在访问变量后立即发生。
编译器可以先完成a
和b
的预增量,将所有值相加,然后应用后增量。这将得到
11 + 11 + 21 + 21 + 11 + 21 = 96
关键是许多答案都是可能且有效的,因此名称未定义的行为。您可能会在不同级别的编译器优化中获得不同的答案,这可能会导致您的应用程序的测试版和发布版之间存在非常令人费解的差异。