Dart —— 运算符 算数,关系,类型判定,赋值,逻辑,按位移位,条件,级联

Dart汇总请点击这里

操作符

Dart 定义的运算符。
DescriptionOperator
unary postfixexpr++ expr-- () [] . ?.
unary prefix-expr !expr ~expr ++expr --expr
multiplicative* / % ~/
additive+ -
shift<< >> >>>
bitwise AND&
bitwise XOR^
bitwise OR
relational and type test>= > <= < as is is!
equality== !=
logical AND&&
logical OR
if null??
conditionalexpr1 ? expr2 : expr3
cascade
assignment= *= /= += -= &= ^= etc.

创建表达式的时候会用到运算符。 下面是一些运算符表达式的实例:

a++
a + b
a = b
a == b
c ? a : b
a is T

运算符表 中, 每一行的运算符优先级,由上到下依次排列,第一行优先级最高,最后一行优先级最低。 例如 % 运算符优先级高于== , 而`` == 高于&&。 根据优先级规则,那么意味着以下两行代码执行的方式相同:

// 括号可以提高可读性。
if ((n % i == 0) && (d % i == 0)) ...

// 可读性差,但是是等效的。
if (n % i == 0 && d % i == 0) ...

警告: 对于有两个操作数的运算符,运算符的功能由左边的操作数决定。 例如, 如果有两个操作数 Vector 和 Point, aVector + aPoint 使用的是 Vector 中定义的 + 运算符。

算术运算符

Dart 支持常用的运算运算符,如下表所示:

OperatorMeaning
+Add
Subtract
-exprUnary minus, also known as negation (reverse the sign of the expression)
*Multiply
/Divide
~/Divide, returning an integer result
%Get the remainder of an integer division (modulo)

示例:

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 结果是双浮点型
assert(5 ~/ 2 == 2); // 结果是整型
assert(5 % 2 == 1); // 余数

assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');

Dart 还支持前缀和后缀,自增和自减运算符。

OperatorMeaning
++varvar = var + 1 (expression value is var + 1)
var++var = var + 1 (expression value is var)
- -varvar = var – 1 (expression value is var – 1)
var- -var = var – 1 (expression value is var)

示例:

var a, b;

a = 0;
b = ++a; // a自加后赋值给b。
assert(a == b); // 1 == 1

a = 0;
b = a++; // a先赋值给b后,a自加。
assert(a != b); // 1 != 0

a = 0;
b = --a; // a自减后赋值给b。
assert(a == b); // -1 == -1

a = 0;
b = a--; // a先赋值给b后,a自减。
assert(a != b); // -1 != 0
关系运算符

下表列出了关系运算符及含义:

OperatorMeaning
==Equal; see discussion below
!=Not equal
>Greater than
<Less than
>=Greater than or equal to
<=Less than or equal to

要测试两个对象x和y是否表示相同的事物, 使用 ==运算符。 (在极少数情况下, 要确定两个对象是否完全相同,需要使用 identical() 函数。) 下面给出 == 运算符的工作原理:

  1. 如果 x 或 y 可以 null,都为 null 时返回 true ,其中一个为 null 时返回 false。

  2. 结果为函数 x.==(y) 的返回值。 (如上所见, == 运算符执行的是第一个运算符的函数。 我们甚至可以重写很多运算符,包括 ==, 运算符的重写,参考 重写运算符。)

这里列出了每种关系运算符的示例:

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
类型判定运算符

asis, 和 is! 运算符用于在运行时处理类型检查:

OperatorMeaning
asTypecast (也被用于指定库前缀)
isTrue if the object has the specified type
is!False if the object has the specified type

例如, obj is Object总是true。 但是只有 obj实现了 T的接口时,obj is T 才是true

使用 as运算符将对象强制转换为特定类型。 通常,可以认为是 is类型判定后,被判定对象调用函数的一种缩写形式。 请考虑以下代码:


if (emp is Person) {
  // Type check
  emp.firstName = 'Bob';
}

使用 as 运算符进行缩写:

(emp as Person).firstName = 'Bob';

提示: 以上代码并不是等价的。 如果 emp 为 null 或者不是 Person 对象, 那么第一个 is 的示例,后面将不会执行; 第二个 as 的示例会抛出异常。

赋值运算符

使用 = 为变量赋值。 使用 ??= 运算符时,只有当被赋值的变量为 null 时才会赋值给它。

// 将值赋值给变量a
a = value;
// 如果b为空时,将变量赋值给b,否则,b的值保持不变。
b ??= value;

复合赋值运算符(如 += )将算术运算符和赋值运算符组合在了一起。

=–=/=%=>>=^=
+=*=~/=<<=&=I=

以下说明复合赋值运算符的作用:

~Compound assignmentEquivalent expression
For an operator op:a op= ba = a op b
Example:a += ba = a + b

以下示例使用赋值和复合赋值运算符:

var a = 2; // 使用 = 赋值
a *= 3; // 赋值并做乘法运算: a = a * 3
assert(a == 6);
逻辑运算符

逻辑操作符可以反转或组合布尔表达式。

OperatorMeaning
!exprinverts the following expression (changes false to true, and vice versa)
IIlogical OR
&&logical AND

下面是关于逻辑表达式的示例:

if (!done && (col == 0 || col == 3)) {
  // ...Do something...
}
按位和移位运算符

在 Dart 中,可以单独操作数字的某一位。 通常情况下整数类型使用按位和移位运算符来操作。

OperatorMeaning
&AND
IOR
^XOR
~exprUnary bitwise complement (0s become 1s; 1s become 0s)
<<Shift left
>>Shift right

下面是关于按位和移位运算符的示例:

final value = 0x22;
final bitmask = 0x0f;

assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR
assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right
条件表达式

Dart有两个运算符,有时可以替换if-else 表达式, 让表达式更简洁:

condition ? expr1 : expr2
如果条件为 true, 执行 expr1 (并返回它的值): 否则, 执行并返回 expr2 的值。
expr1 ?? expr2
如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。
如果赋值是根据布尔值, 考虑使用 ?:。

var visibility = isPublic ? 'public' : 'private';

如果赋值是基于判定是否为 null, 考虑使用 ??。

String playerName(String name) => name ?? 'Guest';

下面给出了其他两种实现方式, 但并不简洁:

// Slightly longer version uses ?: operator.
String playerName(String name) => name != null ? name : 'Guest';

// Very long version uses if-else statement.
String playerName(String name) {
  if (name != null) {
    return name;
  } else {
    return 'Guest';
  }
}
级联运算符 (…)

级联运算符 (…) 可以实现对同一个对像进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性。 这通常可以节省创建临时变量的步骤, 同时编写出更流畅的代码。

考虑一下代码:

querySelector('#confirm') // 获取对象。
  ..text = 'Confirm' // 调用成员变量。
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

第一句调用函数 querySelector() , 返回获取到的对象。 获取的对象依次执行级联运算符后面的代码, 代码执行后的返回值会被忽略。

上面的代码等价于:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

级联运算符可以嵌套,例如:

final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

在返回对象的函数中谨慎使用级联操作符。 例如,下面的代码是错误的:

var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // Error: 'void' 没哟定义 'write' 函数。

sb.write() 函数调用返回 void, 不能在 void 对象上创建级联操作。

提示: 严格的来讲, “两个点” 的级联语法不是一个运算符。 它只是一个 Dart 的特殊语法。

其他运算符

大多数剩余的运算符,已在示例中使用过:

OperatorNameMeaning
()Function applicationRepresents a function call
[]List accessRefers to the value at the specified index in the list
.Member accessRefers to a property of an expression; example: foo.bar selects property bar from expression foo
?.Conditional member accessLike ., but the leftmost operand can be null; example: foo?.bar selects property bar from expression foo unless foo is null (in which case the value of foo?.bar is null)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值