据我了解,循环中的范围for是包含下限和排除上限的。这在以下代码中引入了一个问题:
fn main() {
let a: u8 = 4;
for num in 0..256 {
if num == a {
println!("match found");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想从 0 到 255 循环 256 次,这符合u8. 但由于范围不包括上限,因此我必须将 256 作为进程 255 的限制。因此,编译器会给出以下警告。
fn main() {
let a: u8 = 4;
for num in 0..256 {
if num == a {
println!("match found");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,程序会跳过循环for。
在我看来,编译器必须忽略范围中的 256 并接受该范围作为u8范围。这是对的吗?还有其他方法给出范围吗?
您可以组合迭代器来创建全u8范围:
use std::iter::once;
for i in (0..255).chain(once(255)){
//...
}
Run Code Online (Sandbox Code Playgroud)
在夜间 Rust 中,您可以使用包含范围:
#![feature(inclusive_range_syntax)]
for i in 0...255 {
//...
}
Run Code Online (Sandbox Code Playgroud)
正如 alex 已经说过的,最好使用更大的整数类型(例如 )进行迭代,并在与您正在搜索的u32比较时进行转换:u8
let a: u8 = 4;
for num in 0..256 {
if (num as u8) == a {
println!("match found");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,您也可以使用半开范围:
let a: u8 = 4;
for num in 0.. {
if num == a {
println!("match found");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
另外,当我执行此操作时,程序会跳过 for 循环。
256 的二进制表示形式是1_0000_0000。u8只保存最右边的 8 位,所以只保存0s。因此0..256u8相当于0..0,这当然是一个空范围。