前言
运算符与表达式 —— 构建高效代码的基石
在编程中,运算符与表达式是编写逻辑和执行计算的核心工具。它们就像是程序员手中的画笔,通过简洁而有力的操作,描绘出复杂而精妙的应用程序。掌握运算符和表达式的使用是编写高效、简洁且易于维护代码的关键。
操千曲而后晓声,观千剑而后识器。虐它千百遍方能通晓其真意。
一、算术运算符
算术运算符用于执行基本的数学计算。它连接两个数字进行运算,返回数值结果:
void main() {
// 加法运算,结果为8
print(5 + 3);
// 减法运算,结果为2
print(5 - 3);
// 乘法运算,结果为15
print(5 * 3);
// 除法运算,两个数相除,返回结果为double类型的值,取16位有效数字进行四舍五入,结果为1.6666666666666667
print(5 / 3);
// 整除运算,两个数相除,返回结果为int类型的值,取整数部分的值,结果为1
print(5 ~/ 3);
// 取模运算,求两个数相除后的余数,结果为2
print(5 % 3);
}
二、赋值运算符
赋值运算符用于将值赋给变量。除了简单的赋值运算符 = 外,Dart 还支持复合赋值运算符,结合了算术运算符和赋值运算符的功能。
// 简单赋值
num a = 5;
// 加法赋值,相当于 a = a + 3; 结果为 8
a += 3;
// 减法赋值,相当于 a = a - 2; 结果为 6
a -= 2;
// 乘法赋值,相当于 a = a * 4; 结果为 24
a *= 4;
// 除法赋值,相当于 a = a / 2; 结果为 12.0
a /= 2;
// 整除赋值,相当于 a = a ~/ 3; 结果为 4
a ~/= 3;
// 取模赋值,相当于 a = a % 3; 结果为 1
a %= 3;
三、比较运算符
比较运算符用于比较两个值,并返回一个布尔值 (true 或 false):
void main() {
// 大于运算,结果为true
print(5 > 3);
// 小于运算,结果为false
print(5 < 3);
// 等于运算,结果为false
print(5 == 3);
// 不等于运算,结果为tue
print(5 != 3);
// 大于等于运算,检测左边的值是否大于或等于右边的值,结果为true
print(5 >= 3);
// 小于等于运算,检测左边的值是否小于或等于右边的值,结果为false
print(5 <= 3);
}
四、逻辑运算符
逻辑运算符用于组合多个布尔表达式,并返回一个新的布尔值:
void main() {
// 逻辑与运算,结果为true
print((5 > 3) && (3 < 5));
// 逻辑或运算,结果为true
print((5 > 3) || (3 < 5));
// 逻辑非运算,结果为false
print(!(5 > 3));
}
短路评估:在使用 && 和 || 时,如果左侧表达式已经决定了最终结果,则右侧表达式不会被评估,这有助于提高性能并避免潜在错误。
五、自增自减运算符
自增自减运算符用于对变量进行快速的加一或减一操作:
// 前缀自增:先增加变量的值,再使用新的值
int x = 5;
print(++x); // 输出: 6
// 前缀自减:先减少变量的值,再使用新的值
int a = 5;
print(--a); // 输出: 4
// 后缀自增:先使用当前的值,再增加变量的值
int y = 5;
print(y++); // 输出: 5
print(y); // 输出: 6
// 后缀自减:先使用当前的值,再减少变量的值
int b = 5;
print(b--); // 输出: 5
print(b); // 输出: 4
六、空感知运算符
Dart 引入了一些特殊的运算符来处理空值,以提高代码的安全性和简洁性:
6.1、空合并运算符 (??)
- 如果左侧表达式为
null,则使用右侧表达式的值。 - 示例:String name = userName ?? "Guest";
6.2、空感知赋值运算符 (??=)
- 如果左侧变量为
null,则将其赋值为右侧表达式的值。 - 示例:userName ??= "Guest";
6.3、空感知方法调用 (?.)
- 如果左侧表达式为
null,则不会调用方法,并返回null。 - 示例:user?.getName();
七、级联运算符(..)
级联运算符允许你在同一个对象上连续调用多个方法或访问属性,而不需要重复对象名。这对于简化链式调用非常有用:
var person = Person()
..name = 'Alice'
..age = 30
..printInfo();
八、特殊运算符
8.1、类型测试运算符 (is 和 is!)
- 用于
检查对象的类型。 - 示例:if (object is String) { ... };
8.2、级联赋值运算符 (=)
- 可以
同时赋值给多个变量。 - 示例:int a = b = c = 5;
九、表达式
表达式是产生值的代码片段。它可以是一个简单的值、一个变量、一个函数调用,或者是包含运算符的一段代码。
9.1、简单表达式
- 直接给出
一个值或变量。 - 示例:5, "Hello", true
9.2、复杂表达式
包含运算符和其他表达式。- 示例:5 + 3, x * y, name.length
9.3、条件表达式(三元运算符)
根据条件选择不同的值。- 示例:
int age = 20;
String message = (age >= 18) ? "Adult" : "Minor";
print(message); // 输出: Adult
9.4、箭头函数
简化函数定义,适用于简短的函数体(一条语句)。
- 示例:void greet(String name) => print("Hello, $name!");
十、总结
为什么运算符和表达式如此重要?
- 简化逻辑:运算符帮助我们快速实现数学计算、比较和逻辑判断,使得代码更加简洁明了。
- 提高效率:通过合理使用表达式,我们可以减少冗余代码,提升程序的运行效率。
- 增强可读性:清晰的运算符和表达式结构让代码更易读,便于团队协作和后续维护。
- 支持高级特性:
Dart提供了许多独特的运算符(如空感知运算符)和表达式语法(如级联运算符),使代码更具表现力和灵活性。
通过深入理解Dart的运算符与表达式,有助于编写更加高效、简洁且易于维护的代码。无论是进行数值计算、条件判断还是对象操作,Dart 提供了丰富的工具来帮助我们实现复杂的逻辑。掌握这些内容不仅提升了我们的编程技能,还为我们开发高质量的应用提供了坚实的基础。
码字不易,记得 关注 + 点赞 + 收藏 + 评论