字面量與運算子

字面量:程式碼裡直接寫出來、一眼就能看出值的常數資料,是程式中最基礎的資料表達形式。

值固定不變,寫死在程式碼裡,執行中不會改變; 不需要計算、不用變數解析,直白來講就是「字面上的值」。

舉例:下面的13 ,3.14 就是字面量,其他語言也稱字面值。

fn main() {
    println!("{}", 13);
    println!("{}", 3.14);
}Code language: JavaScript (javascript)

為了方便學習,官方提供線上的rust編輯工具,讀者可以不用安裝本機環境,就能在上面練習這些rust的基礎語法。點擊下方連結

Rust Playground

字面量

Rust 支援整數、浮點數、字元、字串、布林值、單元(unit )型別這幾種類型的字面量。

  • 整數:11
  • 字元:'a'(單引號)
  • 字串:"abc"(雙引號)
  • 布林:true / false
  • 單元型別:()

整數多種進位寫法

透過前綴區分進位,僅適用於整數:

  • 十六進位:0x 開頭,例:0x1F
  • 八進位:0o 開頭,例:0o77
  • 二進位:0b 開頭,例:0b1010

數字分隔符

數值字面量當中可以插入底線 _ 提升可讀性,不會影響實際數值

  • 整數:1_000 = 1000
  • 浮點數:0.000_001 = 0.000001

科學記數法

浮點數支援科學 E 表示法,預設型別為 f64

  • 1e6 = 1000000
  • 7.6e-4 = 0.00076

字面量型別後綴(重點)

Rust 需要明確標註字面量型別,常用後綴如下:

  • u32:32 位元無符號整數(只能非負數)
  • i32:32 位元有符號整數(正負數皆可)

提醒:有符號、無符號整數不能混用運算,程式會直接報錯。

範例:

fn main() {
    // 1. 一般整數字面量
    println!("整數: {}", 13);
    // 二進位、八進位、十六進位整數
    println!("二進位: {}", 0b1010);
    println!("八進位: {}", 0o77);
    println!("十六進位: {}", 0x2A);
    // 帶分隔符的整數(提升閱讀體驗)
    println!("帶底線整數: {}", 1_000_000);
    // 標註型別後綴的整數
    println!("u32無符號整數: {}", 100u32);
    println!("i32有符號整數: {}", -50i32);

    // 2. 浮點數字面量
    println!("浮點數: {}", 3.14);
    // 帶底線浮點數
    println!("帶底線浮點數: {}", 0.000_001);
    // 科學記數法浮點數
    println!("科學記數法: {}", 1e6);
    println!("負數科學記數法: {}", 7.6e-4);

    // 3. 字串字面量(雙引號)
    println!("字串: {}", "hello world");

    // 4. 字元字面量(單引號,只能單一個字元)
    println!("字元: {}", 'a');
    println!("中文字元: {}", '中');

    // 5. 布林字面量
    println!("布林true: {}", true);
    println!("布林false: {}", false);

    // 6. 單元字面量 () (Rust 單元型別)
    println!("單元型別: {:?}", ());
}Code language: JavaScript (javascript)

運算子

Rust 運算子的規則、優先順序跟類C語言大致相同。

1. 算術運算子

加減這類基礎數值運算,搭配整數型別後綴使用:

  • 加法:+
  • 減法:-

2. 布林邏輯運算子(短路邏輯)

僅能作用在布林值 true/false

  • &&:兩側條件都為 true,結果才會是 true
  • ||:任一側為 true,結果即為 true
  • !:取相反值
運算式 運算結果
true && true true
true && false false
false && true false
false && false false
true || true true
true || false true
false || true true
false || false false
!true false
!false true

3. 位元運算(操作二進位位元)

多半用在整數,範例使用 {:04b} 格式化輸出4 位元二進位

  1. 位元且 &:同位元皆為 1,運算結果才是 1
  2. 位元或 |:同位元只要有一個 1,結果即為 1
  3. 位元互斥或 ^:同位元數值不同則為 1,相同則為 0
  4. 左移 <<:二進位數整體往左移(等同乘以2ⁿ)
  5. 右移 >>:二進位數整體往右移(等同除以2ⁿ)
  0 0 1 1
& 0 1 0 1
-----------
  0 0 0 1  

  0 0 1 1
| 0 1 0 1
-----------
  0 1 1 1

  0 0 1 1
^ 0 1 0 1
-----------
  0 1 1 0

左移 <<
二進位:00000001
左移 5 位 → 00100000,結果 = 32

右移 >>
0x80 二進位:10000000
右移 2 位 → 00100000(十六進位 0x20),結果 = 32
fn main() {
    // ========== 算術運算子 ==========
    // 整數加法:u32 32位元無符號整數
    // 執行結果:1 + 2 = 3
    println!("1 + 2 = {}", 1u32 + 2);

    // 整數減法:i32 32位元有符號整數,可存放負數
    // 如果改成 1u32 會報錯,無符號整數無法表達負數
    // 執行結果:1 - 2 = -1
    println!("1 - 2 = {}", 1i32 - 2);

    // ========== 浮點數字面量 - 科學記數法 ==========
    // 執行結果:1e4 是 10000, -2.5e-3 是 -0.0025
    println!("1e4 是 {}, -2.5e-3 是 {}", 1e4, -2.5e-3);

    // ========== 布林邏輯運算子(短路運算) ==========
    // 邏輯且 &&:兩側同時為 true 結果才為 true
    // 執行結果:true 且 false = false
    println!("true 且 false = {}", true && false);

    // 邏輯或 ||:任一側為 true 結果就為 true
    // 執行結果:true 或 false = true
    println!("true 或 false = {}", true || false);

    // 邏輯非 !:對布林值取反
    // 執行結果:非 true = false
    println!("非 true = {}", !true);

    // ========== 位元運算子(操作二進位位元) ==========
    // {:04b} 固定輸出4位元二進位,位數不足左側補0
    // 位元且 &:同位元都為1結果才為1
    // 執行結果:0011 位元且 0101 = 0001
    println!("0011 位元且 0101 = {:04b}", 0b0011u32 & 0b0101);

    // 位元或 |:同位元任一為1結果就為1
    // 執行結果:0011 位元或 0101 = 0111
    println!("0011 位元或 0101 = {:04b}", 0b0011u32 | 0b0101);

    // 位元互斥或 ^:同位元不同則為1,相同則為0
    // 執行結果:0011 位元互斥或 0101 = 0110
    println!("0011 位元互斥或 0101 = {:04b}", 0b0011u32 ^ 0b0101);

    // 左移 <<:二進位整體左移5位元
    // 執行結果:1 左移 5 位 = 32
    println!("1 左移 5 位 = {}", 1u32 << 5);

    // 右移 >>:二進位整體右移2位元,{:x} 輸出十六進位
    // 執行結果:0x80 右移 2 位 = 0x20
    println!("0x80 右移 2 位 = 0x{:x}", 0x80u32 >> 2);

    // ========== 數字分隔符 _ ==========
    // 底線只單純提升可讀性,不會改變數值
    // 執行結果:一百萬寫作:1000000
    println!("一百萬寫作:{}", 1_000_000u32);
}Code language: JavaScript (javascript)

三、程式執行補充說明

  1. 1i32 替換成 1u32 執行減法 1u32 - 2 會報錯:無符號整數無法表達負數。
  2. {:04b}:格式化輸出語法,b 代表二進位,04 代表位數不足 4 位時左側補 0。
  3. 數值很大時建議用底線隔開(例如 1_000_000u32),程式碼閱讀起來更清楚。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *