Dart 之运算符与表达式

262 阅读4分钟

Dart 之运算符与表达式.png

1、运算符

1.1 算术运算符

对数学中加、减、乘、除、取余的实现。

Dart中的算术运算符:

算术运算符.png

示例:

void main() {
    print(3 + 5); // 实现3+5,结果为8。
    print(3 - 5); // 实现3-5,结果为-2。
    print(3 * 5); // 实现3x5,结果为15。
    print(3 / 5); // 实现3÷5,结果为0.6,结果类型是double类型。
    print(3 ~/ 5); // 实现3÷5,结果为0,取运算结果的整数部分,结果类型为int类型。
    
    // 取模运算结果类型根据运算符两边的类型来定,如出现double类型,结果类型会向double类型转换。
    print(3 % 5); // 实现取余,结果为3, 结果类型为int。
    print(3.5 % 5); // 实现取余,结果为3.5,结果类型为double。
}

1.2 赋值运算符

由算术运算符+等号组成。

赋值运算符.png

示例:

void main() {
    int a = 4;
    a += 5;
    print(a); // 结果为9。
    a -= 5;
    print(a); // 结果为4。
    a *= 5;
    print(a); // 结果为20。
    a ~/= 5; 
    print(a); // 结果为4。整除结果为int类型。
    double b = 4; // 将int类型数字隐式转换为double类型。
    b /= 5;
    print(b); // 结果为0.8,除法结果为double类型。
    a %= 3;
    print(a); // 结果为1,结果为int类型。
    b %= 3;
    print(b); // 结果为0.8,结果为double类型。 
}

1.3 比较运算符

对数学中大于、大于等于、小于、小于等于、等于、不等于的实现。

比较运算符.png

示例:

void main(){
    int a = 4;
    double b = 5; 
    print(a > b); // 实现数学中4>5.0,结果为false。
    print(a >= (b-1)); //实现数学中4≥(5.0-1),结果为true。
    print(a < b); // 实现数学中4<5.0,结果为true。
    print(a <= b); // 实现数学中4≤5.0,结果为true。
    print(a == b); // 实现数学中4=5,结果为false。
    print(a != b); // 实现数学中4≠5,结果为true。
}

1.4 逻辑运算符

用于组合多个布尔表达式,返回值为bool类型。

  • &&: 全真为真,一假全假。注意:如果左侧表达式为假,则右侧表达式不会进行判断,直接返回结果假。
  • ||: 全假为假,一真为真。注意:如果左侧表达式为真,则右侧表达式不会进行判断,直接返回结果真。
  • !: 取反。如果表达式结果为真,返回结果为假。

逻辑运算符.png

示例:

void main() {
    print((3>5) && (3<5)); // false
    print((3<5) || (5<3)); // true
    print(!(3<5)); // false 
}

1.5 自增自减运算符

对变量进行快速加1减1。

  • ++i, --i: 先加1(或减1),再使用。
  • i++, i--: 先使用,再加1(或减1)。

自增自减运算符.png

示例:

void main() {
    // 自增
    int i = 5;
    print(++i); // 先加1后,再使用,结果为6。
    print(i); // 6 
    print(i++); // 先使用,结果为6。
    print(i); // 再加1,结果为7。
    // 自减
    int j = 5;
    print(--j); // 先减1后,再使用,结果为4。
    print(j); // 4
    print(j--); // 先使用,结果为4。
    print(j); // 再减1,结果为3。
    
    
}

1.6 空感知运算符

Dart中引入一些专门的运算符来处理空值。

  • 空合并运算符(??):如果左侧表达式为null,则使用右侧表达式的值。
  • 空感知赋值运算符(??=):如果左侧变量为null,则将右侧的值赋值给左侧变量。
  • 空感知方法调用(?.):如果左侧表达式为null,则不会调用方法,返回null。

空感知运算符.png

示例:

void main() {
    // 空合并运算符
    int? a; // int? 定义变量a ,a 为可为空。
    print(a); // 输出:null
    print(a.runtimeType); // 输出:Null
    int b = a ?? 5;
    print(b); // 输出:5,运算符左侧为空。
    // 空感知赋值运算符
    a ??= 10;
    print(a); // 输出:10,运算符左侧为空,将运算符右侧值赋值给a。
    print(a.runtimeType); // 输出:int
    // 空感知方法调用
    GetData c = GetData; 
    print(c.runtimeType); // GetData
    feelNull(c); // 传入 GetData,输出:2
    GetData? d; 
    print(d.runtimeType); // 输出:Null
    feelNull(d); // 传入null,输出:null
 }

void feelNull (GetData? data) {
    data?.name;
    // 空感知方法调用,如果data为空,则返回null,否则调用getNum() 函数
    var result = data?.getNum(1);
    print(result);
}

class GetData {
  String? name;
  int getNum(int i){
    return i+1;
  }
}

1.7 级联运算符(..)

允许在同一个对象上连续访问属性或调用多个方法的运算符。

示例:

void main() {
    // 级联运算符
    GetData a = GetData()
    ..name
    ..age
    ..sex
    ..getNum(1);
}

class GetData {
  String? name;
  int age = 19;
  bool sex = true;
  int getNum(int i){
    return i+1;
  }
}

1.8 类型判断运算符

用于检查对象的类型。

  • is
  • is!

示例:

void main() {
    int a = 10;
    print(a is String); // 输出:false
    print(a is int); // 输出:true
    print(a is! String); // 输出:true
    print(a is! int); // 输出:false
}

2、 表达式

可以是一个值、一个变量、一个函数调用,或者是包含运算符的一段代码。

2.1 简单表达式

  • 一个值、一个变量
  • 示例: 15,true

2.2 复杂表达式

包含运算符、数值、变量、其他表达式。

示例:

void main() {
    int a = 12;
    int b = 15;
    a += 5; // 运算符、数值
    print(a); // 17
    a += b; // 运算符、变量
    print(a); // 32
    a += (b+5);  // 运算符、数值、变量
    print(a); // 52
}

2.3 条件表达式(三目运算符)

用于条件选择执行。

示例:

void main() {
    int a = 12;
    int b = 15;
    bool l = (a>b) ? (a>5) : (b>16);
    print(l); // 输出: false
}

2.4 箭头函数

用于简化定义一个函数。

示例:

void main() {
    hello(); // 输出:hello,Dart
}
void hello() => print('hello,Dart');

3、总结

运算符与表达式不仅实现了数学计算、比较和逻辑判断,还提供了许多的特殊运算符(空感知运算符、级联运算符等)。