第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
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • Flutter日渐火爆,因此在进行Flutter学习前先学习一些其所使用的开发语言dart的基础,这篇文章主要学习...
    Samlss阅读 10,918评论 2 28
  • 原文:https://www.dartlang.org/guides/language/language-tour...
    星空下奔跑阅读 941评论 0 0
  • 有些语言翻译为运算符,有些叫操作符,都指的是Operator。 Dart定义的操作符都在下表中。你可以像C++或者...
    suikaJY阅读 1,088评论 0 2
  • 1. 重要概念 能够放在变量中的所有内容都是对象,每个对象都是一个类的实例。甚至于数字、函数和null值都是对象,...
    凯玲之恋阅读 3,696评论 0 5
  • 山不绝此水禁流,君道飘迷尚不知 看过烟雨花落,记不住物是人非 雪月花,空悲下,燕归意语休
    尔雅雯华阅读 170评论 1 2