Dart基础(二)-操作符

2022-01-05  本文已影响0人  苍眸之宝宝

简介:

  Dart中支持的操作符:

描述 操作符
一元后缀 expr++(递增) expr--(递减) () [] ?[] . ?.
一元前缀 -expr(负数) !expr(取反) ~expr(一元位补码) ++expr(递增) --expr(递减) await expr(异步)
算术运算符 + - * / %(取余) ~/(取整)
位运算符 <<(左移) >>(右移) >>>(无符号右移) &(位与) ^(位异或) | (位或)~expr(一元位补码)
关系运算符 >=(大于等于) >(大于) <=(小于等于) <(小于) ==(相等或者等价) !=(不等)
类型测试 as(类及其子类) is(类) is!(不是类)
逻辑 &&(且) ||(或) !(非)
判空 ??
三目 expr1 ? expr2 : expr3
级联 .. ?..
赋值 = *=(乘等) /=(除等) +=(加等) -=(减等) &= ^= ??= <<= |= etc.

算术运算符:

  算术运算符的/,两个整数相除,不能整除时,获得的结果是double的结构,和swift不相同。

    int number = 12;
    int number2 = 5;
    print(number % number2);  // 取余  2
    print(number ~/ number2);  // 取整 2
    var num = number / number2;
    print(num);  // 2.4
    print(num.runtimeType);  // double

一元运算符:

  讲一下++--在变量前后的问题:如果运算符变量参与运算或赋值;运算符在前变量在后,这种情况下先进行变量的自增或者自减,然后参与参数运算或赋值;运算符在后变量在前,这种情况下先进行参与变量的运算或赋值,然后进行变量的自增或者自减。如下:

  int number = 12;
  int number3 = number--;  // --在后,先进行复制操作,将number值赋值给number3,number再进行自-1操作,所以打印number3的值为12,此时number的值为11
  int number4 = --number;  // --在前,先进行number再进行自-1操作,此时number为10,再将number的值赋值给number4,number4的值为10
  print(number3); // 12
  print(number4); // 10

关系运算符:

  关系运算符是对两个对象进行关系判断。

    int number6 = 13;
    int number5 = 5;
    print(number6 == number5);  // 判断是否相等
    print(number6 != number5);  // 判断是否不等
    print(number6 > number5);  // 判断是否大于
    print(number6 >= number5);  // 判断是否大于等于

类型测试运算符:

  as用于强制类型转换,强制转换的类型必须是对象的类或者父类,否则运行时会报错。
  is判断对象是否属于某个类及其子类,is!判断对象是否不是某个类及其子类。

class Person {
  final String name;
  final int age;

  const Person(this.name, this.age);
}

class Man extends Person {
  static const String type = 'Man';

  final String beard;

  Man(String name, int age, this.beard) : super(name, age);

}
    // as is
    var man = Man("张三丰", 230, "白胡子");
    var persion = Person('张无忌', 23);
    // print((persion as Man).name); // 运行时,报错
    print((man as Person).name);
    if (man is Person) {
      print("man is Person");
    }

赋值运算符:

  ??=表示如果变量为null时,将后边的值赋给变量,如果变量不为null,不进行赋值操作。
  关于a op= b的赋值操作符,等价于a = a op b

    int? number7;
    int? number8 = 11;
    number7 ??= 10;
    number8 ??= 10;
    print(number7); // 10
    print(number8); // 11
    number8 += number7; // 等价于number8 = number8 + number7
    print(number8); // 21

位运算符:

符号 描述 运算规则
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
>>> 无符号右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
    const value = 0x22;   // 二进制:0000 0010 0010
    const bitmask = 0x0f; // 二进制:0000 0000 1111  取反:1111 1111 0000
    assert((value & bitmask) == 0x02); // 与(相同的二进制位运算):0 & 0 = 0,0 & 1 = 0,1 & 1 = 1
    assert((value | bitmask) == 0x2f); // 或(相同的二进制位运算):0 & 0 = 0,0 & 1 = 1,1 & 1 = 1
    assert((value ^ bitmask) == 0x2d); // 异或(相同的二进制位运算):0 & 0 = 0,0 & 1 = 1,1 & 1 = 0
    assert((value & ~bitmask) == 0x20);
    assert((value << 4) == 0x220); // 左移
    assert((value >> 4) == 0x02); // 右移
    const fValue = -value;  // 二进制:0000 0011 1101
    print((fValue >> 4) == -0x03); // 右移
    // assert((value >>> 4) == 0x02); // 无符号右移
    // assert((-value >>> 4) > 0); // 无符号右移

条件表达式:

  condition ? expr1 : expr2表示条件 ? 值1 : 值2,当条件位true时是值1,否则为值2。
  expr1 ?? expr2表示 值1 ?? 值2,当值1为null时,取值2。

    bool isSuccess = true;
    var successStr = isSuccess ? "成功" : "失败";
    int? nullInt;
    var someInt = nullInt ?? 2;
    print(successStr);  // 成功
    print(someInt); // 2

级联操作符:

    var person = Person()
    ..name = "lucy"
    ..age = 16;

    Person? person3;
    person3?..name = "Lin"
    ..age = 24;

    var person2 = Person();
    person2.name = "Luck";
    person2.age = 18;

其它操作符:

符号 名称 意义
() 函数的应用 表示函数调用
[] 下标访问 表示对可重写操作符[]的调用;例如:monist[1]将int 1传递给monist以访问索引1的元素
?[] 可选下标访问 与[]相同,但是允许访问的数组变量为null
. 成员或者属性访问 访问类的属性或者方法等
?. 可选成员或者属性访问 和.相同,允许访问的变量为null
Type? 变量可选 表示该变量的值可以为null
: 函数重定向 用于函数重定向,及在调用该函数前需要做的事(例如调用其它函数或者提供初始化变量值等);早期Dart版本用于提供参数默认值
上一篇 下一篇

猜你喜欢

热点阅读