描述 | 運算符 |
---|---|
一元后綴 | expr++ expr-- () [] . ?. |
一元前綴 | -expr !expr ~expr ++expr --expr |
乘法類型 | * / % ~/ |
加法類型 | + - |
移動 位運算 |
<< >> |
與 位運算 |
& |
異或 位運算 |
^ |
或 位運算 |
| |
關係和類型測試 | >= <= > < as is is! |
等式 | == != |
邏輯與 | && |
邏輯或 | || |
條件 | expr1 ? expr2 : expr3 |
級聯 | .. |
賦值 | = *= /= ~/= %= += -= <<= >>= &= ^= |= ??= |
a++ a + b a = b a == b c ? a : b a is T
==
要高,而==
操做符的優先級又比邏輯與操做符&&
要高。這些操做符的優先級順序將在下面的兩行代碼中體現出來:// 1.使用括號來提升可讀性 if ((n % i == 0) && (d % i == 0)) // 2.難以閱讀,可是和上面等價 if (n % i == 0 && d % i == 0)
警告:對於二元運算符,其左邊的操做數將會決定使用的操做符的種類。例如,當你使用一個 Vector 對象以及一個 Point 對象時, aVector + aPoint 使用的 + 是由Vector 所定義的。函數
操做符 | 含義 |
---|---|
+ |
加 |
- |
減 |
-expr |
一元減號,也被命名爲負號(使後面表達式的值反過來) |
* |
乘 |
/ |
除 |
~/ |
返回一個整數值的除法 |
% |
取餘,除法剩下的餘數 |
示例:測試
assert(2 + 3 == 5); assert(2 - 3 == -1); assert(2 * 3 == 6); assert(5 / 2 == 2.5); // 結果是double類型 assert(5 ~/ 2 == 2); // 結果是一個整數 assert(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 |
示例:ui
var a, b; a = 0; b = ++a; // 在b得到其值以前自增a assert(a == b); // 1 == 1 a = 0; b = a++; //在b得到值後自增a assert(a != b); // 1 != 0 a = 0; b = --a; // 在b得到其值以前自減a assert(a == b); // -1 == -1 a = 0; b = a--; // 在b得到值後自減a assert(a != b); // -1 != 0
(比較)
運算符的含義。運算符 | 含義 |
---|---|
== |
等於 |
!= |
不等於 |
> |
大於 |
< |
小於 |
>= |
大於等於 |
<= | 小於等於 |
==
運算符。在極少數狀況下,您須要知道兩個對象是不是徹底相同的對象,請改用experation()
函數。==
運算符的工做原理:x.==(y)
。(這個調用是正確的,像==
這樣的運算符其實是由第一個操做數所調用的一個方法。你能夠重寫大部分運算符。assert(2 == 2); assert(2 != 3); assert(3 > 2); assert(2 < 3); assert(3 >= 3); assert(2 <= 3);
as
、is
和 is!
操做符在運行時用於檢查類型很是方便。操做符 | 含義 |
---|---|
as |
類型轉換 |
is |
當對象是相應類型時返回 true |
is! |
當對象不是相應類型時返回 true |
obj
實現了T
所定義的藉口,那麼obj is T
將返回 true。好比,obj is Object
必然返回 true。as
操做符能夠把一個對象轉換爲特定類型。通常來講,若是在is
測試以後還有一些關於對象的表達式,你能夠把as
當作是is
測試的一種簡寫。考慮下面這段代碼:if (emp is Person) { // Type check emp.firstName = '永動機'; }
你也能夠經過as
來簡化代碼:spa
(emp as Person).firstName = '永動機';
注意:上面兩段代碼並不相等。若是emp的值爲 null 或者不是一個 Person 對象,第一段代碼不會作任何事情,第二段代碼會報錯 。code
=
運算符賦值。要僅在變量爲null時賦值,請使用??=
運算符。// 賦值給a a = value; // 若是b爲空,則將值分配給b;不然,b保持不變 b ??= value;
+=
之類的複合賦值運算符將操做與賦值相結合= |
-= |
/= |
%= |
>>= |
^= |
---|---|---|---|---|---|
+= |
*= |
~/= |
<<= |
&= |
|= |
複合賦值 | 等式表達式 | |
---|---|---|
對於操做符op | a op b |
a = a op b |
具體例子1 | a += b |
a = a + b |
具體例子2 | a -= b |
a = a - b |
下面的示例使用賦值運算符和複合賦值運算符:對象
var a = 2; //賦值使用 = a *= 3; // 賦值且相乘 a = a * 3 assert(a == 6);
操做符 | 含義 |
---|---|
!expr |
反轉如下表達式(將false更改成true,反之亦然) |
|| |
邏輯或 |
&& |
邏輯與 |
if (!done && (col == 0 || col == 3)) { // ...Do something... }
一般咱們指☞位運算爲
<<
或>>
移動位運算,經過操做位的移動來達到運算的目的,而&
,|
,^
,~expr
也是操做位來達到運算的目的。因此本文統稱這些運算都爲位運算blog
操做符 | 含義 |
---|---|
& |
與 |
| |
或 |
^ |
異或 |
~expr |
一元位補碼( 0s變爲1s;1s變爲0s ) |
<< |
左移 |
>> |
右移 |
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); // 右移
if-else
語句的表達式:
condition ? expr1 : expr2
若是條件爲真,返回expr1,不然返回expr2expr1 ?? expr2
若是expr1爲非空,則返回其值expr1;不然,計算並返回expr2的值。
?:
var visibility = isPublic ? 'public' : 'private';
若是布爾表達式測試爲空,考慮使用??
索引
String playerName(String name) => name ?? 'Guest';
// 稍微長一點的版本使用 ?: 操做符 String playerName(String name) => name != null ? name : 'Guest'; // 很是長的使用if - else語句的版本 String playerName(String name) { if (name != null) { return name; } else { return 'Guest'; } }
示例代碼:it
querySelector('#confirm') // 獲取一個對象 ..text = 'Confirm' // 使用它的成員 ..classes.add('important') ..onClick.listen((e) => window.alert('Confirmed!'));
querySelector()
,返回一個selector對象。遵循級聯符號的代碼對這個selector對象進行操做,忽略任何可能返回的後續值。前面的例子至關於:io
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'); // 錯誤:沒有爲「void」定義的方法「write」。
sb.write()
調用返回void,你不能在void上構建級聯。
注意:嚴格來講,級聯的「雙點」符號不是運算符。這只是Dart語法的一部分。
操做符 | 名稱 | 含義 |
---|---|---|
() |
函數應用 | 表示函數調用 |
[] |
列表訪問 | 指列表中指定索引處的值 |
. |
成員訪問 | 指表達式的屬性;示例: foo.bar 從表達式foo 中選擇屬性foo。若是左邊的操做數爲null時,會崩潰,這個時候能夠用下面的(?.) |
?. |
條件成員訪問 | 跟. 差很少,可是最左邊的操做數能夠爲空;例子:foo?.bar 從表達式foo 中選擇屬性bar ,除非foo 爲空(在這種狀況下,foo?.bar 值爲空) |