系统化掌握Dart编程之运算符与表达式

379 阅读5分钟

image.png

前言

运算符与表达式 —— 构建高效代码的基石

在编程中,运算符与表达式编写逻辑执行计算的核心工具。它们就像是程序员手中的画笔,通过简洁而有力的操作,描绘出复杂而精妙的应用程序。掌握运算符和表达式的使用是编写高效简洁且易于维护代码的关键。

千曲而后晓声,观千剑而后识器。虐它千百遍方能通晓其真意

一、算术运算符

算术运算符用于执行基本的数学计算。它连接两个数字进行运算,返回数值结果:

image.png

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 还支持复合赋值运算符,结合了算术运算符和赋值运算符的功能。 image.png

// 简单赋值
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; 

三、比较运算符

比较运算符用于比较两个值,并返回一个布尔值 (truefalse):

image.png

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);
}

四、逻辑运算符

逻辑运算符用于组合多个布尔表达式,并返回一个新的布尔值image.png

void main() {
  // 逻辑与运算,结果为true
  print((5 > 3) && (3 < 5));
  // 逻辑或运算,结果为true
  print((5 > 3) || (3 < 5));
  // 逻辑非运算,结果为false
  print(!(5 > 3));
}

短路评估:在使用 &&|| 时,如果左侧表达式已经决定了最终结果,则右侧表达式不会被评估,这有助于提高性能并避免潜在错误。

五、自增自减运算符

自增自减运算符用于对变量进行快速的加一减一操作:

image.png

// 前缀自增:先增加变量的值,再使用新的值
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 提供了丰富的工具来帮助我们实现复杂的逻辑。掌握这些内容不仅提升了我们的编程技能,还为我们开发高质量的应用提供了坚实的基础

码字不易,记得 关注 + 点赞 + 收藏 + 评论