4.Operators-操作符(Dart中文文档)
Dart有如下操作符:
Description | Operator |
---|---|
unary postfix | expr++ 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 | ?? |
conditional | expr1 ? expr2 : expr3 |
cascade | .. |
assignment | = *= /= ~/= %= += -= <<= >>= &= ^= |= ??= |
在操作符表中,优先级是从上到下递减。例如,即便&&在==之前,优先级是求余(%)>判断相等(==)> 且(&&)。下面代码中,计算顺序是一致的
// Parentheses improve readability.
if ((n % i == 0) && (d % i == 0)) ...// Harder to read, but equivalent.
if (n % i == 0 && d % i == 0) ...
注意:操作符左右各有一个对象,操作符具体行为是由左边的对象决定的,这个涉及到操作符重载,比如Vector和Point对象重载了+号操作符的行为,Vector+Point的+号具体行为由Vector决定。
Arithmetic operators 算术运算符
Dart supports the usual arithmetic operators, as shown in the following table.
Dart支持常见的几种算术运算符
Operator | Meaning |
---|---|
+ | Add |
– | Subtract |
-expr | Unary 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); // Result is a double
assert(5 ~/ 2 == 2); // Result is an int
assert(5 % 2 == 1); // Remainderassert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
Dart也支持自增自减运算符
Operator | Meaning |
---|---|
++var | var = var + 1 (expression value is var + 1) |
var++ | var = var + 1 (expression value is var) |
--var | var = var – 1 (expression value is var – 1) |
var-- | var = var – 1 (expression value is var) |
var a, b;a = 0;
b = ++a; // Increment a before b gets its value.
assert(a == b); // 1 == 1
Equality and relational operators 关系运算符
Operator | Meaning |
---|---|
== | Equal; see discussion below |
!= | Not equal |
> | Greater than |
< | Less than |
>= | Greater than or equal to |
<= | Less than or equal to |
验证两个对象是否相同,用==操作符,(在极少数情况下,你要判断两个对象是否完全相同,需要用identical()函数)
下面是==的判断逻辑:
步骤1.如果x,y都是null,返回true ,x,y只有一个是null,返回false
步骤2.返回x.==(y)的结果,这种写法类似a.method(params),可以将==看做x的方法。
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
a = 0;
b = a++; // Increment a AFTER b gets its value.
assert(a != b); // 1 != 0
a = 0;
b = --a; // Decrement a before b gets its value.
assert(a == b); // -1 == -1a = 0;
b = a--; // Decrement a AFTER b gets its value.
assert(a != b); // -1 != 0
Type test operators 类操作符
Operator | Meaning |
---|---|
as | Typecast (also used to specify library prefixes) |
is | True if the object has the specified type |
is! | False if the object has the specified type |
如果对象A是实现T这个类的,那么 A is T == true,is!正好相反。as的用法是将对象A强制转换为指定类型。
下面的例子是判断对象类型,如果是true,可执行对应类型的方法
if (emp is Person) {// Type checkemp.firstName = 'Bob';
}
这是上面的简化写法,如果emp是null或者不是Person类型,后续代码不会执行
(emp as Person).firstName = 'Bob';
Assignment operators 赋值运算符
As you’ve already seen, you can assign values using the = operator. To assign only if the assigned-to variable is null, use the ??= operator.
如你所知,可以用=进行赋值,如果只对空对象赋值,可以用??=。
// Assign value to a
a = value;
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;
组合赋值操作符:
= |–= |/= |%= |>>= |^=
+= |*= |~/= |<<= |&=| ||=
等效说明:
Compound assignment | Equivalent expression | |
---|---|---|
For an operator op: | a op= b | a = a op b |
Example: | a += b | a = a + b |
The following example uses assignment and compound assignment operators:
`var a = 2; // Assign using = a *= 3; // Assign and multiply: a = a * 3 assert(a == 6);
Logical operators 逻辑运算符
Operator | Meaning |
---|---|
!expr | inverts the following expression (changes false to true, and vice versa) |
&& | logical AND |
下面是逻辑运算符示例:
···
if (!done && (col == 0 || col == 3)) {
// ...Do something...
}
···
Bitwise and shift operators 位和移位操作符
你可以对数值进行移位操作
Operator | Meaning |
---|---|
& | AND |
| | OR |
^ | XOR |
~expr | Unary 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
Conditional expressions 条件表达式
Dart有两种条件表达式写法,来取代if逻辑。
condition ? expr1 : expr2
如果condition是true,返回expr1,否则返回expr2
expr1 ?? expr2
如果expr1不是null,返回expr1,否则返回expr2.
var visibility = isPublic ? 'public' : 'private';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';}
}
Cascade notation (..) 链式调用操作符
链式操作符允许你对相同对象进行多次调用而不用多次写对象名。
querySelector('#confirm') // Get an object...text = 'Confirm' // Use its members...classes.add('important')..onClick.listen((e) => window.alert('Confirmed!'));
上面的示例等效于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
You can also nest your cascades. For example:
final addressBook = (AddressBookBuilder()..name = 'jenny'..email = 'jenny@example.com'..phone = (PhoneNumberBuilder()..number = '415-555-0100'..label = 'home').build()).build();
注意,链式调用必须由对象发起,比如下面的write返回值为void,所以无法使用链式调用。
var sb = StringBuffer();
sb.write('foo')..write('bar'); // Error: method 'write' isn't defined for 'void'.
Other operators 其它操作符
Operator | Name | Meaning |
---|---|---|
() | Function application | Represents a function call |
[] | List access | Refers to the value at the specified index in the list |
. | Member access | Refers to a property of an expression; example: foo.bar selects property bar from expression foo |
?. | Conditional | member access Like ., 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) |
第四篇准备翻译 Control flow statements 流程控制
转载于:https://www.cnblogs.com/lowezheng/p/10146451.html
4.Operators-操作符(Dart中文文档)相关推荐
- Flutter 中文文档网站 flutter.cn 正式发布!
在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. 极速 (Fast):基于 Sk ...
- swift中文文档_Flutter 中文文档:使用 Packages
Flutter 支持使用其他开发者向 Flutter 和 Dart 生态系统贡献的共享 package,这意味着你可以快速构建应用而不是一切从零开始. 现有的 package 支持许多使用场景,例如, ...
- 风格指南——Solidity中文文档(10)
写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第十部分<风格指南>,特发布出来邀请solidity爱好者.开发者做公开的 ...
- Xdebug中文文档-基础特性
文档内容来自xdebug.org/docs,翻译时xdebug版本为2.6.我在官方文档基础上针对中文排版和教程内容的编排做了一些优化,希望中文文档看起来更容易理解. 英文原始文档地址:https:/ ...
- JSON Editor 中文文档
JSON Editor 中文文档 原文出处:https://www.cnblogs.com/handk/p/4766271.html JSON Editor JSON Editor 根据定义的JSON ...
- Backtrader官方中文文档
代码有所删减,完整版及在线运行可访问Backtrader官方中文文档 一. backtrader介绍 制定策略 1.1 确定潜在的可调参数 1.2 实例化您在策略中需要的指标 1.3 写下进入/退出市 ...
- Solidity 最新 0.5.8 中文文档发布
本文首发于深入浅出区块链社区 热烈祝贺 Solidity 最新 0.5.8 中文文档发布, 这不单是一份 Solidity 速查手册,更是一份深入以太坊智能合约开发宝典. 翻译说明 Solidity ...
- jsqlparser 简介、中文文档、中英对照文档 下载
jsqlparser 文档 下载链接(含jar包.源码.pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 jsqlparser-0.9.5.jar jsqlparser-0.9.5- ...
- 【Scikit-Learn 中文文档】高斯过程 - 监督学习 - 用户指南 | ApacheCN
中文文档: http://sklearn.apachecn.org/cn/0.19.0/modules/gaussian_process.html 英文文档: http://sklearn.apach ...
最新文章
- QT QSqlTabModel 学习,用于从数据库中存取修改等操作。
- 使用GAN 进行异常检测——anoGAN,TODO,待用于安全分析实验
- 子网划分 超网、路由汇总计算
- java多线程售票例子
- 华为内部面试题库---(6)
- error: failed to push some refs to 'https://gitee.com/xxx/xxx'
- python语法学习_Python学习1——语法
- android 7.0 自启管理,一款不错的android6.0、7.0权限管理器推荐
- ros ubuntu 卸载_Ubuntu18.04 ROS Melodic安装与卸载
- php libiconv close_PHP出现undefined reference to `libiconv' 错误的解决方法
- Eclipse设置护眼浅绿色背景
- k2.第一章 基于kubeadm安装kubernetes v1.20 -- 集群部署(二)
- 3D Game Programming Design:UI系统--Quest Log 公告牌
- android 圆动画效果,Android实现任意绕圆或椭圆旋转的动画——SatelliteAnimator使用介绍...
- 基于51单片机实现4位数码管动态显示
- 【转载】Visual Studio 2017各版本安装包离线下载、安装全解析
- 2014年的奋斗目标
- 计算机编程软件有哪些
- excel表在html显示图片,html背景图片不显示!如何在Excel里插入背景图片?背景图片可以打印出来吗?...
- sql 不使用引号、使用单引号或双引号的区别