연산자 연관성

Operator associativity

프로그래밍 언어 이론에서, 연산자연관성괄호 없이 같은 우선순위를 가진 연산자들이 어떻게 그룹화되는지를 결정하는 속성이다.오퍼랜드가 연산자 앞과 뒤에 모두 있는 경우(예:^ 3 ^이들 연산자는 동등한 우선순위를 가지며, 피연산자는 2개의 다른 연산(즉, 2개의 연산자가 나타내는 2개의 연산)에 대한 입력으로 사용할 수 있습니다.오퍼랜드를 적용할 오퍼랜드의 선택은 오퍼레이터의 연관성에 따라 결정됩니다.연산자는 어소시에이션(연산을 임의로 그룹화할 수 있음), 왼쪽 어소시에이션(연산이 왼쪽에서 그룹화됨을 의미), 오른쪽 어소시에이션(연산이 오른쪽에서 그룹화됨) 또는 비어소시에이션(출력 타입이 입력 타입과 호환성이 없기 때문에, 동작을 체인으로 할 수 없음)입니다.연산자의 연관성과 우선순위는 프로그래밍 언어 정의의 일부입니다. 프로그래밍 언어마다 동일한 유형의 연산자에 대한 연관성과 우선순위가 다를 수 있습니다.

이 표현을 생각해 보세요.a ~ b ~ c오퍼레이터가~관련성을 떠났습니다.이 표현은 다음과 같이 해석됩니다.(a ~ b) ~ c연산자의 연관성이 올바르면 이 표현은 다음과 같이 해석됩니다.a ~ (b ~ c)연산자가 연관성이 없는 경우 표현식이 구문 오류이거나 특별한 의미가 있을 수 있습니다.일부 수학 연산자는 고유한 연관성을 가지고 있습니다.예를 들어, 뺄셈과 나눗셈은 기존의 수학 표기법에서 사용되는 것과 같이 본질적으로 좌연관적입니다.반면 덧셈과 곱셈은 좌우 모두 연관성이 있다.(예:(a * b) * c = a * (b * c)).

많은 프로그래밍 언어 매뉴얼은 연산자 우선 순위 및 연관성에 대한 표를 제공합니다. 예를 들어, C 및 C++의 표를 참조하십시오.

여기서 설명하는 표기적 연관성의 개념은 수학적 연관성과 관련이 있지만, 수학적 연관성과는 다릅니다.수학적으로 연관성이 있는 연산은 정의상 알림적 연관성이 필요하지 않습니다(예를 들어 덧셈에는 연관성이 있으므로 왼쪽 연관성도 오른쪽 연관성도 필요하지 않습니다).그러나 수학적으로 연관성이 없는 연산은 공지로 왼쪽, 오른쪽 또는 비관련성이어야 합니다(예를 들어 뺄셈에는 연관성이 없기 때문에 공지로 연관성이 있어야 합니다).

연관성이 필요한 것은 식 내 연산자의 우선순위가 같은 경우 뿐입니다.보통+그리고.-같은 우선순위를 가지다이 표현을 생각해 보세요.7 - 4 + 2결과는 다음과 같습니다.(7 - 4) + 2 = 5또는7 - (4 + 2) = 1전자의 결과는 다음과 같은 경우에 해당된다.+그리고.-왼쪽 연관성이 있습니다.후자부터 다음 시점까지+그리고.-우파와 관련이 있습니다.

정상적인 사용을 반영하기 위해 더하기, 빼기, 곱하기 나눗셈 연산자는 일반적으로 좌연관이며,[1][2][3][4][5] 지수 연산자([6]존재하는 경우)와 Knuth의 화살표 연산자의 경우 일반적인 합의가 없다.할당 연산자는 일반적으로 오른쪽 연관성을 가집니다.오퍼랜드가 2개의 연산자와 관련지어지거나 연산자가 전혀 없는 경우를 방지하려면 같은 우선순위를 가진 연산자는 동일한 연관성을 가져야 합니다.

상세한 예

이 표현을 생각해 보세요.5^4^3^2, 그 안에서^는 오른쪽 관련 지수 연산자로 간주됩니다.왼쪽에서 오른쪽으로 토큰을 읽어내는 파서는 브랜치에 관련지음 규칙을 적용합니다.이는 의 오른쪽 관련성 때문입니다.^, 다음과 같이 합니다.

  1. 용어5읽혀지고 있습니다.
  2. 비터미널^읽혀지고 있습니다.노드: "5^".
  3. 용어4읽혀지고 있습니다.노드: "5^4".
  4. 비터미널^이 읽혀져 오른쪽 어소시에이티비티 규칙이 트리거 됩니다.연관성에 따라 노드가 결정됩니다.5^(4^".
  5. 용어3읽혀지고 있습니다.노드: "5^(4^3".
  6. 비터미널^이 읽혀지고 right-associativity 규칙의 재적용이 트리거됩니다.노드 "5^(4^(3^".
  7. 용어2읽혀지고 있습니다.노드 "5^(4^(3^2".
  8. 읽을 토큰이 없습니다.연관성을 적용하여 구문 분석 트리 생성 "5^(4^(3^2))".

그 후, 이것은, 톱 노드(첫 번째 노드)로부터 시작해, 깊이 우선으로 평가할 수 있습니다.^):

  1. 평가자는 첫 번째에서 두 번째에서 세 번째까지 트리를 내려갑니다.^표현.
  2. 이 값은2 3 = 9로 평가됩니다.결과는 식 분기를 두 번째 피연산자의 두 번째 피연산자로 대체합니다.^.
  3. 평가는9 구문 분석 트리의 한 단계 위쪽으로 4 = 262144로 계속됩니다.다시, 첫 번째 오퍼랜드의 두 번째 오퍼랜드로서 expression branch가 결과로부터 대체됩니다.^.
  4. 다시, 평가자는 트리를 루트 표현으로 끌어올려 5 as262144 6.2060699 × 10으로183230 평가합니다.마지막 남은 분기가 접히고 결과가 전체 결과가 되므로 전체 평가가 완료됩니다.

왼쪽 관련 평가 결과 구문 분석 트리가 생성되었을 것입니다.((5^4)^3)^2그리고 완전히 다른 결과 625, 244140625, 그리고 마지막으로 ~5.9604645 × 10이16 됩니다.

할당 연산자의 권리 관련성

많은 명령형 프로그래밍 언어에서 할당 연산자는 오른쪽 어소시에이션으로 정의되며 할당은 단순한 문장이 아닌 표현식(값으로 평가)으로 정의됩니다.그러면 다음 할당식의 오른쪽 피연산자로 한 할당식의 값을 사용하여 연쇄 할당을 할 수 있습니다.

C에서 할당은a = b식과 같은 값으로 평가되는 식입니다.b유형으로 변환되다aR-값 저장의 부작용과 함께bL값으로a그러므로 [a]표현은a = (b = c)로 해석할 수 있다b = c; a = c;. 대체 표현(a = b) = c에러가 발생합니다.a = bL-값 식이 아닙니다. 즉, R-값은 있지만 R-값을 저장할 L-값은 없습니다.c의 권리 관련성=연산자는 다음과 같은 식을 허용합니다.a = b = c로 해석되다a = (b = c).

C++에서는 할당이a = b식과 같은 값으로 평가되는 식입니다.aR-값 저장의 부작용과 함께b의 L값으로a그러므로 표현은a = (b = c)여전히 로 해석할 수 있다b = c; a = c;그리고 다른 표현은(a = b) = c로 해석할 수 있다a = b; a = c;에러를 발생시키는 대신.의 오른쪽 관련성=연산자는 다음과 같은 식을 허용합니다.a = b = c로 해석되다a = (b = c).

비관련 연산자

비관련 연산자는 식에서 순서대로 사용할 때 정의된 동작이 없는 연산자입니다.Prolog의 infix 연산자:-비관련성이며, 그 이유는 다음과 같은 구성 요소가 있기 때문입니다.a :- b :- c" 는 구문 오류를 나타냅니다.

또 다른 가능성은 특정 연산자의 시퀀스가 연관성으로 표현될 수 없는 다른 방식으로 해석될 수 있다는 것입니다.이는 일반적으로 구문적으로 이러한 동작의 시퀀스에 대한 특별한 규칙이 존재하며 의미론적으로 동작이 다르다는 것을 의미합니다.좋은 예가 Python에 있는데, Python은 이러한 [7]구조를 여러 개 가지고 있습니다.할당은 연산이 아닌 문이므로 할당 연산자는 값이 없고 연관성이 없습니다.연쇄 할당은 대신 할당 시퀀스에 대한 문법 규칙을 사용하여 구현됩니다.a = b = c다음으로 왼쪽에서 오른쪽으로 할당됩니다.또한 다음과 같이 할당과 추가 할당의 조합이 있습니다.a = b += cPython에서는 합법적이지 않지만 C는 합법적입니다.또 다른 예로는 다음과 같은 비교 연산자가 있습니다.>,==,그리고.<=...와 같은 연쇄 비교a < b < c로 해석되다(a < b) and (b < c), 어느 쪽에도 해당하지 않습니다.(a < b) < c또는a < (b < c)를 클릭합니다.[8]

「 」를 참조해 주세요.

메모들

  1. ^ 표현식은 세미콜론(즉, 세미콜론)을 사용하여 스테이트먼트로 만들 수 있습니다. a = b표현이지만a = b;는 스테이트먼트입니다.

레퍼런스

  1. ^ Bronstein, Ilja Nikolaevič; Semendjajew, Konstantin Adolfovič (1987) [1945]. "2.4.1.1.". In Grosche, Günter; Ziegler, Viktor; Ziegler, Dorothea (eds.). Taschenbuch der Mathematik (in German). Vol. 1. Translated by Ziegler, Viktor. Weiß, Jürgen (23 ed.). Thun and Frankfurt am Main: Verlag Harri Deutsch (and B. G. Teubner Verlagsgesellschaft, Leipzig). pp. 115–120. ISBN 3-87144-492-8.
  2. ^ Chemnitz Technology University of Technology: 오퍼레이터의 우선순위와 연관성 (아카이브 번역)
  3. ^ 교육 장소:작업 순서
  4. ^ 아카데미:작업 순서, 타임스탬프 5m40
  5. ^ 버지니아 교육청:조작 순서 사용속성 탐색, 섹션 9
  6. ^ 지수 연관성과 표준 산술 표기법 코데플레아.2016년 8월 23일2016년 9월 20일 회수.
  7. ^ Python Language Reference, "6. 식"
  8. ^ Python Language Reference, "6. 식": 6.9. 비교