다음을 통해 공유


우선 순위 및 결합성

우선 순위 및 연관성은 연산자가 적용되는 순서를 정의합니다. 우선 순위가 더 높은 연산자는 먼저 인수(피연산자)에 바인딩되고, 우선 순위가 같은 연산자는 연관성 방향으로 바인딩됩니다. 예를 들어, 덧셈과 곱셈의 우선 순위에 따른 식 1+2*31+(2*3)과 동일하고, 지수가 오른쪽 결합이므로 2^3^42^(3^4)와 같습니다.

연산자

다음 표에는 Q#에서 사용 가능한 연산자와 해당 우선 순위 및 연관성이 나와 있습니다. 추가 한정자 및 조합기도 나와 있으며 이러한 연산자보다 더 밀접하게 바인딩됩니다.

설명 구문 연산자 associativity 우선 순위
복사 및 업데이트 연산자 w/ <- 삼항 left 1
range 연산자 .. 중위 left 2
조건부 연산자 ? \| 삼항 right 3
논리적 OR or 중위 left 4
논리적 AND and 중위 left 5
비트 OR \|\|\| 중위 left 6
비트 XOR ^^^ 중위 left 7
비트 AND &&& 중위 left 8
equality == 중위 left 9
같지 않음 != 중위 left 9
less-than-or-equal <= 중위 left 10
less-than < 중위 left 11
greater-than-or-equal >= 중위 left 11
greater-than > 중위 left 11
right shift >>> 중위 left 12
left shift <<< 중위 left 12
덧셈 또는 연결 + 중위 left 13
subtraction - 중위 left 13
multiplication * 중위 left 14
division / 중위 left 14
모듈러스 % 중위 left 14
exponentiation ^ 중위 right 15
비트 NOT ~~~ prefix right 16
논리적 NOT not prefix right 16
마이너스 - prefix right 16

복사 및 업데이트 식은 해당 evaluate-and-reassign 문의 일관된 동작을 보장하기 위해 가장 낮은 우선 순위를 가져야 합니다. 해당 컨텍스트 식의 일관된 동작을 보장하기 위해 범위 연산자에 대해서도 유사한 고려 사항이 있습니다.

한정자 및 결합자

한정자는 특정 식에만 적용할 수 있는 특수 연산자로 볼 수 있습니다. 해당 동작을 캡처하기 위해 인위적인 우선 순위를 할당할 수 있습니다.

자세한 내용은 을 참조하세요.

다음 표에는 이 인위적인 우선 순위가 나와 있습니다. 또한 연산자 및 한정자의 우선 순위가 항목 액세스 조합기(각각 [, ]::) 및 호출 조합기((, ))가 밀접하게 바인딩되는 방법과 어떤 관련이 있는지도 설명합니다.

설명 구문 연산자 associativity 우선 순위
호출 결합자 ( ) 해당 없음 left 17
수반 행렬 펀터 Adjoint prefix right 18
제어된 펀터 Controlled prefix right 18
애플리케이션 래핑 해제 ! 접미사 left 19
명명된 항목 액세스 :: 해당 없음 left 20
배열 항목 액세스 [ ] 해당 없음 left 20
함수 람다 -> 해당 없음 right 21
연산 람다 => 해당 없음 right 21

할당된 우선 순위의 의미를 설명하기 위해 DoNothing 일항 연산(특수화 선언에서 정의하고 있음), 일항 연산을 반환하는 GetStatePrep 호출 가능 항목 및 다음과 같이 정의된 Algorithm 형식의 항목을 포함하는 algorithms 배열이 있다고 가정합니다.

    newtype Algorithm = (
        Register : Qubit[],
        Initialize : Transformation,
        Apply : Transformation
    );

    newtype Transformation =
        Qubit[] => Unit is Adj + Ctl;

그러면 다음 식이 모두 유효합니다.

    GetStatePrep()(arg)
    (Transformation(GetStatePrep()))!(arg)
    Adjoint DoNothing()
    Controlled Adjoint DoNothing(cs, ())
    Controlled algorithms[0]::Apply!(cs, _)
    algorithms[0]::Register![i]

위의 표에 정의된 우선 순위를 살펴보면 후속 래핑 해제 연산자를 반환되는 연산이 아니라 Transformation 값에 적용하기 위해 (Transformation(GetStatePrep())) 주위의 괄호가 필요하다는 것을 알 수 있습니다. 그러나 GetStatePrep()(arg)에는 괄호가 필요하지 않습니다. 함수는 왼쪽에서 오른쪽으로 적용되므로 이 식은 (GetStatePrep())(arg)와 동일합니다. 또한 함자 애플리케이션에는 해당 특수화를 호출하기 위해 괄호가 필요하지 않으며 배열 또는 명명된 항목 액세스 식도 필요하지 않습니다. 따라서 arr2D[i][j] 식은 algorithms[0]::Register![i]와 마찬가지로 완벽하게 유효합니다.