[CH 5.2]演算子

5270 ワード

演算子の優先順位と連結方向


C言語などの既存言語のハイフネーションでは演算子の優先度がわかりにくい.
ただしswiftでは演算子の優先度が指定されているので、符号化時に混同に注意してください.
優先度の高い演算子は、優先度の低い演算子の前に実行されます.
プログラマが任意に定義したカスタム演算子も、このルールに基づいて実行順序を決定します.
また,演算子演算の結合方向も指定した.
連結方向は、同じ優先度の演算子の間にリストされたときにどの方向からグループ化されるかを示します.
たとえば、1 + 2 + 3 + 4という式がある場合、演算子+は同じ優先度を持ち、+の結合方向は左側であるため、(((1 + 2) + 3) + 4)のように左側からグループ化される.
// 스위프트 표준 라이브러리 연산자 정의 중 일부

infix operator === : ComparisonPrecedence
infix operator ~= : ComparisonPrecedence
infix operator &= : AssignmentPrecedence
infix operator % : MultiplicationPrecedence
基本演算子の優先度と結合方向については、swift標準ライブラリの演算子定義を参照してください.
しかし,上記のコードをどう見ても,演算子の優先度と結合方向は分からない.これは、演算子の後にコロンを付け、次に書く演算子優先度グループ(prevencegroup)を指定したためです.
swift標準ライブラリには複数の優先度グループが存在します.
// 스위프트 표준 연산자 우선순위 그룹 중 일부

precedencegroup BitwiseShiftPrecedence {
    higherThan: MultiplicationPrecedence
}

precedencegroup FunctionArrowPrecedence {
    associativity: right
    higherThan: AssignmentPrecedence
}

precedencegroup TernaryPrecedence {
    associativity: right
    higherThan: FunctionArrowPrecedence
}

precedencegroup LogicalDisjunctionPrecedence {
    associativity: left
    higherThan: TernaryPrecedence
}
上記のコードに示すように、演算子優先度グループには、高、低、相関などの優先度やマージ方向などが指定されていることがわかります.
演算子優先度グループの定義から,swift演算子優先度は絶対値ではなく相対値である.
sweeft標準ライブラリの演算子は、優先度グループの優先度でソートされます(優先度が高い)

演算子の優先度が高いほど、同じ行の演算子で優先されます.
import Foundation

let intValue: Int = 1
let resultValue1: Int = intValue << 3 + 5 // 3 + 5 => 13
let resultValue2: Int = 1 * 3 + 5         // 3 + 5 => 8
上記のコードは<,+,*演算を用いてIntタイプのエピタキシャルを計算した.
Intタイプの<<演算はBitwiseShiftPrecedence演算子優先度グループより優先される.
  • 演算は、AdditionPrecedence演算子優先度グループを優先する.
  • したがって、<<演算が+演算より先に実行されていると判断することができる.
    また、*演算はMultiplicationPrecedence演算子優先度グループよりも優先されるため、+演算が優先される.

    整理する


    今日は5番目のユニットの2番目の演算子の優先度と結合方向を学びました.
  • swiftは、演算子の優先度を決定するので、混同の状況を決定することができる.
  • はまた、演算子によって指定された結合方向を定義する.
  • swift標準ライブラリで演算子優先度グループが定義されているため、swiftは優先度別に計算できます.