Rust 中的绝对值函数



在这个基本的 Rust 程序中,函数计算整数的绝对值,main() 帮助完成一个语句,结果是:

fn main() {
let value = abs(-4);
println!("{}.", value);
}
fn abs(x: i32) -> i32 {
print!("The abs value of {} is ", x);
if x > 0 {
return x;
} else {
-x
}
}

有没有办法正确打印整个语句"abs 值...是..."进入 abs() 函数?我尝试过不成功

println!("The abs value of {} is {} ", x, x);

这总是打印 x 参数的值(例如 -4、-4),所以它不正确。

并与

println!("The abs value of {} is {} ", x, abs(x));

但是在这里,出于某种原因,Rust 对递归不满意,在编译时发出警告,然后不运行程序。

尝试此操作以避免递归:

fn main() {
let value = abs(-4);
println!("{}.", value);
}
fn abs(x: i32) -> i32 {
let y = if x >= 0 { x } else { -x };
println!("The abs value of {} is {} ", x, y);
y
}

输出:

The abs value of -4 is 4
4.

基元类型有内置的.abs()方法,例如 i8, i16, i32, i64, i128, f32, 和 f64:

assert_eq!(10i32.abs(), 10);
assert_eq!((-10i32).abs(), 10);

溢出行为

i32::min_value()的绝对值不能表示为i32,尝试计算它会导致溢出。这 意味着调试模式下的代码将在这种情况下触发恐慌,并且 优化的代码将返回i32::min_value()而不会惊慌失措。

以下代码将在调试模式下死机(并在发布模式下返回-128):

fn main() {
let a = -128_i8;
println!("{}", a); // -128
let b = a.abs();
println!("{}", b); // -128
}

由于abs(-2_147_483_648_i32)2_147_483_648_u32,您可以返回u32而不是i32

fn abs(x: i32) -> u32 {
if x >= 0 {
x as u32
} else if x == std::i32::MIN {
2_147_483_648_u32
} else {
-x as u32
}
}
fn main() {
let value = abs(std::i32::MIN); // i32::min_value() // -2_147_483_648i32
println!("{}.", value); // 2147483648
}

输出:

2147483648

绝对值方法已经定义;你不需要自己实现它

fn main() {
let value = abs(-4);
println!("{}.", value);
}
fn abs(x: i32) -> i32 {
let val = x.abs();
println!("The abs value of {} is {}", x, val);
val
}

最新更新