Appearance
第4章:Dart 运算符与表达式
4.1 算术运算符
算术运算符用于执行基本的数学运算:
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | 1 + 2 = 3 |
- | 减法 | 5 - 3 = 2 |
* | 乘法 | 2 * 3 = 6 |
/ | 除法 | 6 / 2 = 3.0 |
% | 取模(余数) | 7 % 3 = 1 |
++ | 自增 | a++ 或 ++a |
-- | 自减 | a-- 或 --a |
示例:
dart
void main() {
int a = 10;
int b = 3;
print('a + b = ${a + b}'); // 13
print('a - b = ${a - b}'); // 7
print('a * b = ${a * b}'); // 30
print('a / b = ${a / b}'); // 3.3333333333333335
print('a % b = ${a % b}'); // 1
// 自增自减
int c = 5;
print('c++ = ${c++}'); // 5(先使用后自增)
print('c = $c'); // 6
int d = 5;
print('++d = ${++d}'); // 6(先自增后使用)
print('d = $d'); // 6
}4.2 赋值运算符
赋值运算符用于给变量赋值:
| 运算符 | 描述 | 示例 |
|---|---|---|
= | 简单赋值 | a = 5 |
+= | 加法赋值 | a += 5 等同于 a = a + 5 |
-= | 减法赋值 | a -= 5 等同于 a = a - 5 |
*= | 乘法赋值 | a *= 5 等同于 a = a * 5 |
/= | 除法赋值 | a /= 5 等同于 a = a / 5 |
%= | 取模赋值 | a %= 5 等同于 a = a % 5 |
示例:
dart
void main() {
int a = 10;
print('初始值: a = $a'); // 10
a += 5;
print('a += 5: a = $a'); // 15
a -= 3;
print('a -= 3: a = $a'); // 12
a *= 2;
print('a *= 2: a = $a'); // 24
a /= 4;
print('a /= 4: a = $a'); // 6.0
int b = 10;
b %= 3;
print('b %= 3: b = $b'); // 1
}4.3 比较运算符
比较运算符用于比较两个值:
| 运算符 | 描述 | 示例 |
|---|---|---|
== | 等于 | a == b |
!= | 不等于 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
注意:在 Dart 中,== 运算符会比较对象的内容,而 identical() 函数会比较对象的身份(即是否是同一个对象)。
示例:
dart
void main() {
int a = 5;
int b = 10;
print('a == b: ${a == b}'); // false
print('a != b: ${a != b}'); // true
print('a > b: ${a > b}'); // false
print('a < b: ${a < b}'); // true
print('a >= b: ${a >= b}'); // false
print('a <= b: ${a <= b}'); // true
// 比较对象
String str1 = 'Dart';
String str2 = 'Dart';
String str3 = new String.fromCharCodes(str1.runes);
print('str1 == str2: ${str1 == str2}'); // true(内容相同)
print('identical(str1, str2): ${identical(str1, str2)}'); // true(字符串常量池)
print('str1 == str3: ${str1 == str3}'); // true(内容相同)
print('identical(str1, str3): ${identical(str1, str3)}'); // false(不同对象)
}4.4 逻辑运算符
逻辑运算符用于组合布尔表达式:
| 运算符 | 描述 | 示例 |
|---|---|---|
&& | 逻辑与 | a && b(两个条件都为真才为真) |
| ` | ` | |
! | 逻辑非 | !a(取反) |
示例:
dart
void main() {
bool isTrue = true;
bool isFalse = false;
print('isTrue && isFalse: ${isTrue && isFalse}'); // false
print('isTrue || isFalse: ${isTrue || isFalse}'); // true
print('!isTrue: ${!isTrue}'); // false
print('!isFalse: ${!isFalse}'); // true
// 组合使用
int age = 18;
bool hasID = true;
if (age >= 18 && hasID) {
print('可以进入');
} else {
print('不能进入');
}
}4.5 条件运算符
三目运算符
语法:condition ? expr1 : expr2
描述:如果条件为真,执行 expr1,否则执行 expr2。
示例:
dart
void main() {
int age = 18;
String message = age >= 18 ? '成年人' : '未成年人';
print(message); // 成年人
}空判断运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
?? | 空值合并运算符 | a ?? b(如果 a 不为 null,返回 a,否则返回 b) |
??= | 空值赋值运算符 | a ??= b(如果 a 为 null,将 b 赋值给 a) |
?. | 可选链运算符 | a?.b(如果 a 不为 null,访问 a.b,否则返回 null) |
示例:
dart
void main() {
// ?? 运算符
String? name = null;
String displayName = name ?? '匿名用户';
print(displayName); // 匿名用户
// ??= 运算符
String? username = null;
username ??= 'guest';
print(username); // guest
// 可选链运算符
class Person {
String? name;
int? age;
}
Person? person = null;
print(person?.name); // null(不会报错)
person = Person();
print(person?.name); // null
person.name = 'John';
print(person?.name); // John
}4.6 表达式与运算符优先级
Dart 中的运算符优先级从高到低排列如下:
- 括号
() - 自增/自减
++,-- - 一元运算符
!,- - 乘法/除法/取模
*,/,% - 加法/减法
+,- - 比较运算符
>,<,>=,<= - 等于运算符
==,!= - 逻辑与
&& - 逻辑或
|| - 条件运算符
?: - 赋值运算符
=,+=,-=,*=,/=,%=
示例:
dart
void main() {
// 优先级示例
int a = 10;
int b = 5;
int c = 2;
// 先计算乘法,再计算加法
int result1 = a + b * c;
print('a + b * c = $result1'); // 20
// 使用括号改变优先级
int result2 = (a + b) * c;
print('(a + b) * c = $result2'); // 30
// 逻辑运算符优先级
bool x = true;
bool y = false;
bool z = true;
// 先计算 &&,再计算 ||
bool result3 = x || y && z;
print('x || y && z = $result3'); // true
// 使用括号改变优先级
bool result4 = (x || y) && z;
print('(x || y) && z = $result4'); // true
}4.7 实操案例
结合运算符实现简单计算、条件判断:
dart
void main() {
// 计算圆的面积
const double pi = 3.14159;
double radius = 5.0;
double area = pi * radius * radius;
print('圆的面积: $area');
// 计算矩形的周长
double length = 10.0;
double width = 6.0;
double perimeter = 2 * (length + width);
print('矩形的周长: $perimeter');
// 判断成绩等级
int score = 85;
String grade;
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else if (score >= 60) {
grade = 'D';
} else {
grade = 'F';
}
print('成绩: $score, 等级: $grade');
// 使用三目运算符
String result = score >= 60 ? '及格' : '不及格';
print('结果: $result');
// 计算两个数的最大值
int num1 = 25;
int num2 = 36;
int max = num1 > num2 ? num1 : num2;
print('最大值: $max');
}运行结果:
圆的面积: 78.53975
矩形的周长: 32.0
成绩: 85, 等级: B
结果: 及格
最大值: 36