算術操作符
- 加法(+):計算兩個操作數的和
- 減法(-):計算兩個操作數的差
- 乘法(*):計算兩個操作數的乘積
- 除法 (/):計算兩個操作數的商,返回一個雙精度浮點數(double)
- 整除(~/): 計算兩個操作數的商,返回一個整數(int)
- 取模(%):計算兩個操作數的余數
void main() {
int a = 10;
int b = 3;
print(a + b); // 13
print(a - b); // 7
print(a * b); // 30
print(a / b); // 3.3333333333333335
print(a ~/ b); // 3
print(a % b); // 1
}
關系操作符
- 等于(==):檢查兩個操作數是否相等
- 不等于(!=): 檢查兩個操作數是否不相等
- 大于(>): 檢查左側操作數是否大于右側操作數
- 小于(<): 檢查左側操作數是否小于右側操作數
- 大于等于(>=): 檢查左側操作數是否大于等于右側操作數
- 小于等于(<=): 檢查左側操作數是否小于或等于右側操作數
void main() {
int a = 10;
int b = 3;
print(a == b); // false
print(a != b); // true
print(a > b); // true
print(a < b); // false
print(a >= b); // true
print(a <= b); // false
}
類型判斷操作符
- 類型測試(is): 檢查對象是否是某個類型的實例
- 非類型測試(is !): 檢查對象是否不是某個類型的實例
void main() {
var x = 'Hello, Dart';
print(x is String); // true
print(x is! int); // true
}
賦值操作符
- 簡單賦值(=):將右操作數的值賦值給左操作數
- 復合賦值(+=、-=、*=、/=、~/=、%=):進行運算并且將結果賦值為左操作數
void main() {
double a = 10.0;
a /= 4; // 相當于 a = a / 4;
print(a); // 輸出: 2.5
}
void main() {
double a = 10.0;
a /= 4; // 相當于 a = a / 4;
print(a); // 輸出: 2.5
}
void main() {
int a = 10;
a %= 4; // 相當于 a = a % 4;
print(a); // 輸出: 2
}
邏輯操作符
- 邏輯與(&&):如果兩個操作數都為 true 則返回 true
- 邏輯或(||):如果兩個操作數中至少有一個為 true,則返回 true
- 邏輯非(!): 返回操作數的布爾值的相反值
void main() {
bool a = true;
bool b = false;
print(a && b); // false
print(a || b); // true
print(!a); // false
}
條件操作符
- 條件表達式(?:): 如果條件為 true 返回第一個值,否則返回第二個值
- 如果為空(??):如果左操作數為 null ,則返回右操作數
void main() {
int a = 10;
int b = 5;
var result = a > b ? 'a is greater' : 'b is greater';
print(result); // a is greater
String? name;
print(name ?? 'Guest'); // Guest
}
位操作符
- 按位與(&):對兩個操作數的每一位執行與操作
- 按位或(|):對兩個操作數的每一位執行或操作
- 按位異或(^):對兩個操作數的每一位執行異或操作
- 按位取反 (~): 對操作數的每一位執行取反操作。
- 左移 (<<): 將左操作數的二進制表示向左移位。
- 右移 (>>): 將左操作數的二進制表示向右移位。
void main() {
int a = 5; // 0101
int b = 3; // 0011
print(a & b); // 1 (0001)
print(a | b); // 7 (0111)
print(a ^ b); // 6 (0110)
print(~a); // -6 (二進制表示:..11111010)
print(a << 1); // 10 (1010)
print(a >> 1); // 2 (0010)
}
按位與:按位與操作對兩個操作數的每一位執行與操作。只有兩個操作數對應的位都是1時,結果才是1,否則是0。
void main() {
int a = 12; // 二進制: 1100
int b = 5; // 二進制: 0101
int result = a & b; // 二進制: 0100 (十進制: 4)
print(result); // 輸出: 4
}
按位或:按位或操作對兩個操作數的每一位執行或操作。只要兩個操作數對應的位有一個是1,結果就是1。
void main() {
int a = 12; // 二進制: 1100
int b = 5; // 二進制: 0101
int result = a | b; // 二進制: 1101 (十進制: 13)
print(result); // 輸出: 13
}
按位異或:按位異或操作對兩個操作數的每一位執行異或操作。只有兩個操作數對應的位不同,結果才是1,否則是0。
void main() {
int a = 12; // 二進制: 1100
int b = 5; // 二進制: 0101
int result = a ^ b; // 二進制: 1001 (十進制: 9)
print(result); // 輸出: 9
}
按位取反:按位取反操作對操作數的每一位執行取反操作。0變成1,1變成0。
void main() {
int a = 12; // 二進制: 1100
int result = ~a; // 二進制: 0011 (在Dart中,這個會顯示為補碼)
print(result); // 輸出: -13 (在補碼表示中,~1100 為 0011,結果為 -13)
}
左移:左移操作將左操作數的二進制表示向左移位,右側補0
void main() {
int a = 3; // 二進制: 0011
int result = a << 2; // 二進制: 1100 (十進制: 12)
print(result); // 輸出: 12
}
右移:右移操作將左操作數的二進制表示向右移位,左側補0(如果是有符號整數則根據符號位填充)。
void main() {
int a = 12; // 二進制: 1100
int result = a >> 2; // 二進制: 0011 (十進制: 3)
print(result); // 輸出: 3
}
其他操作符
- 成員訪問(.): 訪問對象的成員
- 條件成員訪問(?.):安全的訪問對象的成員,如果對象為null,則返回 null
- 類型轉換(as):將對象轉換為指定的類型
void main() {
var list = [1, 2, 3];
print(list.length); // 3
int? num;
print(num?.isEven); // null
var x = 'Hello' as Object;
print(x is String); // true
}
as 操作符用于類型轉換,但是它不會改變對象的實際類型,它只是告訴編譯器在特定的上下文中將對象視為特定的類型
void main() {
var x = 'Hello' as Object; // 將字符串 'Hello' 視為 Object 類型
print(x.runtimeType); // 輸出: String
print(x is Object); // 輸出: true
print(x is String); // 輸出: true
// 即使我們將 x 視為 Object,它仍然保持 String 類型
Object y = x; // 這在實際上沒有改變對象的類型
print(y.runtimeType); // 輸出: String
print(y is Object); // 輸出: true
print(y is String); // 輸出: true
}