第4章 Dart基础语法 -- 运算符

运算符是一门编程语言的常用内容,Dart语言中定义了很多运算符

描述 操作符 示例
后缀 ++ -- () [] . ?. i++, j--, demo(), [1,2], str.func(), Test?.fun
前缀 - ! ++ -- ~ -5, !flag, ~flag, ++i, --j
四则运算 + - * / % ~/ 3+5,5-3, 2*3, 4/2, 5%3, 5~/3
移位 << >> 2<<3 16>>2
位运算 & | ^ 5&3, 5|3, 5^3
逻辑运算 && || (i>5)&&(j<4), (i>5)||(j<4)
比较运算 > < >= <= != == i != j, i>5
类比较 as is is! t is Test
赋值运算 = += -= *= /=... i+=3, i=5
三元 ? : ?? a==3?3:2, a??b
级联 .. t..funa()..funcb()

编程语言中常见,如四则运算,++和--,逻辑,位运算和赋值等运算符本章节不再详细讲解。本章节介绍一些Dart有特点的运算符。


1. ?.操作符

“?.”的作用相当于加强的“.”,通常用于访问对象或类的属性。与“.”不同的是,“?.”操作符的左侧可以是null值。
这时候,其访问不会出现异常,而是得到一个null结果
示例

main(){
  Test t = new Test();
  var x = t?.a;
  var y = t.a;
  print(x);
  print(y);
  t.func();
  t?.func();
}
class Test{
  int a = 5;
  func(){
    print("test => func");
  }
}

运行结果:可以看到“?.”与“.”的作用是一样的。


运行结果

改变代码,去掉所有的“?.”方式调用,将t的结果在访问前置为null

main(){
  Test t = new Test();
  t = null;
  var y = t.a;
  print(y);
  t.func();
}
class Test{
  int a = 5;
  func(){
    print("test => func");
  }
}

运行结果:可见明显的异常,此种情况类似于Java的NullPointerException


运行异常

改变代码,使用“?.”方式调用,将t的结果在访问前置为null

main(){
  Test t = new Test();
  t = null;
  var x = t?.a;
  print(x);
  t?.func();
}
class Test{
  int a = 5;
  func(){
    print("test => func");
  }
}

运行结果:课件程序没有出现异常。a属性为null,func方法没有调用


运行结果

2. ~操作符

取得当前变量的二进制反码

main(){
  var a = 137; //010001001
  var b = ~a;   //101110110
  print(b); // -138
}

3. ~/操作符

由于Dart中数值使用num类型表示,两个整数进行除法操作可能会得到浮点数。在Java语言中两个整数的除法得到的也是整数,~/可以理解为是Java语言中的除法

main(){
  var a = 5 / 3;
  var b = 5 ~/ 3;
  print(a); //浮点数结果 1.6666666666666667
  print(b); //整数结果 1
}

4. is,is!和as操作符

在Dart语言开发中,经常使用dynamic类型声明变量,此时如果需要针对变量做某个类型的特定操作,需要提前进行类型检查。这三个运算符主要用于类型检查。

操作符 含义
is 当对象是相应类型时返回 true
is! 当对象不是相应类型时返回 true
as 假设类型检查结果为true

is可以理解为是Java语言中的instanceof操作符。
is和is!示例

main(){
  dynamic d = new Emp();
  print(d is Emp);  //true
  print(d is! Emp); //false
}

class Emp{
  String name;
  void display(){
    print(this.name);
  }
}

使用is进行类型检查

main(){
  dynamic d = new Emp();
  if(d is Emp){   
    //在if语句中认为d已经是Emp的对象,Dart允许访问Emp的属性和方法。if语句外无法访问Emp属性和方法
    //与Java相比,此处省略了将d强制转化为Emp对象的过程,直接将d看做Emp对象
    d.name = "赵四";  
    d?.display();  //显示“赵四”
  }
}

class Emp{
  String name;
  void display(){
    print(this.name);
  }
}

使用as假设类型检查成功,简略上述程序

main(){
  dynamic d = new Emp();
  (d as Emp).name = "赵四";
  (d as Emp).display();  //显示“赵四”
}

class Emp{
  String name;
  void display(){
    print(this.name);
  }
}

使用as假设类型检查,若上述代码中变量d实际不是Emp类型,则程序运行异常


5. ??三元操作符

??的功能相当于Oracle中的库函数nvl(expr1,expr2)
expr1 ?? expr2其含义如果expr1的取值不为null,使用expr1的值,否则使用expr2的值

main(){
  dynamic a = 32;
  dynamic b = 45;
  dynamic c;
  dynamic d = a ?? b; // a != null,所以使用a赋值给d
  dynamic e = c ?? b; // c == null,所以使用b赋值给e
  print(d); //32 
  print(e); //45
}

6. ..级联调用

相当于Java中连续调用。

main(){
  StringBuffer s = new StringBuffer();
  var n = s..write("a")
            ..write("b")
            ..write("c")
            ..toString();
  print(n); //abc
}

你可能感兴趣的:(第4章 Dart基础语法 -- 运算符)