迭代 u8 的所有值时出现文字超出范围警告

Ste*_*eve 4 rust

据我了解,循环中的范围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范围。这是对的吗?还有其他方法给出范围吗?

aSp*_*pex 6

您可以组合迭代器来创建全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)


Luk*_*odt 5

正如 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_0000u8只保存最右边的 8 位,所以只保存0s。因此0..256u8相当于0..0,这当然是一个空范围。