【在主画面加入捷径】
       
【选择语系】
繁中 简中

Rust 程序设计教学:运算符 (Operator)

【赞助商连结】

    本章介绍运算符,这些运算符是 Rust 中实际执行工作的基础元件。运算符间可相互组合,达到更复杂的效果。

    Rust 包括以下运算符:

    • 代数运算符
    • 二元运算符
    • 比较运算符
    • 布林运算符
    • 转型运算符
    • 指派运算符
    • 复合指派运算符
    • 其他运算符

    本章将逐一介绍这些运算符。

    代数运算符

    包括加 +、减 -、乘 *、除 /、取余数 % 等运算符。见下例:

    在本例中,我们使用 assert_eq! 代替 println!,这个函式在程序两边不相等时会引发错误,好处是由程序替我们检查值是否正确,而不需人工确认。本书中部分代码会使用这种风格来表示。

    然而,由于电脑的限制,浮点数在电脑内的表示是不精确的。例如,0.3 - 0.2 的结果 不会刚好是 0.1 而有一个微小的误差。见以下范例:

    本程序引发了以下错误,表示浮点数的运算是不精确的:

    比较好的方法,是比较两数相减的误差值,当误差值的绝对值够小时,表示条件成立。见以下范例:

    本程序即可顺利执行。在本程序中,我们使用 assert!,这个函式在其内条件式不为真时引发错误,使用方式类似 assert_eq!

    二元运算符

    包括 bitwise AND &、bitwise inclusive OR |、bitwise exclusive OR ^、左移 <<、右移 >> 等运算符。Bitwise 运算是以二进位数来运算,和平常使用的十进位数不同,有兴趣的读者可参考计算机概论等相关书籍。

    比较运算符

    对于支援的类型,也可比较其大小。包括等于 ==、不等于 !=、大于 >、小于 <、大于等于 >=、小于等于 <= 等运算符。

    布林运算符

    布林运算符是用来结合两个以上的条件式,包括 AND &&、OR || 、NOT ! 等。

    AND 运算遵守以下逻辑:

    pqResult
    truetruetrue
    truefalsefalse
    falsetruefalse
    falsefalsefalse

    OR 运算遵守以下逻辑:

    pqResult
    truetruetrue
    truefalsetrue
    falsetruetrue
    falsefalsefalse

    NOT 运算遵守以下逻辑:

    pResult
    truefalse
    falsetrue

    如果觉得记上述表格很困难,只要记得「所有条件为真时,AND 才为真;只要有条件为真时,OR 即为真」。结合上述基本逻辑,可撰写更复杂的条件叙述。以下为范例:

    转型运算符

    转型运算符 as 是用来转换数据的类型。由于 Rust 的安全设计,不能直接用整数和浮点数相互运算,而要透过明确的转型,这和大部分的程序语言不同。下列程序看似正确:

    本程序却引发了以下错误:

    这个错误讯息,包含一个新的概念。在 Rust,运算符是透过 trait 的机制来达成,若没有实现相关的 trait,则无法进行相关的运算。我们会在后续的章节介绍 trait。

    我们将程序改写如下:

    经过转型,本程序为 f64 类型间的运算,即可正确执行。

    指派运算符

    我们已经在前一章看过指派运算符 = 了,在声明变量时通常也会一并赋值。

    注意:不要将指派运算符 = 和相等运算符 == 搞混。

    复合指派运算符

    复合指派运算符是将代数运算符或二元运子算以及指派运算符合并,简化程序代码。例如,以下程序代码:

    可以简化为:

    其他运算符

    这里列出其他笔者未提到的运算符:

    • 负号运算符 -:将数字的正负号反转
    • 解参考运算符 *:得到参考所指向的值
    • 参考运算符 & 和 & mut:得到某个值的参考

    我们会在后续的章节讨论参考 (reference)。

    注:Rust 的参考类似 C/C++ 的指针。

    运算符优先级

    Rust 运算符的优先级,由高至低,如下:

    笔者不会刻意去记运算符的优先级。只要在程序代码中减少过度复杂的叙述,即可减少因运算符优先级造成的混淆。如果某些叙述较复杂,用中括号 () 将运算优先级提高即可。

    【赞助商连结】
    TAGS: OPERATOR, RUST