官术网_书友最值得收藏!

2.4 Dart中的運算符

運算符是編程語言中重要的組成部分,程序都是由一行一行的語句組成的,表達式用來描述語句的邏輯,變量和運算符組成了表達式。

Dart支持的運算符非常豐富,包括算數運算符、比較運算符、類型運算符、復合運算符、邏輯運算符、位運算符和條件運算符等。本節我們一起來學習Dart中運算符的使用。

2.4.1 算數運算符

算數運算符通常用來進行簡單的數據運算,例如加、減、乘、除等。

四則運算是數學中基礎的運算類型。“+”用來進行相加運算。在Dart中,并非只有數值才支持加運算,字符串、列表、Map等數據類型也支持進行相加運算,例如:

    print(1+2);//3
    print("1"+"2");//12

“-”用來進行減法運算,例如:

    print(3-1);//2

當符號“-”只有一個操作數時,實際上是負號運算符,即將正數變成負數,負數變成正數,例如:

    print(-(-1));//1

乘法運算使用運算符“*”來描述,例如:

    print(2*4);//8

除法運算使用運算符“/”描述,例如:

    print(10/2);//5.0

可以看到,除法運算符無論其操作數是整數還是小數,其都會返回浮點數,如果要進行整除運算,就可以使用“~/”運算符,例如:

    print(9~/2);//4

除了上面常用的四則運算外,Dart中還提供了取模運算符,例如:

    print(9%2);//1

和C語言類似,Dart中也支持自增與自減運算符。這兩個運算符讓很多編程初學者頭疼不已,其實掌握了其中的規律,理解它們很簡單。無論是自增運算符“++”還是自減運算符“--”,其都只有一個操作數,它們可以出現在操作數的前面,也可以出現在操作數的后面,前后的差異將使計算結果完全不同。

自增運算符的作用是在當前值的基礎上自加1,即可改變當前變量的值,例如:

    var a = 3;
    a++;
    print(a);//4
    ++a;
    print(a);//5

從上面的代碼來看,無論是++a還是a++,其執行完成后,都使原變量a的值增加了1。a++的作用其實除了將變量a加1外,還會將a增加前的原始值返回,而++a的作用除了將變量a加1外,會將計算后變量a最新的值返回,從下面的打印就可以清楚地看到前置與后置的區別:

    print(a++);//打印3,這時a變成了4
    print(++a);//打印5,這時a變成了5

“--”運算符和“++”運算符的邏輯基本一致,只是其是將變量的值進行減1操作。

2.4.2 比較運算符

比較運算符的作用是進行兩個值的比較。雖然在Dart中,比較運算符的操作數可以是任意類型的值,但是對于List、Map或String對象,一般會使用函數來進行比較,比較運算符更多用于數值之間的比較。可用的比較運算符如表2-1所示。

表2-1 比較運算符

比較運算都會返回一個布爾值的結果:如果比較成立,就會返回布爾值true;如果比較不成立,就會返回布爾值false。

示例代碼如下:

2.4.3 類型運算符

Dart中的類型運算符有3種:as、is和is!。其中,as運算符用來進行類型的“轉換”,需要注意,這里的類型轉換并不是真正意義上的轉換,其并不會真正修改數據的類型,而是告訴Dart將當前數據當成某個類型的數據來進行處理。在面向對象開發中,這個運算符非常有用,后面我們會介紹。is運算符用來判斷數據是否屬于某個類型:如果屬于,就返回布爾值true;如果不屬于,就返回布爾值false。is!運算符的作用則與is剛好相反,它用來判斷數據是否不屬于某個類型,示例如下:

    var a = 1;
    var b = "2";
    print(a is int);//true
    print(b is! String);//false

2.4.4 復合運算符

簡單理解,復合運算符是多種簡單運算符的復合。復合運算符通常也叫作賦值復合運算符,因為其總是一種運算符與賦值運算符的組合。

首先,我們需要了解賦值運算符。前面也一直在使用賦值運算符,在定義變量時,需要使用“=”將某個值賦給變量,例如:

    var a = 1;

同樣,對變量進行修改時,也需要使用賦值運算符,例如:

    var a = 1;
    a = a+1;

上面代碼中的a=a+1語句中使用了兩個運算符,分別為賦值運算符和加法運算符,可以將這兩個運算符進行復合,例如:

    a+=1;

a+=1與a=a+1的作用完全一樣。表2-2列出了常用的復合運算符。

表2-2 常用的復合運算符

表2-2所列舉的運算符中也包含復合的邏輯運算與位運算符。關于邏輯運算和位運算符,我們會在后面介紹。復合運算符只是將它們的運算結果又賦值給了所運算的變量。

2.4.5 邏輯運算符

邏輯運算符是針對布爾值進行運算的運算符。我們知道,布爾值只有兩種:true和false。邏輯運算符所適用的操作數也只有true或者false。

“!”被稱為邏輯非運算符,進行邏輯非運算,它是一個前置運算符,且只有一個操作數,當操作數為布爾值true時,運算結果為布爾值false,當操作數為布爾值false時,運算結果為布爾值true。例如:

    print(!false);//true
    print(!true);//false

“||”被稱為邏輯或運算符,進行邏輯或運算。邏輯或運算遵守下面的運算規則:

(1)當兩個操作數中至少有一個操作數為true時,運算結果為true。

(2)當兩個操作數都為false時,運算結果才為false。

示例代碼如下:

    print(false||false);//false
    print(false||true);//true
    print(true||false);//true
    print(true||true);//true

“&&”被稱為邏輯與運算符,進行邏輯與運算。邏輯與運算遵守下面的運算規則:

(1)當兩個操作數中至少有一個操作數為false時,運算結果為false。

(2)當兩個操作數都為true時,運算結果為true。

示例代碼如下:

    print(false&&false);//false
    print(true&&false);//false
    print(false&&true);//false
    print(true&&true);//true

2.4.6 位運算符

位運算符是對二進制位進行操作的運算符。在計算機中,所有的數據存儲實際上采用的都是二進制。計算機元器件的高低電位對支持二進制計數有著先天的優勢,對于二進制,每一個數位只有0或1兩種情況,逢二進一。例如,十進制數10使用二進制表示為1010。

“&”用來進行按位與運算。所謂按位與運算,是指將兩個運算符的每一個二進制位分別進行與運算,即若兩個對應二進制位都為1,則運算結果為1,否則為0。例如,將10與3進行按位與運算,結果為2:

    var a = 10; //二進制 1010
    var b = 3;  //二進制 0010
    print(a&b);//2  即二進制0010

“|”用來進行按位或運算。與按位與運算一樣,按位或運算將兩個運算數的每個二進制位分別進行或運算,若兩個對應二進制位有一個為1,則運算結果為1,否則運算結果為0。例如,將10與4進行按位或運算,結果為14:

    var c = 10; //二進制 1010
    var d = 4;  //二進制 0100
    print(c|d);//14  即二進制1110

“~”用來進行按位非運算。按位非運算是一個前置的單元運算符,其只有一個操作數,對操作數的每一個二進制位進行取反,即為0的位運算后結果為1,為1的位運算后結果為0。例如,將4進行按位取反運算,結果為-5:

    var e = 4;  //00000100
    print(~e);  //11111011  以補碼表示 原碼為00000101 且為負數 即-5

理解按位非運算之前,首先需要了解在計算機中負數的表示方法。正數是用其二進制的原碼來表示,而負數則是使用補碼的方式,即首先將負數的絕對值轉換成二進制,然后進行按位取反操作,最后加1。例如-5的絕對值為5,二進制表示為00000101,按位取反后為11111010,加1后為11111011,這個數就是計算機內存中-5的表達形式,當需要取數時,會將首位作為符號位,首位為1,則表示為負數,首位為0,則表示為正數,然后根據正數和負數的不同規則將二進制碼轉換成真正的數值。

“^”用來進行按位異或運算。關于按位異或運算,只需要牢記進行運算的兩個數位相同時,運算結果為0,否則運算結果為1即可,即兩個二進制位都為0或者都為1時,運算結果為0,否則運算結果為1。例如:

    var f = 3; // 0011
    var g = 5; // 0101
    print(f^g);// 0110  十進制6

“<<”用來進行按位左移運算,即將每一個二進制位向左移動指定位數。對于二進制數據,一個很重要的特點是每左移一位,會使原數值進行乘2操作,例如:

    var h = 3;//0011
    print(h<<1);//0110  十進制6

同樣,“>>”用來進行按位右移操作,例如:

    var i = 4;//0100
    print(i>>1);// 0010  十進制2

2.4.7 條件運算符

條件運算符與流程控制語句中的條件語句作用很像。這是一種更簡潔的實現條件邏輯的方式。首先來看如下代碼片段:

運行代碼,控制臺將輸出字符串“a<=b”。我們來逐步分析上面的邏輯,首先定義兩個變量a與b,a的值為3,b的值為5,之后使用條件運算符進行條件邏輯運算,條件運算符“?:”是一個三元的運算符,其有3個操作數,第一個操作數可以是一個布爾值或者運算結果為布爾值的表達式,當這個操作數為true時,條件運算的結果為第二個操作數的值,當第一個操作數為false時,條件運算的結果為第三個操作數的值。

在實際開發中,很多時候我們需要判斷某個變量的值是否為null,不為null的時候再來做某些操作。使用條件運算符的代碼如下:

    var c = null;
    print(c==null?"無作為":"額外操作a:$c");

針對這種判空邏輯,可以使用Dart中的空條件運算符進行再次簡化,示例代碼如下:

    var c = 3;
    print(c??"無作為");

“??”是Dart中的空條件運算符,其有兩個操作數,若第一個操作數為null,則運算后的值為第二個操作數的值,若第一個操作數為非null值,則運算后的值為第一個操作數的值。這個運算符最大的作用是保證運算的結果不為null值,通常用來進行安全保證。

空條件運算符也可以和賦值運算符結合組成復合運算符,示例如下:

    var c = null;
    c ??= 0;//與c = c??0;意義完全一樣

2.4.8 級聯運算符

級聯運算符是Dart中比較高級的一種運算符,它可以讓開發者對某個對象連續地進行一系列操作。這樣的好處是可以減少中間變量的生成,并且讓開發者更暢快地體驗Dart編碼的樂趣。

級聯運算符使用“..”表示,在學習之前,我們需要先初步了解一些類的知識。關于類,后面會有專門的章節進行講解,這里你只需要了解類中屬性的相關概念即可。首先,通過前面的學習,我們知道在Dart中,整數、浮點數以及字符串都是對象,這些對象是由類構造出來的,類中定義了對象的屬性和方法。我們也可以定義自己的類,例如下面定義了一個People類:

People類中分別定義了兩個屬性:姓名與年齡。在構造類對象后,可以使用點語法來對屬性進行賦值,例如:

    var p = People();
    p.name = "琿少";
    p.age = 26;
    print("name:${p.name},age:${p.age}");//name:琿少,age:26

如上面的代碼所示,從對象的創建到屬性賦值完成使用了3行代碼,使用級聯運算符可以一行代碼搞定同樣的事情,例如:

    var p =People()..name="琿少"..age=26;
    print("name:${p.name},age:${p.age}");

簡單來說,級聯運算符的作用是對對象連續地執行一組操作,操作可以是對對象賦值,也可以是對對象方法的調用,這里不再演示。

2.4.9 點運算符

點運算符用來對對象的屬性和方法進行操作。例如對象屬性的賦值和獲取、對象方法的調用等都使用點運算符來完成,例如:

如果使用點運算符獲取了一個對象中不存在的屬性或調用了對象中不存在的方法,就會拋出異常。同樣,如果對null值使用點運算符也會產生錯誤,在實際開發中,一個變量是否為null往往不能完全確定,在Dart中有一種更加完全的對象獲取屬性或調用方法的運算符:條件成員訪問運算符“?.”。這個運算符的作用是,如果所調用的對象是非null值,就會正常進行訪問,否則返回null,但是不會產生錯誤,例如:

    var c = null;
    print(c?.a);//null
主站蜘蛛池模板: 周口市| 福州市| 南城县| 鄂托克前旗| 桃园县| 高淳县| 安平县| 东阿县| 汪清县| 郎溪县| 峨山| 收藏| 句容市| 棋牌| 桃江县| 固镇县| 拜城县| 武汉市| 高邮市| 永宁县| 高碑店市| 威远县| 武强县| 闽侯县| 襄樊市| 岳普湖县| 政和县| 隆昌县| 米泉市| 宣恩县| 涪陵区| 昌都县| 五寨县| 铁力市| 理塘县| 成安县| 潞城市| 沁水县| 天津市| 扬州市| 白沙|