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