该程序与var dig = 0
一起正常运行,并且不适用于var dig:Int
我收到错误:Variable "dig" used before being initialized
您能解释一下原因吗?
func myFunc(a:Int, b:Int) {
var c = a / b
var o = a % b
var v = 0
var dig = 0
if o != 0 {println("\(a)/\(b) = \(c) и \(o)/\(b)")}
else {println("\(a)/\(b) = \(c)")}
if a > b {
v = b
}
else {
v = a
}
for var i = 1; i <= v; ++i {
if a % i == 0 && b % i == 0 {dig = i}
}
println("\(dig) - greatest common denominator of \(a) and \(b)")
}
myFunc(27,81)
答案 0 :(得分:0)
编译器不太了解数学 认识到声明
if a % i == 0 && b % i == 0 {dig = i}
实际上至少执行一次(i == 1
)。因此
编译器假定
dig
println("\(dig) - greatest common denominator of \(a) and \(b)")
在
中指定初始值var dig = 0
是正确的解决方案。
顺便说一句,Euclidean Algorithm是一种更有效的方法 计算最大公约数,例如参见 http://rosettacode.org/wiki/Greatest_common_divisor#Swift
答案 1 :(得分:0)
您设置dig
值的唯一位置是if
循环内的for
语句。 Swift编译器不知道for
循环的主体是否会被执行,并且它不知道if
语句是否真的是真的,所以它必须假设有<{1}}未初始化的路径。
考虑这个更简单的例子:
dig
此示例也会出现相同的错误,因为Swift会分别考虑每个func myFunc(a:Int, b:Int) {
var dig: Int
if a >= b {
dig = 3
}
if a < b {
dig = 4
}
println("\(dig) - greatest common denominator of \(a) and \(b)")
}
。对我们来说很明显a或者大于或等于b或者小于b,但是Swift在评估情况方面并没有那么远。它只是认为每个if
可能不是if
,true
只在dig
内设置,所以有可能(就Swift而言) <{1}}可能未设置。
if
如果你将第二个条件更改为else,那么Swift很高兴,因为它可以推断dig
必须是func myFunc(a:Int, b:Int) {
var dig: Int
if a >= b {
dig = 3
} else {
dig = 4
}
println("\(dig) - greatest common denominator of \(a) and \(b)")
}
或if
并设置true
每个路径,所以它肯定会在false
语句之前有一个值。