喜迎
春节

运算符


运算符用于执行各种操作,例如算术、位运算等,是Dart代码中的基本构建块,用于对数据进行操作并控制程序流。

1 运算符

  • 位运算符:&(与)、|(或)、^(异或)、~expr(一元位补码)、<<(左移)、>>(右移)。
  • 算术运算符:+-*/%~/(返回一整数值的除法)、-expr(一元减号即负号)。
  • 关系运算符:==(等)、!=(不等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
  • 赋值运算符:=??=+=-=*=/=%=~/=<<=>>=&=^=|=
  • 逻辑运算符:!expr(反转表达式)、||(逻辑或)、&&(逻辑与),只两个值。
  • 级联运算符:..(可对同一对象执行系列操作,严格说级联符号并非运算符)。
  • 条件表达式:condition ? expr1 : expr2(三元表达式)、expr1 ?? expr2
  • 类型判定运算符:is(相应类型)、is!(非相应类型)、as(转换为指定类型)。

2 位运算符

  • ^(异或):两个输入相同时为0,不同为1。
  • 都是通过操作位的移动来达到运算的目的。
main() {
  // 位运算符
  final v = 0x77; // 16进制,10进制为119,2进制为0111 0111
  final b = 0xee; // 16进制,10进制为238,2进制为1110 1110
  print((v & b).toRadixString(2));
  print((v | b).toRadixString(2));
  print((v ^ b).toRadixString(2));
  print((~ v).toRadixString(2));
  print((v << 1).toRadixString(2));
  print((v >> 2).toRadixString(2));
  print((v &~ b).toRadixString(2)); // 与非&~,转为2进制
}

3 算术运算符

  • +-*/%(取余)、~/(返回一整数值的除法)、-expr(一元减号即负号)。
  • 还支持前缀递增++var、前缀递减--var、后缀递增var++、后缀递减var--运算符。

3-1 加减乘除

main() {
  // 算术运算符
  var a = 3;
  var b = 6;
  var c = 9;
  print('加:' + (a + c).toString());
  print('减:' + (a - b).toString());
  print('乘:' + (a * b).toString());
  print('除:' + (c / b).toString());
  print('取余:' + (c % b).toString());
  print('取整:' + (c ~/ b).toString());

  var d = b - a;
  print('赋值:' + d.toString());
}

3-2 递增递减

main() {
  var a = 3;
  var x1, x2, y1, y2;
  // 在x1获得值前自增a
  x1 = ++a;
  print('$a --- $x1');
  // 在y1获得值后自增a
  y1 = a++;
  print('$a --- $y1');
  // 在x2获得值前自减a
  x2 = --a;
  print('$a --- $x2');
  // 在y2获得值后自减a
  y2 = a--;
  print('$a --- $y2');
}

4 关系运算符

  • 测试两个对象是否表示相同的事务,使用==运算符。
  • 确定两个对象是否完全相同,使用identical()函数。
main() {
  // 关系运算符
  int a = 5;
  int b = 3;
  print(a != b);
  print(a > b);
  print(a >= b);
  print(a == b);
  print(a < b);
  print(a <= b);

  // 用于条件判断
  if(a > b) {
    print('a大于b');
  } else {
    print('a小于b');
  }

  int c = 5;
  // 判断对象是否完全相同
  int d = 6;
  print(identical(c, d));
}

5 赋值运算符

  • 使用=运算符从右向左进行赋值操作,当变量为空时,可以使用??=运算符进行赋值。
  • 复合赋值运算符:+=-=*=/=%=~/=<<=>>=&=^=|=
main() {
  // 赋值运算符,从右向左
  var v = 1;
  print(v);

  // 如果z为空,则将值分配给z,否则z保持不变
  var z;
  z ??= v;
  print(z);

  // 复合赋值运算符
  var a = 12;
  a += 10;
  print(a);

  var b = 4;
  b *= 3;
  print(b);
}

6 逻辑运算符

  • 逻辑运算符也可以反转布尔表达式,或组合布尔表达式。
main() {
  // 逻辑运算符
  bool flag1 = true;
  print(!flag1);

  // 逻辑或||
  bool flag2 = false;
  bool flag3 = false;
  print(flag2 || flag3);
  
  // 逻辑与&&
  print(flag1 && flag2);

  // 组合表达式
  int age = 21;
  String sex = '男';
  if(age == 23 && sex == '男') {
    print('$age --- $sex');
  } else {
    print('不打印');
  }
}

7 级联运算符

  • 使用..表示,可对同一对象执行一系列操作,严格说级联的双点符号并非运算符。
  • 只是Dart语法的一部分,类似于JavaScript中Promise的then处理,目的是简化代码。
class Person {
  String name;
  num age;
  Person(this.name, this.age);
  void printInfo() {
    print('${this.name} --- ${this.age}');
  }
}

main() {
  Person p = new Person('张三', 21);
  p.printInfo();

  p.name = '李四';
  p.age = 22;
  p.printInfo();
  
  p
    ..name = '王五'
    ..age = 23
    ..printInfo();
}

8 条件表达式

  • condition ? expr1 : expr2:条件为真返回expr1,否则返回expr2(三元表达式)。
  • expr1 ?? expr2:如果expr1为非空,返回expr1的值,否则计算并且返回expr2的值。
main() {
  // if...else
  bool flag1 = true;
  if(flag1) {
    print('正确');
  } else {
    print('错误');
  }
  
  // condition ? expr1 : expr2
  var flag2 = true;
  String result = flag2 ? '正确' : '错误';
  print(result);

  // expr1 ?? expr2
  var x;
  var y = x ?? 1000;
  print(y);
}

9 类型判定运算符

  • is:当对象是相应类型时,返回true。
  • is!:对象不是相应类型时,返回true。
  • as:将一个对象转换为指定类型,前提是能够转换,转换之前可先用is进行判断。
main() {
  // 类型判定运算符
  var a = 123;
  if(a is int) {
    print('a是int类型');
  } else {
    print('a是其他类型');
  }
}

文章作者: bsf
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 bsf !
评 论
  目录