上篇文章移动互联网开发者,必须掌握这些Dart语法-数据类型中介绍了dart语法数据类型部分,这篇继续讲解dart语法运算符。
首先补充两个关键字final和const,定义变量时适当使用这两个关键字,可以让我们写出的程序更加健壮。
① 必须初始化,且不可修改
例:
final String a = "必须初始化,且不可修改";
final double b = 3.14;
final c = "必须初始化,且不可修改";
final d = 3.14;
② 如果定义为类变量,请使用static修饰
例:
static final String a = "必须初始化,且不可修改";
① 必须初始化,且不可修改,编译成常量
例:
const String a = "必须初始化,且不可修改,编译成常量";
const double b = 3.14;
const c = "必须初始化,且不可修改,编译成常量";
const d = 3.14;
② 如果定位为类常量,请使用static修饰
例:
static const double a = 3.14;
Dart提供了非常全面的运算符,接下来我们认识一下开发中常用的一些运算符。
运算符拥有优先级,遵循一定的结合律,建议大家没有把握的情况下,要多使用括号"()"保证计算结果的正确性。
位操作符使用得当可以写出更加高效的程序,如果计算机基础不是太好的同学,去回顾一下计算机基础知识,理解计算机底层是如果处理数据,为什么说位操作符更加高效。参加过知名互联网公司面试的朋友,可能会碰到不使用加减乘除(+-*/)进行算数的题目,这类题目便是考察位操作的题目。
位移操作符中,大家要特别注意右移操作符,包括算数右移和逻辑右移,其中算数右移需要考虑符号位,而逻辑右移反之。
巧用条件运算符(?:)可以写成更加简洁的程序,且更加符合x86-64处理器汇编规则,大家可以编写一段使用条件运算符的C语言程序,然后使用GCC编译器汇编出汇编代码,一看究竟。
例:
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
特别注意的地方是,等号(==)运算符运用于两个引用类型的对象比较时,比较的是对象的值是否相等,如果要比较两个引用类型的地址是否相等时,需要使用identical()方法。
拓展知识:
这类符号在面向对象编程语言中特别又有,因为我们常常使用里氏替换原则编写出十分灵活的代码。在实际使用对象时,判断对象的类型,然后进一步使用,可以帮助我们减少程序崩溃的问题。
如果我们十分确定一个对象是某种类型时,我们可以使用as将该对象转换为真正的类型。通常可以这样做:
例:
(a as AClass).name = "abc";
但是假如a不是AClass类型,或者为空(null),那么很有可能上述代码会抛出异常,所以在不确定a的类型的情况下,还是建议使用下面的写法。
if (a is AClass) {
a.name = "abc";
}
右侧值赋值给左侧变量
例:
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;
① 常常使用它们的“短路特性”做条件过滤,即第一个条件(a)满足时,将不进行第二个条件(b)的判断
例:
if (a || b) {
// 如果a和b有一个为true,就会进入该语句
}
if (a && b) {
// 如果a和b都为true,才会进入该语句
}
② if语句中常常使用!a代替a == false
例:
if (a == false) {}
if (!a) {}
尽管日常编程中不太常用位操作,但是在底层开发、框架编写者或者汇编语言中,将经常接触它。对于追求进步的我们,可以花费一些时间复习一下二进制进制转换和位操作相关知识。
对于比较简单的条件语句,我们经常采用这种方式书写,因为更加简洁高效。
如果condition为true,那么执行expression1,否则执行expression2
例:
bool a = true;
int b = a ? 1 : 2; // 结果:b = 1
如果expression1非空(non-null),返回expression1的值,否则执行expression2并返回该值
例:
String a = "abc";
String b = a ?? "默认值"; // 结果:b = "默认值"
可以在同一个对象上连续调用函数或访问成员变量。
例:
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)