Flutter—Dart运算符

Dart支持下表所示的操作符:

描述

运算符

一元后缀

expr++ expr-- () [] ?[] . ?. !

一元前缀

-expr !expr ~expr ++expr --expr await expr

乘、除、求模、整除

* / % ~/

加减

+ -

移位

<< >> >>>

位与

&

位异或

^

位或

|

关系测试和类型测试

>= > <= < as is is!

相等性

== !=

逻辑关系(和)

&&

逻辑关系(或)

||

如果是null

??

条件语句

expr1 ? expr2 : expr3

级联

.. ?..

赋值

= *= /= += -= &= ^= etc.

  • 算术运算符

运算符

描述

+

-

-expr

一元减号,也称为否定号(将表达式的符号颠倒)

*

/

~/

整除, 返回一个整数结果

%

整数除法(取模)的余数

代码演示:

assert(2 + 3 == 5);assert(2 - 3 == -1);assert(2 * 3 == 6);assert(5 / 2 == 2.5);  // 结果是 doubleassert(5 ~/ 2 == 2);  // 整除---结果是 intassert(5 % 2 == 1);  // 求模--结果是余数assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
  • 前缀和后缀的递增和递减操作符

操作符

描述

++var

var = var + 1 (表达式的值是 var + 1)

var++

var = var + 1 (表达式的值是 var)

--var

var = var - 1 (表达式的值是 var - 1)

var--

var = var - 1 (表达式的值是 var)

代码演示:

int a;int b;a = 0;b = ++a;   // 在b得到它的值之前a+1assert(a == b);   // 1 == 1a = 0;b = a++;    // 在b得到它的值后a+1assert(a != b);    // 1 != 0a = 0;b = --a;    // 在b得到它的值之前a-1assert(a == b);   // -1 == -1a = 0;b = a--;   // 在b得到它的值后a-1assert(a != b);   // -1 != 0
  • 关系运算符

运算符

描述

==

等于

!=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

代码演示:

assert(2 == 2);assert(2 != 3);assert(3 > 2);assert(2 < 3);assert(3 >= 3);assert(2 <= 3);
  • 类型测试操作符

运算符

描述

as

类型转换(也用于指定库前缀)

is

如果对象是指定的类型,则为true

is!

如果对象不是指定的类型,则为true

  • 赋值运算符

=

*=

%=

>>>=

^=

+=

/=

<<=

&=

|=

-=

~/=

>>=

??=


可以使用=操作符赋值。仅当赋值变量为null时才进行赋值,使用??=运算符。

代码演示:

// 将一个value值赋值给aa = value;// 如果b为空,赋值给b; 否则,b保持不变b ??= value;


复合赋值

等效式

操作符op:

a op= b

a = a op b

示例:

a += b

a = a + b

代码演示:

var a = 2; a *= 3;  // a = a * 3assert(a == 6);
  • 逻辑运算符

运算符

描述

!expr

反转表达式的值(将false改为true,或将true改为false)

||

逻辑关系(或)

&&

逻辑关系(和)

代码演示:

if (!done() && (col == 0 || col == 3)) {    // ..Todo...}
  • 位和位移操作符

操作符

描述

&

|

^

异或

~expr

一元位补码(0变成1;1变成0)

<<

左移

>>

右移

>>>

无符号右移

>>>运算符(称为三重移位或无符号移位)要求语言版本至少为2.14

代码演示:

final value = 0x22;final bitmask = 0x0f;assert((value & bitmask) == 0x02); // 与assert((value & ~bitmask) == 0x20); // 与非assert((value | bitmask) == 0x2f); // 或assert((value ^ bitmask) == 0x2d); // 异或assert((value << 4) == 0x220); // 左移assert((value >> 4) == 0x02); // 右移assert((value >>> 4) == 0x02); // 无符号右移assert((-value >> 4) == -0x03); // 右移动assert((-value >>> 4) > 0); // 无符号右移
  • 条件表达式

Dart有两个操作符,可以简化if-else语句的表达式。

表达式

描述

condition ? expr1 : expr2

如果condition为真,计算expr1(并返回其值); 否则,计算并返回expr2的值。

expr1 ?? expr2

如果expr1非空,返回其值;否则,计算并返回expr2的值。

代码演示:

var visibility = isPublic ? 'public' : 'private'String playerName(String? name) => name ?? 'Guest';
  • 级联运算符

级联(. .?..)允许你在同一个对象上进行一系列操作。除了访问实例成员之外,还可以调用同一对象上的实例方法。这通常省去了创建临时变量的步骤,并允许您编写更流畅的代码。

代码演示:

var paint = Paint()  ..color = Colors.black  ..strokeCap = StrokeCap.round  ..strokeWidth = 5.0;

以上代码相当于进行了如下操作:

var paint = Paint();paint.color = Colors.black;paint.strokeCap = StrokeCap.round;paint.strokeWidth = 5.0;

如果级联操作的对象可以为空,那么对第一个操作使用空级联(?..)。保证不会在空对象上尝试任何级联操作。

querySelector('#confirm') // 获取一个对象  ?..text = 'Confirm' // 使用它的成员  ..classes.add('important')  ..onClick.listen((e) => window.alert('Confirmed!'))  ..scrollIntoView();

以上代码相当于进行了如下操作:

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

也可以嵌套使用级联操作,例如:

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

操作符

名称

描述

()

函数

表示一个函数调用。

[]

根据下标访问数组元素

例如: list[1]获取list元素位置为1的值

?[]

条件下标访问

[] 类似,但是会先判断list是否为空

.

成员访问

访问类的成员

?.

条件成员访问

与.类似,但是先判断对象实例是否为空

!

非空断言

将表达式强制转换为其基础的非空类型,如果强制转换失败,则抛出运行时异常

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章