运算符是一门编程语言的常用内容,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
}