

新闻资讯
技术学院rust 的 `..` 是左闭右开区间,而 go 和 ruby 默认未包含上界,若不统一边界逻辑会导致累加结果偏差;本文通过代码对比与修正,阐明三语言在整数范围遍历中的关键差异及正确写法。
在 Rust 中,0is..100000000is 表示从 0(含)到 100000000(不含)的整数序列,即实际遍历 0, 1, 2, ..., 99999999 —— 共 100,000,000 个数,其数学和为:
$$ \sum_{i=0}^{99999999} i = \frac{99999999 \times 100000000}{2} = 4999999950000000 $$
而原始 Go 与 Ruby 示例中,循环条件分别为 i 未包含 99999999,且起始值为 1(非 0),因此实际计算的是:
$$
\sum_{i=1}^{99999998} i =
\frac{99999998 \times 99999999}{2} = 4999999850000001
$$
这正是你观察到的结果差异根源:不仅起始点不同(0 vs 1),上界包容性也不同(Rust 包含 99999999,Go/Ruby 均排除)。
✅ 正确对齐逻辑的写法如下:
Rust(推荐使用现代语法,is 已废弃):
fn main() {
let mut sum = 0i64;
for i in 0..=99999999 { // 使用 ..= 表示闭区间 [0, 99999999]
sum += i;
}
println!("{}", sum); // 输出:4999999950000000
}Go(修正为包含 99999999,且用 int64 避免溢出):
package main
import "fmt"
func main() {
var sum int64 = 0
for i := int64(0); i <= 99999999; i++ {
sum += i
}
fmt.Println(sum) // 输出:4999999950000000
}Ruby(使用 .. 表示包含上界):
sum = 0
(0..99999999).each { |i| sum += i }
puts sum # 输出:4999999950000000⚠️ 注意事项:
总结:跨语言迁移循环逻辑时,必须显式校验区间语义(开/闭)、起始偏移与数据类型,不可依赖直觉。统一边界定义后,三语言结果完全一致。