연산자(컴퓨터 프로그래밍)
Operator (computer programming)컴퓨터 프로그래밍에서 연산자는 일반적으로 함수와 같이 동작하지만 구문적 또는 의미적으로 다른 프로그래밍 언어 내에서 정의된 구조입니다.
일반적인 간단한 예로는 산술(예를 들어 와의 덧셈), 비교(예를 들어 "greater than")가 있습니다.>
논리 연산(예:AND
, 도 기재되어 있습니다.&&
를 참조해 주세요).보다 복잡한 예로는 할당(통상은)이 있습니다.=
또는:=
레코드 또는 오브젝트의 필드 액세스(통상은).
및 스코프 분해능 연산자(종종)::
또는.
)언어는 보통 일련의 빌트인 연산자를 정의하고 경우에 따라서는 사용자가 기존 연산자에 새로운 의미를 부여하거나 완전히 새로운 연산자를 정의할 수도 있습니다.
구문
구문 연산자는 일반적으로 함수와 대조됩니다.대부분의 언어에서 함수는 고정된 우선순위 수준과 연관성을 가진 특별한 형식의 접두사 연산자로 간주될 수 있으며, 종종 다음과 같은 필수 괄호를 사용한다.Func(a)
(또는(Func a)
(Lisp)로 표시됩니다.대부분의 언어는 프로그래머 정의 함수를 지원하지만 프리픽스 표기법 이상의 우선순위 수준을 가지지 않는 한 프로그래머 정의 연산자를 지원한다고 주장할 수 없습니다.의미론적으로 연산자는 다른 호출 표기와 제한된 수의 파라미터(일반적으로 1 또는 2)를 가진 특별한 형식의 함수라고 볼 수 있습니다.
오퍼랜드에 대한 연산자의 위치는 프리픽스, infix 또는 postfix일 수 있으며 연산자가 관여하는 식의 구문은 해당 오퍼랜드의 arity(operand의 수), precedence 및 (해당하는 경우), 연관성에 따라 달라집니다.대부분의 프로그래밍 언어는 이진 연산자와 소수의 단항 연산자를 지원하며, 소수의 단항 연산자는 3진수인 C의 ?: 연산자와 같이 더 많은 피연산자를 지원합니다.단항 마이너스 등의 접두사 단항 연산자가 있습니다.-x
및 포스트픽스 단항 연산자(예: 포스트픽스) x++
; 및 바이너리 연산은 다음과 같이 혼재합니다.x + y
또는x = y
. 상위 arity의 infix 연산은 다음과 같이 C에서 3진 연산자 ?:와 같은 추가 기호를 필요로 합니다.a ? b : c
– 실제로 이것이 유일한 일반적인 예이기 때문에 종종 3차 연산자로 불린다.단, 프리픽스 및 포스트픽스 조작은 다음과 같은 임의의 에일리티를 지원할 수 있습니다.1 2 3 4 +
.
언어의[1][2] 일부분은 언어의 설명 또는 구현을 단순화하기 위해 "matchfix"[3][4] 또는 "circumfix" 연산자로 기술될 수 있습니다.confix 연산자는 피연산자를 둘러싼 두 개 이상의 부분으로 구성됩니다.conceptfix 연산자는 그 내용이 평가되고 그 결과 값이 주변 식에서 사용되므로 가장 높은 우선순위를 가집니다.가장 친숙한 confix 연산자는 위에서 언급한 괄호이며, 표현식의 어느 부분을 다른 부분보다 먼저 평가해야 하는지를 나타내기 위해 사용됩니다.물리학의 또 다른 예는 디락의 브라켓 표기법의 내적 표기법이다.원주변수 연산자는 많은 오퍼랜드 또는 다양한 수의 오퍼랜드를 포함하는 연산을 나타낼 때 특히 유용합니다.
언어 지정은 지원하는 연산자의 구문을 지정하는 반면 프로그래머 정의 연산자를 지원하는 Prolog와 같은 언어에서는 프로그래머에 의해 구문이 정의되어야 합니다.
의미론
연산자의 의미는 특히 값, 평가 전략 및 인수 전달 모드(부울 단락 등)에 따라 달라집니다.단순히 연산자가 포함된 식을 어떤 방식으로 평가하여 결과 값이 값(r-값)일 수도 있고 할당을 허용하는 개체(l-값)일 수도 있습니다.
단순한 경우 이는 일반적인 함수 호출과 동일합니다(예: addition).x + y
일반적으로 함수 호출과 동등합니다.add(x, y)
비교도 안 되는x < y
로.lt(x, y)
즉, 인수는 통상적인 방법으로 평가되며, 그 후 일부 함수가 평가되고 결과가 값으로 반환됩니다.그러나 의미론은 크게 다를 수 있습니다.예를 들어 할당에서a = b
목표물a
는 평가되지 않고 대신 위치(주소)를 사용하여 값을 저장합니다.b
– 참조별 콜 의미론에 대응합니다.또한 할당은 문(값 없음)일 수도 있고, 식(값)일 수도 있으며, 값 자체가 r-값(값만) 또는 l-값(할당 가능)일 수도 있다.또 다른 예로는 스코프 해결 연산자 :: 및 요소 액세스 연산자 입니다( 참조).Foo::Bar
또는a.b
)는 값이 아닌 이름(기본적으로 이름별 콜 의미론)으로 동작하며 값은 이름입니다.
연산자 피연산자로 l-값을 사용하는 것은 단항 증분 연산자와 감소 연산자에서 특히 두드러진다.예를 들어 C에서 다음 문장은 합법적이고 명확하게 정의되어 있으며 어레이 인덱싱이 l-값을 반환한다는 사실에 따라 달라집니다.
x = ++a[i];
중요한 용도는 왼쪽 관련 이진 연산자가 왼쪽 인수를 수정한 후(또는 부작용을 생성하는) 해당 인수를 l-값으로 [a]평가하는 경우입니다.이것에 의해, 원래의 인수에 영향을 주는 일련의 연산자가 가능하게 되어, 메서드 캐스케이딩과 같이, 유연한 인터페이스가 가능하게 됩니다.일반적인 예로는<<
C++ 연산자iostream
다음과 같이 fluent 출력을 가능하게 하는 라이브러리.
외치다 << > "안녕하세요" << > " " << > "세상!" << > 끝;
사용자 정의 연산자
언어에는 고정된 수의 내장 연산자가 포함될 수 있습니다(예: C 및 C++, PHP의 +, -, *, <, <=, !, = 등) 또는 프로그래머 정의 연산자(예: Prolog,[5] Seed7,[6] F#, OCaml, Haskell)를 생성할 수 있습니다.일부 프로그래밍 언어에서는 연산자 기호를 + 또는 :=와 같은 특수 문자로 제한하는 반면 다른 언어에서는 다음과 같은 이름을 허용합니다.div
(예: Pascal).
대부분의 언어에는 연산자 집합이 내장되어 있지만 [b]파싱이 상당히 복잡하기 때문에 사용자 정의 연산자를 허용하지 않습니다.많은 언어에서 연산자를 내장형에만 사용할 수 있지만 다른 언어에서는 기존 연산자를 사용자 정의 유형에 사용할 수 있습니다. 이를 연산자 오버로드라고 합니다.그러나 일부 언어에서는 컴파일 시 또는 실행 시 새 연산자를 정의할 수 있습니다.여기에는 메타 프로그래밍(다른 언어로 연산자 지정) 또는 언어 자체가 포함될 수 있습니다.새로운 연산자의 정의, 특히 런타임 정의는 종종 프로그램의 정확한 정적 분석을 불가능하게 만든다. 왜냐하면 언어의 구문이 튜링-완전일 수 있기 때문이다. 따라서 구문 트리를 구축하는 것조차 정지 문제를 해결해야 할 수 있다.예를 들어 Perl이나 Lisp의 일부 방언에 대해 발생합니다.
예
구문적으로 다른 일반적인 예로는 수학적인 산술 연산이 있습니다.예를 들어 ">"는 "greater than"을 의미하며, 함수에 대한 언어의 식별자 집합 외부에 이름이 있으며 함수를 호출하기 위한 언어의 구문과는 다른 구문을 사용하여 호출됩니다.함수로서 "greater than"은 일반적으로 다음과 같은 식별자에 의해 명명됩니다.gt
또는greater_than
함수로 호출됩니다.gt(x, y)
대신 특수 문자를 사용합니다.>
(이것은 어휘 분석 중에 별도로 토큰화된다), 및 iix 표기법으로서x > y
.
의미론적으로 (인수 전달 모드에 따라) 다른 일반적인 예는 종종 단락 평가를 특징으로 하는 부울 연산입니다.예를 들어, 엄격한 값별 콜 함수를 가진 언어로 이전의 인수만 false가 아닌 경우에만 평가하는 Short Circuit Conjection(X AND Y).대신 if/then/else와 동일하게 동작합니다.
덜 일반적인 연산자는 다음과 같습니다.
- 쉼표 연산자:
e, f
- 참조 해제 연산자:
*p
및 주소 연산자:&x
- ?: 또는 3진 연산자:
number = spell_out_numbers ? "forty-two" : 42
- 엘비스 오퍼레이터:
x ?: y
- 엘비스 오퍼레이터:
- Null 병합 연산자:
x ?? y
- 우주선 연산자(3방향 비교):
x <=> y
편수
컴파일러는 서브루틴 호출 또는 인라인 코드를 사용하여 연산자와 함수를 구현할 수 있습니다.언어에 의해 지원되는 일부 빌트인 연산자는 중앙 처리 장치에서 흔히 볼 수 있는 소수의 명령어에 대한 직접 매핑을 가지고 있지만, 다른 연산자(예를 들어 문자열 연결을 표현하기 위해 사용되는 '+')는 복잡한 구현을 가지고 있을 수 있습니다.
연산자 오버로드
일부 프로그래밍 언어에서 연산자는 특별 다형성일 수 있습니다. 즉, 하나 이상의 데이터에 대한 정의를 가지고 있습니다(예를 들어 자바에서는 + 연산자가 숫자의 추가와 문자열의 연결을 위해 사용됩니다).이러한 연산자는 과부하 상태라고 합니다.프로그래머(C++ 등)에 의한 연산자 오버로드를 지원하지만 연산자 집합이 제한된 언어에서 연산자 오버로드는 연산자를 위한 맞춤형 용도를 정의하기 위해 종종 사용됩니다.
이 예에서는IF ORDER_DATE > "12/31/2011" AND ORDER_DATE < "01/01/2013" THEN CONTINUE ELSE STOP
연산자는 ">" (보다 큼), "AND" 및 "<" (보다 작음)입니다.
오퍼랜드 강제
일부 언어에서는 오퍼레이터의 오퍼랜드를 조작에 적합한 데이터 타입으로 암묵적으로 변환하거나 강제할 수도 있습니다.예를 들어 Perl에서 강제 규칙은 다음과 같이 이어집니다.12 + "3.14"
결과를 낳다15.14
본문"3.14"
추가가 이루어지기 전에 3.14로 변환됩니다.더,12
정수입니다.3.14
는 부동소수점 또는 고정소수점 번호(소수점 자릿수가 들어간 번호)이므로 정수는 부동소수점 또는 고정소수점으로 각각 변환됩니다.
JavaScript는 반대되는 규칙을 따릅니다.상기와 같은 식을 찾으면 정수를 변환합니다.12
끈으로 묶어서"12"
다음으로 2개의 오퍼랜드를 연결하여"123.14"
.
언어에 강제력이 있는 경우, 프로그래머는 미묘한 프로그래밍 오류를 피하기 위해 오퍼랜드 유형과 연산 결과 유형에 관한 특정 규칙을 알고 있어야 합니다.
프로그래밍 언어의 연산자 기능
다음 표는 여러 프로그래밍 언어로 된 오퍼레이터 기능을 보여줍니다.
프로그래밍 언어 | 영숫자가 아닌 연산자 기호 | 영숫자 연산자 기호 | 프리픽스 | 인픽스 | 포스트픽스 | 우선 순위 | 연관성 | 과부하 | 프로그래머 정의 오버로드 | 프로그래머 정의 연산자 기호 |
---|---|---|---|---|---|---|---|---|---|---|
알골 68 | +* ** * / %* %× - + < = > = /= & : = + : = * : = / : = % : = + = : / = : / = : / = : = : / = : / = : : = : : = : = : (모든 연산자에는 굵은 영숫자(c.f. next column)가 있습니다.일부에는 ASCII가 아닌 다음 c.f.)가 있습니다).× +× ↑↓ ⌊ × ⌊ × × ÷ * □ □ × : □ ÷ × : = ÷ × : = × * : = % × : = : : : : : : : : | 것은 아니다. 복근 arg 휴지통 엔티어 늘이다 수평 이상한 반응하다 둥글다 짧게 하다 i 할 수 있다 날카롭게 하다 업. 밑. lwb 업 그것 움직이다 ge gt 이큐 하지 않다 그리고. 또는 에 걸쳐서 모드 일람 마이너스 탭 플러스 탭 타임사브 디바브 오버아브 모뎀 플라스틱 는 하지 않다 | 네. | 네. | 아니요. | ○(프리픽스 연산자는 항상 priority 10을 가집니다. | infix 연산자는 왼쪽 어소시에이션, 프리픽스 연산자는 오른쪽 어소시에이션 | 네. | 네. | 네. |
APL | + - × ÷ ⌈ ⌊ * ⍟ ! ○ ~ ∨ ∧ ⍱ ⍲ < ≤ = ≥ > ≠ . @ ≡ ≢ ⍴ , ⍪ ⍳ ↑ ↓ ? ⍒ ⍋ ⍉ ⌽ ⊖ ∊ ⊥ ⊤ ⍎ ⍕ ⌹ ⊂ ⊃ ∪ ∩ ⍷ ⌷ ∘ → ← / ⌿ \ ⍀ ¨ ⍣ & ⍨ ⌶ ⊆ ⊣ ⊢ ⍠ ⍤ ⌸ ⌺ ⍸ | 영숫자 기호는 키워드 앞에 ''가 필요합니다. | 있음(1차 기능만 해당) | 네. | 있음(고차 함수만 해당) | 1차 함수보다 고차 함수가 우선합니다. | 고차 함수는 왼쪽 연관성, 1차 함수는 오른쪽 연관성 | 네. | 네. | 있음(영숫자만 해당) |
C | ( ) [ ] -> . ~ + + -- + - * & / % < > < = > < === > != ^ & ? : = + = * = % = & = | 크기 | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. | 아니요. |
C++(더 보기) | 크기 유형 신규 삭제하다 던지다 타이프 해제 static_cast 동적 캐스트 재해석_캐스트 const_캐스트 | 네. | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. | |
C#(더 보기) | C/C++와 마찬가지로 ?[] ? ? ? ? ? = | 새 stackalloc wait throw가 선택되지 않은 이름 크기는 위임 기본값 true false입니다. LINQ: 그룹 선택...그룹별로...에...에...에...에...에...에...에...에...에...에...에...에...에...에...에...에...에...에...에...주문에 따라...내림차순 Roslyn 한정: __makeref __refvalue __reftype | 네. | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. |
자바 | C/C++와 동일 | 신규 던지다 인스턴스 | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. | 아니요. |
에펠 | [] + - * / // = /= | "그리고" "혹은" "혹은"이 아닌, 또는 암시하는 | 네. | 네. | 아니요. | 네. | 네. | 아니요. | 네. | 네. |
하스켈 | + - * / ^ ^^ ** == /= > < = < = & > = > > $ ! . + + !: 일반 라이브러리에서 더 많은 기능 | 함수의 이름을 백틱에 입력해야 합니다. | 네. | 네. | 아니요. | 네. | 네. | 예, 유형 클래스 사용 | 네. | |
파스칼 | * / + - = < > < = > = : = | div mod 및 또는 그 중 하나라도 | 네. | 네. | 아니요. | 네. | 네. | 네. | 아니요. | 아니요. |
펄 | -> + + -- ** ~ \ + - . = ~~ * / % < === > = < > ~ & ^ & ' | sort chmod chdir rand 또는 not lt gt le geq ne cmp x를 출력합니다. | 네. | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. |
PHP | [ ] ** + + -- ~ [7]@ ! / % + - . < > < === > === !==== !==== < ==== > < = > & ^ & ? : = + = ** = / = % = = = ^ = < > | 및 또는 xor의 설정되지 않은 새 인쇄 에코 Isset 인스턴스 복제 | 네. | 네. | 네. | 네. | 네. | 아니요. | 아니요. | 아니요. |
PL/I | ( ) -> + - * / ** > > = = < = > < > & | 네. | 네. | 아니요. | 네. | 네. | 아니요. | 아니요. | 아니요. | |
프롤로그 | :- ?- ; , . =..= \= < > = > == \== - + / * | spy nospy는 mod가 아니다. | 네. | 네. | 네. | 네. | 네. | 아니요. | 아니요. | 네. |
라쿠 | ++ -- **! ~~ * / + - . < === > = < = > & ^ & // [8] | sort chmod chdir rand 또는 xor lt gt le geq ne leg cmp x xx 를 출력합니다. | 네. | 네. | 네. | 네. | 네. | 네. | 네. | 네, 그렇습니다[9]. |
시드7 | {} [ ] -> ** ! + - * / < > & > < = < > = < = < = + : = - = * : = / : = < : > : = & : @ : = | conv varConv 구문 분석 consa div rem mdiv mod x mult in not 및/또는 digits lpad rpad lpad0 | 네. | 네. | 네. | 네. | 네. | 네. | 네. | 네. |
스몰토크 | (예 - 최대 2글자[10]) | 영숫자 기호에서는 키워드 뒤에 콜론이 필요합니다. | 아니요. | 네. | 네. | 아니요. | 아니요. | 네. | 네. | 네. |
재빠르다 | 를 제외한 모든 Unicode 기호 문자열(표준 라이브러리의 ! ~ + * / % = + = - = - = / = % & - & * = & - & * = & & + = & & & > =!= < > > = < > = ? < > < > < > ? < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < | 그대로인가요? | 네. | 네. | 네. | 있음(우선순위 그룹에서 부분 순서로 정의됨) | 있음(우선순위 그룹의 일부로 정의됨) | 네. | 네. | 네. |
Visual Basic.그물 | ( ) . ? ( ) ? ? ! + - * / \ & < > < = ^ = + = * = / = = ^ = < = > | 새로운 Wait Like Mod Is Not And And And 또는 OrElse Xor If(...) If(...) GetXml Namespace(...) NameOf(...) 유형...Type Of는...IsNot DirectCast(...) TryCast(...) CType(...) CBool(...) CByte(...) CChar(...) CDec(...) CDbl(...) CNg(...) COBJ(...) CSBy(te) CSBy(hort...) LINQ: 집계에서...구분 선택 위치 <주문 기준>로... Where < Order By >)]로...[내림차순] <Take While> 생략 <Skip While> 그룹화...By...Into Join...에 참여...<그룹 참여>에서...On...Into> | 네. | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. |
「 」를 참조해 주세요.
메모들
레퍼런스
- ^ "Operator Input Forms—Wolfram Language Documentation". reference.wolfram.com.
- ^ "Maxima 5.42.0 Manual: 7. Operators". maxima.sourceforge.net.
- ^ "Prefix, Postfix and Circumfix Operators". mythryl.org.
- ^ "Operators". doc.perl6.org.
- ^ "SWI-Prolog -- op/3". www.swi-prolog.org.
- ^ "Declare an operator". seed7.sourceforge.net.
- ^ "PHP: Error Control Operators - Manual". php.net.
- ^ "Operators". docs.perl6.org.
- ^ "Functions". docs.perl6.org.
- ^ Goldberg, Adele. "Smalltalk-80: The Language and its Implementation, p. 27, ISBN 0-201-11371-6" (PDF).