字面量:程式碼裡直接寫出來、一眼就能看出值的常數資料,是程式中最基礎的資料表達形式。
值固定不變,寫死在程式碼裡,執行中不會改變; 不需要計算、不用變數解析,直白來講就是「字面上的值」。
舉例:下面的13 ,3.14 就是字面量,其他語言也稱字面值。
fn main() {
println!("{}", 13);
println!("{}", 3.14);
}Code language: JavaScript (javascript)
為了方便學習,官方提供線上的rust編輯工具,讀者可以不用安裝本機環境,就能在上面練習這些rust的基礎語法。點擊下方連結
字面量
Rust 支援整數、浮點數、字元、字串、布林值、單元(unit )型別這幾種類型的字面量。
- 整數:
11 - 字元:
'a'(單引號) - 字串:
"abc"(雙引號) - 布林:
true/false - 單元型別:
()
整數多種進位寫法
透過前綴區分進位,僅適用於整數:
- 十六進位:
0x開頭,例:0x1F - 八進位:
0o開頭,例:0o77 - 二進位:
0b開頭,例:0b1010
數字分隔符
數值字面量當中可以插入底線 _ 提升可讀性,不會影響實際數值:
- 整數:
1_000=1000 - 浮點數:
0.000_001=0.000001
科學記數法
浮點數支援科學 E 表示法,預設型別為 f64:
1e6= 10000007.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,結果即為 1 - 位元互斥或
^:同位元數值不同則為 1,相同則為 0 - 左移
<<:二進位數整體往左移(等同乘以2ⁿ) - 右移
>>:二進位數整體往右移(等同除以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)
三、程式執行補充說明
- 把
1i32替換成1u32執行減法1u32 - 2會報錯:無符號整數無法表達負數。 {:04b}:格式化輸出語法,b代表二進位,04代表位數不足 4 位時左側補 0。- 數值很大時建議用底線隔開(例如
1_000_000u32),程式碼閱讀起來更清楚。