Dart:3.Dart運算符、流程控制

一 . 運算符

如下列出 Dart 的運算符,從高到低按照優先級排列:html

描述 運算符
一元運算符(後置) expr++ expr-- () [] . ?.
一元運算符(前置) -expr !expr ~expr ++expr --expr
乘法運算符 * / % ~/
加法運算符 + -
按位運算符 << >>
按位與 &
按位異或 ^
按位或 |
關係與類型檢測 >= > <= < as is is!
平等 == !=
邏輯與 &&
邏輯或 ||
是否爲null ??
三目運算符 expr1 ? expr2 : expr3
級聯運算符 ..
賦值運算符 = *= /= ~/= %= += -= <<= >>= &= ^= |= ??=

使用運算符時,能夠建立表達式。如下是運算符表達式的一些示例:express

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

1 . 算術運算符

運算符 描述
+
-
-expr 一元運算減
*
/
~/ 除以,返回整數結果
% 獲取整數除法的餘數(模數)

Dart 也支持前置和後綴 遞增、遞減運算符。編程

例子:微信

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); // Remainder

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)

例子:函數

var a, b;

a = 0;
b = ++a; // Increment a before b gets its value.
assert(a == b); // 1 == 1

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 == -1

a = 0;
b = a--; // Decrement a AFTER b gets its value.
assert(a != b); // -1 != 0

2 . 比較運算符

運算符 描述
== 等於
!= 不等於
> 大於
< 小於
>= 大於或等於
<= 小於或等於

例子:oop

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

3 . ★★★★★類型檢查運算符★★★★★

使用 as ,is 和 is !運算符能夠方便地在運行時檢查類型。post

運算符 描述
as Typecast(也用於指定庫前綴)
is 若是對象具備指定的類型,則爲True
is! 若是對象具備指定的類型,則返回false

案例1:下面案例用於檢測emp是不是Person類型:測試

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

案例2:下面案例emp的類型設置爲Person類型;ui

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

提示url

若是emp爲null或不是Person,則案例1不執行任何操做,案例2會拋出異常。

4 . 賦值運算符

Dart 可使用 = 運算符賦值。

// 把value 賦值給a
a = value;
// 若是b 爲null 把 value 賦值給 b;不然b 保持不變。
b ??= value;

複合賦值運算符:

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

如下是複合賦值運算符的工做原理:

- 複合表達式 賦值表達式
複合表達式 a op= b a = a op b
例子 a += b a = a + b

例如:

var a = 2; // Assign using =
a *= 3; // Assign and multiply: a = a * 3
assert(a == 6);

5 . 邏輯運算符

運算符 描述
! 邏輯非
|| 邏輯與
&& 邏輯或

例如:

if (!done && (col == 0 || col == 3)) {
  // ...Do something...
}

6 . 按位運算符合移位運算符

您能夠在Dart中操縱數字的各個位。一般,您將使用這些按位和移位運算符和整數。

運算符 描述
& 按位或
| 按位與
^ 按位異或
~expr 按位取反
<< 左移
>> 右移

例如:

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

7 . 條件表達式(三元表達式)

條件表達式 Dart有兩個運算符,條件表達式能夠用來簡化 if-else語句。

  • condition ? expr1 : expr2

若是condition爲true,則計算expr1(並返回其值); 不然,計算並返回expr2的值。

  • expr1 ?? expr2

若是expr1爲非null,則返回其值; 不然,計算並返回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';
  }
}

8 . 級聯運算符(鏈式編程)

級聯運算符( ..),容許您對同一對象進行多項操做。

querySelector('#confirm') // 獲取html元素對象
  ..text = 'Confirm' // 訪問成員
  ..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!'));

級聯嵌套:

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: method 'write' isn't defined for 'void'.

==sb.write()==方法沒有返回write成員方法。因此拋出異常,==sb.write()==必須也使用級聯訪問。

var sb = StringBuffer();
    sb
    ..write('123')
    ..write('22');

    print(sb); // 輸出 => 12322

提示

嚴格來講,級聯的「雙點」符號不是運算符。它只是Dart語法的一部分。

9 . 其餘運算符

運算符 名稱 描述
() 函數調用 表示函數調用
[] List訪問 引用列表中指定索引處的值
. 成員訪問 訪問對象的成員屬性
?. 條件的成員訪問 在不明確對象是否存在的狀況下使用 ?. 訪問對象的成員

?. 運算符使用案例:

class Test {
    num member = 1;
}

void main() {
  var test = null;
  print(test?.member); // 返回null 不會拋出異常
  test = new Test();
  print(test?.member); // 返回 1
}

二 . 流程控制

1 . 條件控制

A . if 和 else

if...else語句塊的語法

if(boolean_expression){ 
   // statement(s) will execute if the Boolean expression is true. 
} else { 
   // statement(s) will execute if the Boolean expression is false. 
}

流程圖

在這裏插入圖片描述

Dart 支持 帶有 if 和 else 的語句:

void main() { 
   var num = 12; 
   if (num % 2==0) { 
      print("偶數"); 
   } else { 
      print("奇數"); 
   } 
}

輸出結果

偶數

與JavaScript不一樣,條件必須使用布爾值。不能使用其餘類型,但可使用 null。

B . switch 和 case

switch語句計算表達式,並將表達式的值與case子句指定的值匹配,而後執行與該case相關的語句。

switch/case語句的語法

switch(variable_expression) { 
   case constant_expr1: { 
      // statements; 
   } 
   break; 
   case constant_expr2: { 
      //statements; 
   } 
   break; 

   default: { 
      //statements;  
   }
   break; 
}
  • switch中能夠有任意數量的case語句。
  • case語句只能包含常量,它不能是變量或表達式。
  • variable_expression和常量表達式的數據類型必須匹配。
  • 除非你在每一個代碼塊以後放置break語句,不然執行會流入下一個break塊。
  • case表達式必須是惟一的。
  • default塊是可選的。

流程圖

在這裏插入圖片描述

void main() { 
   var grade = "A"; 
   switch(grade) { 
      case "A": {  print("至關牛逼"); } 
      break; 
      case "B": {  print("厲害"); } 
      break; 
      case "C": {  print("通常"); } 
      break; 
      case "D": {  print("二愣子"); } 
      break; 
      default: { print("Invalid choice"); } 
      break; 
   } 
}

結果輸出

至關牛逼

該示例根據常量集(A,B,C,D和E)驗證變量等級的值,並執行相應的塊。若是變量中的值與上面提到的任何常量都不匹配,則將執行默認(default)塊。

2 . 循環控制

循環的分類

在這裏插入圖片描述

A . for 循環和for…in循環

for循環

for循環是一個肯定循環的實現,用於執行代碼塊指定的次數。

for循環的語法

for (initial_count_value; termination-condition; step) { 
   //statements 
}

示例

void main() { 
   var num = 5; 
   var factorial = 1; 

   for( var i = num ; i >= 1; i-- ) { 
      factorial *= i ; 
   } 
   print(factorial); 
}

輸出結果

120

for...in循環

通常用於循環對象的屬性

for...in循環的語法

for (variablename in object){  
   statement or block to execute  
}

示例

void main() { 
   var obj = [12,13,14]; 

   for (var prop in obj) { 
      print(prop); 
   } 
}

輸出結果

12 
13 
14

B . while 和 do-while 循環

while循環

流程圖

在這裏插入圖片描述

while循環的語法

while (expression) {
   Statement(s) to be executed if expression is true  
}

示例

void main() { 
   var num = 5; 
   var factorial = 1; 

   while(num >=1) { 
      factorial = factorial * num; 
      num--; 
   } 
   print("The factorial  is ${factorial}"); 
}

輸出結果

The factorial is 120

do...while循環

do...while循環中至少執行代碼塊一次

流程圖

在這裏插入圖片描述

do-while循環的語法

do {  
   Statement(s) to be executed;  
} while (expression);

示例

void main() { 
   var n = 10; 
   do { 
      print(n); 
      n--; 
   }
   while(n>=0); 
}

輸出結果

10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0

C . break 和 continue

使用 break 中止程序循環

示例

void main() { 
   var i = 1; 
   while(i<=10) { 
      if (i % 5 == 0) { 
         print("The first multiple of 5  between 1 and 10 is : ${i}"); 
         break ;    
         //exit the loop if the first multiple is found 
      } 
      i++; 
   }
}

輸出結果

The first multiple of 5 between 1 and 10 is: 5

使用 continue 跳轉到下一次迭代

示例

void main() { 
   var num = 0; 
   var count = 0; 

   for(num = 0;num<=20;num++) { 
      if (num % 2==0) { 
         continue; 
      } 
      count++; 
   } 
   print(" The count of odd values between 0 and 20 is: ${count}"); 
}

輸出結果

The count of odd values between 0 and 20 is: 10

3 . forEach()循環

若是對象實現了 Iterable 接口的對象,可使用 forEach()接口 (例如,list 或者 set)

main() {
  List list = [123, '123', 'postbird'];
  list.forEach((f)=> print(f));
}

輸出結果

123
123
postbird

4 . 斷言 Assert

若是 assert 語句中的布爾條件爲 false , 那麼正常的程序執行流程會被中斷。 assert 語句只在開發環境中有效, 在生產環境是無效的;

// 確認變量值不爲空。
assert(text != null);
// 確認變量值小於100。
assert(number < 100);
// 確認 URL 是不是 https 類型。
assert(urlString.startsWith('https'));

歡迎掃面下列二維碼關注「餘弦的自留地」公衆微信號
在這裏插入圖片描述 萬物之中,但願至美

相關文章
相關標籤/搜索