根据我的理解,for
- 循环中的范围是低限制包含和上限排除。这在以下代码中引入了一个问题:
fn main() {
let a: u8 = 4;
for num in 0..256 {
if num == a {
println!("match found");
break;
}
}
}
我想从0到255循环256次,这符合u8
支持的数据范围。但由于范围是上限独占,我必须给256作为处理255的限制。因此,编译器给出以下警告。
warning: literal out of range for u8
--> src/main.rs:4:19
|
4 | for num in 0..256 {
| ^^^
|
= note: #[warn(overflowing_literals)] on by default
执行此操作时,程序会跳过for
循环。
在我看来,编译器必须忽略范围内的256并接受范围为u8
范围。这是对的吗?还有其他方法可以给出范围吗?
答案 0 :(得分:4)
正如亚历克斯已经说过的,最好使用更大的整数类型(如u32
)进行迭代,并在与您搜索的u8
进行比较时进行投射:
let a: u8 = 4;
for num in 0..256 {
if (num as u8) == a {
println!("match found");
break;
}
}
在这种特殊情况下,您也可以使用a half-open range:
let a: u8 = 4;
for num in 0.. {
if num == a {
println!("match found");
break;
}
}
当我执行此操作时,程序会跳过for循环。
256的二进制表示是1_0000_0000
。 u8
仅保存最右边的8位,因此仅0
s。因此0..256u8
相当于0..0
,当然这是一个空范围。
答案 1 :(得分:4)
您可以组合迭代器来创建完整的u8
范围:
use std::iter::once;
for i in (0..255).chain(once(255)){
//...
}
在夜间Rust中,您可以使用inclusive range:
#![feature(inclusive_range_syntax)]
for i in 0...255 {
//...
}
答案 2 :(得分:0)
我认为你正在比较不同的类型,所以需要施展。试试这个:
for num in 0..256 {
let y = num as u8;
if y == a {
println!("found");
break;
}
}