URLhttps://learnscript.net/zh-hant/programming/operations/operators/
    複製連結移至說明  範例

    運算子介紹

    閱讀 6:27·字數 1938·發佈 
    Youtube 頻道
    訂閱 480

    運算子

    對於程式中存在的各種資料,他們的一項重要活動就是參與運算,而運算需要通過運算子來完成,他會根據特定的規則,對給出的運算元進行運算,然後傳回運算的結果。

    什麽是運算元?

    運算元是指參與運算子運算的具體目標,他們可以是常值,變數,運算式,以及可傳回或包含值的實體。

    運算子是一種特殊的函式?

    不管程式碼中的運算子是如何書寫的,他們與函式在本質上是相同的,均被用於完成某種運算,並具有輸入和輸出,與運算子關聯的運算元類似於函式的參數。

    指派運算子

    指派運算子會將右運算元的計算結果賦予左運算元,最為常見的是=。當然,指派運算子可以變得更為複雜,比如,+=會先將右運算元的計算結果與左運算元的計算結果相加,再將相加的結果賦予左運算元。

    指派運算子的左運算元需要是一個可儲存值的實體,比如,變數,類別的屬性等。

    指派運算子對運算元資料型別的要求

    指派運算子右運算元所計算出的值的資料型別,需要與左運算元保持一致,或可進行隱含轉換,如果語言要求型別安全的話。

    在 C# 中,直接將10000000指派給字串型別的變數是行不通的,因為整數型別不能隱含轉換為字串型別。

    operators.cs
    // ERROR 下面的指派是錯誤的,整數型別無法隱含轉換為字串型別
    string num = 10000000;

    算術運算子

    算術運算子用於對運算元進行數學運算,這包含了經典的加減乘除(+-*/),遞增(++),遞減(--)等。

    字串型別的加法運算

    需要指出,在大部分語言中,對字串使用加法算術運算子(+),相當於將左右兩邊的字串拼接在一起,然後作為一個新的字串傳回。

    比較運算子

    比較運算子一般用於對比兩邊的運算元是否相等,不相等,大於,小於,大於等於或小於等於,並傳回一個表示對比結果的布林值。

    比較運算子的嚴格比較

    由於運算元升階的存在,一些語言支援嚴格的比較運算子,以避免資料型別發生隱含轉換。

    在 JavaScript 中,運算式1=='1'將傳回true,而1==='1'將傳回false,因為===是嚴格的比較運算子,不允許隱含轉換。

    operators.js
    // == 允許資料型別隱含轉換,運算式結果為 true
    console.log(1 == '1')
    // == 不允許資料型別隱含轉換,運算式結果為 false
    console.log(1 === '1')
    true
    false

    值,資料型別

    想要了解資料型別的隱含轉換,你可以檢視資料型別轉換一段。

    邏輯運算子

    邏輯運算子通常用於流程控製,他的表面效果為判斷左右兩邊的條件是否全部成立(&&and),或左右兩邊的條件是否至少一個成立(||or),或條件是否不成立(!not)。

    什麽是邏輯運算子的短路解析?

    事實上,邏輯運算子只是傳回左右兩邊某個運算元的計算結果,這些結果將等價於一個布林值,當運算沒有必要繼續進行時,右運算元將被丟棄,這被稱為短路解析。

    在下面的 JavaScript 程式碼中,'A'&&'B'傳回'B',因為需要計算左右兩邊的運算元,才能確保條件均成立,'A'||'B'傳回'A',因為左運算元已確保有一個條件成立,沒有必要再計算右運算元。

    operators.js
    // 'A' 和 'B' 都會被計算
    console.log('A' && 'B')
    // 'A' 會被計算 ,'B' 將被丟棄
    console.log('A' || 'B')
    B
    A

    位元運算子

    位元運算子進行的計算,是以運算元的二進位格式為基礎的,你可能很少見到該運算子的出現,因為他的作用比較隱晦,一般是為了實作數學上的某些驚人訣竅。

    運算元升階

    當運算子運算元的資料型別不相同時,可能會進行運算元升階,運算元將被隱含轉換為某種資料型別,然後才會參與運算。至於升階的具體規則,需要視具體的運算子和語言而定。

    在下面的 C# 程式碼中,1會隱含轉換為浮點數型別,然後再與1f進行加法運算。

    operators.cs
    // 1 會被隱含轉換為浮點數型別
    Console.WriteLine((1f + 1).GetType());
    System.Single

    運算子優先順序

    當一個運算式中存在多個運算子時,將按照他們的優先順序來決定處理順序。如果你不能確定,那麽可以使用()括住希望優先處理的部分,這在大部分語言中是可行的。比如,對於運算式1*2+3,可以使用()來優先處理加法運算子,1*(2+3)

    運算子關聯性

    如果運算子的優先順序相同,那麽先處理誰取決於運算子的關聯性,大部分的二元運算子是左關聯的,計算會按照從左到右的順序進行,比如,1+2+3的計算順序是(1+2)+3,而不是1+(2+3)。至於右關聯運算子,其數量較少,指派運算子是其中之一,比如,a=b=c的計算順序是a=(b=c),而不是(a=b)=c

    運算元計算順序

    在一個運算式中,運算元的計算順序與運算子的優先順序或關聯性無關,他們會從左到右依次被計算。

    在下面的 JavaScript 程式碼中,運算元b()c()並沒有因為()而被優先計算。

    operators.js
    // 四個作為運算元的函式
    a = () => {
    	console.log('a')
    	return 1
    }
    b = () => {
    	console.log('b')
    	return 2
    }
    c = () => {
    	console.log('c')
    	return 3
    }
    d = () => {
    	console.log('d')
    	return 4
    }
    
    // b() 和 c() 並不會被優先計算 const result = a() / (b() + c()) * d() console.log(result)
    a
    b
    c
    d
    0.8

    原始碼

    operators.cs·codebeatme/programming·GitHub
    operators.js·codebeatme/programming·GitHub