MST
星途 面试题库

面试题:Rust自定义类型与运算符优先级和结合性的交互

定义一个Rust结构体 `MyNumber`,包含一个 `i32` 类型的字段。为 `MyNumber` 实现加法 `+`、乘法 `*` 运算符的重载。然后编写一个函数,该函数接收两个 `MyNumber` 类型的参数,在函数体内使用这两个自定义类型进行复杂运算,如 `a * b + a`,其中 `a` 和 `b` 为 `MyNumber` 类型。请确保在实现和运算过程中正确遵循Rust运算符的优先级与结合性规则,同时解释在这种自定义类型场景下,运算符优先级和结合性是如何生效的。
35.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义结构体
struct MyNumber {
    value: i32,
}

// 实现加法运算符重载
impl std::ops::Add for MyNumber {
    type Output = MyNumber;
    fn add(self, other: MyNumber) -> MyNumber {
        MyNumber { value: self.value + other.value }
    }
}

// 实现乘法运算符重载
impl std::ops::Mul for MyNumber {
    type Output = MyNumber;
    fn mul(self, other: MyNumber) -> MyNumber {
        MyNumber { value: self.value * other.value }
    }
}

// 定义复杂运算函数
fn complex_operation(a: MyNumber, b: MyNumber) -> MyNumber {
    a * b + a
}

在Rust中,自定义类型的运算符优先级和结合性遵循与原生类型相同的规则。乘法 * 运算符优先级高于加法 + 运算符,因此在 a * b + a 这样的表达式中,会先计算 a * b,然后再将结果与 a 进行加法运算。这是因为Rust的语法设计就是如此,就像原生的 i32 类型在进行类似运算时也遵循这个优先级规则。结合性方面,乘法和加法都是左结合,意味着如果有多个相同优先级的运算符(如 a + b + ca * b * c),会从左到右依次计算。