欢迎大家来到IT世界,在知识的湖畔探索吧!
欢迎关注『郝先生头条号』,第一时间获得最新文章
上篇文章移动互联网开发者,必须掌握这些Dart语法-数据类型中介绍了dart语法数据类型部分,这篇继续讲解dart语法运算符。
final和const
首先补充两个关键字final和const,定义变量时适当使用这两个关键字,可以让我们写出的程序更加健壮。
- final
① 必须初始化,且不可修改
例:
final String a = “必须初始化,且不可修改”;
final double b = 3.14;
final c = “必须初始化,且不可修改”;
final d = 3.14;
② 如果定义为类变量,请使用static修饰
例:
static final String a = “必须初始化,且不可修改”;
- const
① 必须初始化,且不可修改,编译成常量
例:
const String a = “必须初始化,且不可修改,编译成常量”;
const double b = 3.14;
const c = “必须初始化,且不可修改,编译成常量”;
const d = 3.14;
② 如果定位为类常量,请使用static修饰
例:
static const double a = 3.14;
运算符(Operators)总览
Dart提供了非常全面的运算符,接下来我们认识一下开发中常用的一些运算符。
运算符拥有优先级,遵循一定的结合律,建议大家没有把握的情况下,要多使用括号”()”保证计算结果的正确性。
位操作符使用得当可以写出更加高效的程序,如果计算机基础不是太好的同学,去回顾一下计算机基础知识,理解计算机底层是如果处理数据,为什么说位操作符更加高效。参加过知名互联网公司面试的朋友,可能会碰到不使用加减乘除(+-*/)进行算数的题目,这类题目便是考察位操作的题目。
位移操作符中,大家要特别注意右移操作符,包括算数右移和逻辑右移,其中算数右移需要考虑符号位,而逻辑右移反之。
巧用条件运算符(?:)可以写成更加简洁的程序,且更加符合x86-64处理器汇编规则,大家可以编写一段使用条件运算符的C语言程序,然后使用GCC编译器汇编出汇编代码,一看究竟。
算术运算符(Arithmetic Operators)
- 加减乘除
例:
int a = 2 + 8;
double b = 39.8 – 12.3;
int c = 2 * 5;
int d = 10 / 5;
- 取整
例:
int a = 5 ~/ 2; // 结果:2
- 取模
类似数学上的取余数
例:
int a = 5 % 2; // 结果:1
- 自增/自减
例:
int a = 1;
a++; // 结果:2
a–; // 结果:1
比较运算符(Equality And Relational Operators)
特别注意的地方是,等号(==)运算符运用于两个引用类型的对象比较时,比较的是对象的值是否相等,如果要比较两个引用类型的地址是否相等时,需要使用identical()方法。
拓展知识:
- javascript中使用双等号(==)进行宽泛比较是否相等,使用三等号(===)进行严格比较是否相等,比如:”2″ == 2结果是true,而”2″ === 2结果是false。
- java中使用isEqual()等方法判断两个对象是否完全相等
- Objective-C中使用isEqualToString()方法比较两个字符串是否相等。
类型判定运算符(Type Test Operators)
这类符号在面向对象编程语言中特别又有,因为我们常常使用里氏替换原则编写出十分灵活的代码。在实际使用对象时,判断对象的类型,然后进一步使用,可以帮助我们减少程序崩溃的问题。
- as
如果我们十分确定一个对象是某种类型时,我们可以使用as将该对象转换为真正的类型。通常可以这样做:
例:
(a as AClass).name = “abc”;
但是假如a不是AClass类型,或者为空(null),那么很有可能上述代码会抛出异常,所以在不确定a的类型的情况下,还是建议使用下面的写法。
if (a is AClass) {
a.name = “abc”;
}
赋值运算符(Assignment Operators)
- 赋值(=)
右侧值赋值给左侧变量
例:
int a = 32;
String b = “赋值”;
- 判空赋值(??=)
这个运算符在其他语言中比较少见,也就是如果左侧变量为空(null)时,才将右侧的值赋值给左侧变量
例:
int a = null;
a ??= 8; // 结果:8。即如果a是空(null),将8赋值给a;如果a非空,那么a保持原来的值
a ?? = 30; // 结果:还是8
- 复合运算符(+=、*=等)
例:int a = 2;
a += 1 // 结果:3。相当于 a = a + 1;
逻辑运算符(Logic Operators)
- 或(||)运算符、与(&&)运算符
① 常常使用它们的“短路特性”做条件过滤,即第一个条件(a)满足时,将不进行第二个条件(b)的判断
例:
if (a || b) {
// 如果a和b有一个为true,就会进入该语句
}
if (a && b) {
// 如果a和b都为true,才会进入该语句
}
② if语句中常常使用!a代替a == false
例:
if (a == false) {}
if (!a) {}
位运算符(Bitwise And Shift Operators)
- 按位与(&)
- 按位或(|)
- 按位异或(^)
- 按位取反(~)
- 左移位(<<)
- 右移位(>>)
尽管日常编程中不太常用位操作,但是在底层开发、框架编写者或者汇编语言中,将经常接触它。对于追求进步的我们,可以花费一些时间复习一下二进制进制转换和位操作相关知识。
条件表达式(Conditional Expressions)
对于比较简单的条件语句,我们经常采用这种方式书写,因为更加简洁高效。
- condition ? expression1 : expression2
如果condition为true,那么执行expression1,否则执行expression2
例:
bool a = true;
int b = a ? 1 : 2; // 结果:b = 1
- expression1 ?? expression2
如果expression1非空(non-null),返回expression1的值,否则执行expression2并返回该值
例:
String a = “abc”;
String b = a ?? “默认值”; // 结果:b = “默认值”
级联运算符(Cascade Notation(..))
可以在同一个对象上连续调用函数或访问成员变量。
例:
Person p = new Person();
p.name = “郝先生”;
p.age = 18;
p.gender = “Mr.”
使用级联方式:
p.name = “郝先生”
..age = 18
..gender = “Mr.”;
其他运算符
- 访问列表元素符([])
例:
List a = [“First”, “Second”, “Third”];
a[1]; // 结果:”Second”
- 访问成员变量符(.)
例:
Person p = new Person();
p.name; // 获取成员变量name的值
- 访问非空成员变量(?.)
符号左侧的操作对象不为空(null)时,才能返回成员变量的值。
例:
Person p = new Person();
p?.name; // 如果p为空(null)时,返回null,否则返回name
- 拓展
swift中也有类似访问非空成员变量的语法,那里称为可选类型(optional),使用时需要拆箱操作,通常可以使用guard语法访问变量,这机制符合了苹果公司官方宣称的swift是一门安全语言的理念。
结语
各种编程语言运算符类似,只是语法上的稍微差异,dart编程语言增加了一些便于使用的小小特性,大家可以对比着练习一下,相信很快就能掌握。
下篇预告
移动互联网开发者,必须掌握这些Dart语法-流程控制(Control Flow Statements)
欢迎转发,欢迎收藏,欢迎关注『郝先生谈技术』
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/36193.html