관계 연산자

Relational operator

컴퓨터 과학에서 관계 운영자는 두 실체 사이의 어떤 종류의 관계를 시험하거나 정의하는 프로그래밍 언어 구성 또는 운영자다.여기에는 수치적 평등(예: 5 = 5)과 불평등(예: 4 3)이 포함된다.

Pascal, Ada 또는 Java와 같이 유형 시스템에 구별되는 부울 데이터 유형을 포함하는 프로그래밍 언어에서, 이들 연산자는 대개 두 연산자 사이의 조건부 관계가 유지되는지 여부에 따라 참 또는 거짓으로 평가한다.C와 같은 언어에서 관계 연산자는 정수 0 또는 1을 반환하며, 여기서 0은 거짓을 의미하며 0이 아닌 값은 참을 의미한다.

관계형 연산자를 사용하여 만들어진 표현식은 관계형 표현식 또는 조건이라고 불리는 것을 형성한다.관계형 연산자는 논리 술어의 특수한 사례로 볼 수 있다.

평등

사용법

평등은 많은 프로그래밍 언어 구성과 데이터 유형에서 사용된다.세트에 요소가 이미 존재하는지 테스트하거나 키를 통해 값에 액세스하는 데 사용된다.스위치 문장에서 제어 흐름을 올바른 분기로 전송하기 위해, 그리고 로직 프로그래밍에서 통일 과정 동안에 사용된다.

평등의 한 가지 가능한 의미는 "만약 a가 b와 같다면, ab 중 하나를 어떤 맥락에서든 어떠한 차이도 감지하지 않고 서로 교환하여 사용할 수 있다"는 것이다.그러나 특히 콘텐츠 평등과 함께 돌연변이를 고려할 때 이 진술이 반드시 유지되는 것은 아니다.

위치 평등 vs 콘텐츠 평등

때때로, 특히 객체 지향 프로그래밍에서, 비교는 데이터 유형상속, 평등, 그리고 정체성에 대한 문제를 제기한다.흔히 다음과 같이 구별할 필요가 있다.

  • 같은 유형의 서로 다른 두 개의 물체(예: 두 손)
  • 동일하지만 구별되는 두 가지 물건, 예를 들어 10달러 지폐 두 개
  • 두 개 사물은 동일하지만 표현은 다르다(예: 1달러 지폐와 1달러 동전).
  • 동일한 개체에 대한 두 개의 서로 다른 참조(예: 동일한 사람에 대한 두 개의 별명)

많은 현대 프로그래밍 언어에서 개체와 데이터 구조는 참조를 통해 액세스된다.그러한 언어에서, 두 가지 다른 종류의 평등을 시험할 필요가 있다.

  • 위치 동일성(identity): 두 개의 참조(A와 B)가 동일한 객체를 참조하는 경우.A를 통한 물체와의 상호작용은 B를 통한 동일한 상호작용과 구별할 수 없으며, 특히 A를 통한 물체에 대한 변화는 B를 통해 반영된다.
  • 내용 평등: 두 개의 참조(A와 B)가 참조하는 개체가 어떤 의미에서는 등가인 경우:
  • 구조적 평등(즉, 그들의 내용은 동일하다).얕은 부분(직접 하위 부분만 포함) 또는 깊은 부분(재귀적으로 하위 부분의 동일성에 대한 고려)일 수 있다.이것을 달성하기 위한 간단한 방법은 표현적 평등을 통해서입니다: 가치들이 동일한 표현을 가지고 있는지 확인하는 것.
  • 외부 행동을 보존하는 다른 맞춤식 평등.예를 들어 1/2과 2/4는 합리적인 숫자로 볼 때 동등하다고 간주된다.가능한 요건은 반사성, 대칭성트랜스티비티 외에 "물체 A와 B에 대한 모든 연산이 동일한 결과를 가질 경우에만 A = B"가 될 수 있다.

첫 번째 유형의 평등은 보통 두 번째를 내포하지만(NaN과 같이 스스로에게 불평등한 숫자가 아닌 것(NaN)을 제외한다), 그 반대는 반드시 사실인 것은 아니다.예를 들어, 두 개의 문자열 개체는 구별되는 객체(첫 번째 의미에서는 부적격)일 수 있지만, 같은 순서의 문자(두 번째 의미에서는 동일함)를 포함할 수 있다.이 문제에 대한 자세한 내용은 ID를 참조하십시오.

많은 단순 분수를 포함한 실제 숫자는 부동 소수 산술에서 정확히 나타낼 수 없으며 주어진 공차 내에서 동등성을 시험할 필요가 있을 수 있다.그러나 그러한 허용오차는 Transitivity와 같은 원하는 속성을 쉽게 깨뜨릴 수 있는 반면, 반사율 역시 파괴된다. IEEE 부동소수점 표준은 NaN NaN을 보유하도록 요구한다.

계산 가능한 함수와 같은 다른 프로그래밍 요소들은 평등의식이 없거나 평등의식이 없을 수 있다.이러한 이유로, 일부 언어들은 "비교적"의 명시적 개념을 베이스 클래스, 인터페이스, 특성 또는 프로토콜의 형태로 정의하는데, 이는 소스 코드의 선언에 의해 또는 관련 유형의 구조를 통해 암묵적으로 사용된다.

다른 유형의 값 비교

자바스크립트, PHP, VBScript 및 기타 몇 개의 동적으로 입력된 언어에서 표준 평등 운영자는 두 값이 같을 경우 true로 평가하여, 비록 서로 다른 유형을 가졌을지라도, 숫자 4가 텍스트 문자열 "4"와 비교된다.또한 이러한 언어에서 유형화된 평등 연산자는 동일하거나 동등한 유형의 값(PHP에서, PHP)에 대한 반환을 사용할 수 있다.4 === "4"비록 거짓이지만4 == "4"사실이다.[1][2]숫자 0이 거짓으로 해석될 수 있는 언어의 경우, 이 운영자는 0에 대한 확인과 같은 것들을 단순화할 수 있다.x == 0형식 불가지론적 평등 연산자를 사용하는 x가 0 또는 "0"인 경우 참일 수 있다).

주문

숫자가 아닌 데이터의 비교보다 크거나 작을 경우 프로그래밍 언어에 내장되거나 프로그래머가 구성할 수 있는 분류 규칙(예: 텍스트 문자열의 경우 사전 순서)에 따라 수행된다.

숫자 값을 두 데이터 항목(예: a와 b)의 비교 결과와 연관시키고자 할 때, 통상적인 관례는 < b는 -1, a = b는 0, a = b는 1을 할당하는 것이다.예를 들어, C 함수는strcmp3원 비교를 수행하고 이 규칙에 따라 -1, 0 또는 1을 반환하며, qsort는 비교 함수가 이 규칙에 따라 값을 반환할 것으로 예상한다.정렬 알고리즘에서는 정렬 성능에 기여하는 주요 요인 중 하나이기 때문에 비교 코드의 효율성이 매우 중요하다.

프로그래머 정의 데이터 유형(프로그래밍 언어가 내장되어 있지 않은 데이터 유형)의 비교는 사용자 정의 쓰기 또는 라이브러리 기능(예:strcmp위에서 언급한) 또는 일부 언어에서는 비교 연산자에 과부하를 가함으로써, 즉 비교되는 데이터 유형에 따라 달라지는 프로그래머 정의 의미를 할당한다.또 다른 대안은 구성원들의 비교와 같은 관습을 사용하는 것이다.

논리적 등가성

부울 논리 연산자 XOR, AND, OR, NOT와 같이 처음에는 분명하지 않을 수 있지만 관계 연산자는 논리적 동등성을 갖도록 설계될 수 있으며, 따라서 모두 서로에 대해 정의될 수 있다.다음의 네 가지 조건문은 주어진 x와 y 에 대해 모두 동일한 논리적 동등성 E(모든 참 또는 모든 거짓)를 갖는다.

이것은 잘 정돈된 도메인에 의존한다.

표준 관계 연산자

프로그래밍 언어에 사용되는 가장 일반적인 수치 관계 연산자는 다음과 같다.

공통 관계 운영자
컨벤션 와 같은 에 필적하지 않다 보다 더 큰 보다 적은 보다 더 큰
또는 와 동등하다
보다 적은
또는 와 동등하다
출판 중인 = > <
포트란[주 1] .EQ. .NE. .GT. .LT. .GE. .LE.
알골 68[주2] = > <
/= >= <=
eq ne gt lt ge le
APL = > <
베이직, ML, 파스칼[note 3] = <> > < >= <=
덤프 = '= > < '< '>
루아 == ~= > < >= <=
C형[주4] == != > < >= <=
얼랑 == /= > < >= =<
=:= =/=
본라이크 조개껍질[주5] -eq -ne -gt -lt -ge -le
배치 파일 EQU NEQ GTR LSS GEQ LEQ
매트랩[주6] == ~= > < >= <=
eq(x,y) ne(x,y) gt(x,y) lt(x,y) ge(x,y) le(x,y)
포트란 90,[note 7] 하스켈 == /= > < >= <=
매스매티카[3] == != > < >= <=
Equal[x,y] Unequal[x,y] Greater[x,y] Less[x,y] GreaterEqual[x,y] LessEqual[x,y]
  1. ^ FORTRAN II, III, IV, 66, 77을 포함한다.
  2. ^ ALGOL 68: 스트로핑 체제는 문자 집합이 제한된 플랫폼(예: 사용)에서 코드에서 사용된다.>=또는GE대신에)), 플랫폼이 없는 플랫폼bold 강조하다(사용하다)'ge'() 또는 UPERCASE만 있는 플랫폼(사용).GE 또는 'GE').
  3. ^ ALGOL, Simula, Modula-2, 에펠, SQL, 스프레드시트 수식 등을 포함한다.
  4. ^ C, C++, C#, Go, Java, JavaScript, Perl(숫자 비교 전용), PHP, Python, Ruby, R을 포함한다.
  5. ^ Bourne Shell, Bash, KornShellWindows PowerShell 포함.기호들<그리고>일반적으로 방향을 바꾸기 위해 쉘에서 사용되므로 다른 기호를 사용해야 한다.하이픈이 없으면 Perl에서 문자열 비교를 위해 사용된다.
  6. ^ MATLAB는 C와 유사한 구문을 사용하는 다른 측면에서는 사용하지 않는다.!=, 로서!MATLAB에서는 다음 텍스트를 명령줄로 운영 체제에 전송한다.제1형식도 스몰토크(Smalltalk)에서 사용하는데, 평등을 제외하면, 이 형식은 다음과 같다.=.
  7. ^ FORTRAN 95, 2003, 2008 및 2015 포함.

다른 관습은 덜 일반적이다.Common LispMacsyma/Maxima는 불평등을 제외한 Basic 유사 연산자를 사용한다./=Common Lisp 및#맥시마/맥시마에서사용된 오래된 Lispsequal,greaterp그리고lessp; 그리고 다음을 사용하여 부정했다.not나머지 운영자를 위해

구문

관계 운영자는 말 대신 기술 문헌에도 사용된다.관계형 연산자는 일반적으로 프로그래밍 언어에 의해 지원되는 경우 infix 표기법으로 쓰여지는데, 이는 연산자 사이에 나타나는 것을 의미한다(두 표현은 연관되어 있다).예를 들어, xy보다 작을 경우 Python의 식이 메시지를 인쇄한다.

만일 x < y:     인쇄하다("x는 이 예제에서 y보다 작음") 

Lisp와 같은 다른 프로그래밍 언어는 다음과 같이 접두사 표기법을 사용한다.

(>= X Y) 

연산자 체인

수학에서는 관계 운영자를 연쇄적으로 연결하는 것이 일반적인 관례인데, 예를 들면 3 < x < y < 20> (3 < x < x < x 그리고 x < y > 20)을 의미한다.)수학에서 이러한 관계형 연산자는 타동적이기 때문에 구문은 분명하다.

그러나 최근의 많은 프로그래밍 언어들은 3 < x < y>와 같은 표현을 두 개의 좌(또는 우) 연관 연산자로 구성하여, 그것을 다음과 같은 것으로 해석할 것이다.(3 < x) < yx=4라고 하면.(3 < 4) < y, 그리고 평가들은 줄 것이다.true < y일반적으로 말이 되지 않는 것.그러나, C/C++와 일부 다른 언어로 컴파일하여 놀라운 결과를 낳는다(여기서 1번으로 표현될 수 있음).

라는 표현을 할 수 있다.x < y < z그것의 친숙한 수학적인 의미와 파이톤과 라쿠 같은 프로그래밍 언어들은 그렇게 한다.C#와 Java와 같은 다른 것들은 그렇지 않다. 부분적으로는 그것은 대부분의 다른 infix 운영자들이 C와 같은 언어로 일하는 방식과 다르기 때문이다.D 프로그래밍 언어는 C와 어느 정도 호환성을 유지하고 있기 때문에 그렇게 하지 않으며, "C표현을 허용하지만 미묘하게 다른 의미론(논의할 수 없이 올바른 방향)을 갖는 것은 편리함보다 혼란을 가중시킬 것이다."[4]

Common Lisp과 같은 일부 언어는 이에 대해 다중 인수 술어를 사용한다.인 리스프(<= 1 x 10)x가 1에서 10 사이일 때 참이다.

할당 운영자와의 혼동

초기 FORTRAN(1956-57)은 매우 제한된 문자 집합에 의해 제한되었다.=유일한 관계 운영자였어없었다.<또는>(그리고 확실히 아니다)또는이 때문에 설계자는 다음과 같은 기호를 정의해야 했다..GT.,.LT.,.GE.,.EQ.기타 등등. 그리고 그 후에 나머지 것을 사용하는 것을 유혹했다.=수학적 용법과의 명백한 불일치에도 불구하고 복사를 위한 문자(문자)X=X+1불가능해야 한다.

따라서 국제 대수 언어(IAL, ALGOL 58)와 ALGOL(1958, 1960)이 도입되었다.:=할당을 위해, 표준에서 떠나=available for equality, a convention followed by CPL, ALGOL W, ALGOL 68, Basic Combined Programming Language (BCPL), Simula, SET Language (SETL), Pascal, Smalltalk, Modula-2, Ada, Standard ML, OCaml, Eiffel, Object Pascal (Delphi), Oberon, Dylan, VHSIC Hardware Description Language (VHDL), and several other languages.

B와 C

대부분의 프로그래밍 언어들 중에서 이 통일된 사실상의 표준은 결국 B라는 이름의 미니멀리스트가 편찬한 언어에 의해 간접적으로 변경되었다.그것의 유일한 의도된 용도는 (당시에는 매우 원시적인) 유닉스의 첫 항구를 위한 운송수단이었지만, 또한 매우 영향력 있는 C 언어로 진화했다.

B는 시스템 프로그래밍 언어 BCPL의 구문론적으로 변화된 변형으로 시작되었는데, 이는 CPL의 단순화(그리고 유형이 없는) 버전이다."스트립다운(strip-down)" 프로세스로 설명되어 온 프로세스에서,and그리고orBCPL[5] 운영자는 로 대체되었다.&그리고 (나중에 그렇게 될 것이다.&&그리고 , 각).[6]같은 과정에서 ALGOL 스타일은:=BCPL은 다음으로 대체되었다.=이 모든 것이 알려지지 않은 이유.[7]변수 업데이트는 B에 특별한 구문이 없기 때문에(예:let또는 유사) 그리고 표현에서 허용되었고, 등호의 이 비표준적인 의미는 등호의 전통적인 의미들이 이제 다른 기호들과 연관되어야 한다는 것을 의미했다.켄 톰슨은 임시방편을 이용했다.==이것의 조합

나중에 작은 타입 시스템이 도입되면서 B는 그 후 C가 되었다.유닉스와의 연관성과 함께 이 언어가 인기를 끌자, 자바, C#, 그리고 이에 따르는 많은 다른 언어들이 구문론적으로 같은 부호의 수학적인 의미와 충돌하게 되었다.

언어들

C의 할당에는 이 있고 0이 아닌 스칼라 값이 조건식에서는 참으로 해석되므로 [8]코드는if (x = y)합법적이지만, 다른 의미를 가지고 있다.if (x == y) . 이전의 코드 조각은 "yx에 할당하고, x의 새로운 값이 0이 아닌 경우 다음 문구를 실행하라"를 의미한다.후자 조각은 "만약 ifx가 y와 같다면, 다음 문장을 실행하라"[9]를 의미한다.

  인트로 x = 1;   인트로 y = 2;   만일 (x = y) {       /* 이 코드는 y가 0*/를 제외한 다른 항목일 경우 항상 실행된다.       활자화하다("x는 %d이고 y는 %d입니다.\n", x, y);   } 

JavaC#는 C와 동일한 연산자를 가지고 있지만, if 조건은 반드시 유형이어야 하기 때문에, 이 오류는 대개 이러한 언어에서 컴파일 오류를 야기한다.boolean그리고 다른 유형(예: 숫자)에서 다른 유형으로 변환할 수 있는 암묵적인 방법이 없다.booleans. 따라서 할당된 변수가 유형을 가지지 않는 한boolean(또는 포장지 유형)Boolean)) 컴파일 오류가 있을 것이다.

파스칼, 델파이, 에이다와 같은 ALGOL과 유사한 언어(내포된 함수 정의를 허용한다는 의미에서), 파이썬 등에서는 많은 기능 언어에서, 그 중에서도 할당 운영자는 표현(포함)으로 나타날 수 없다.if따라서 이러한 유형의 오류를 배제한다.GNU 컴파일러 컬렉션(GCC)과 같은 일부 컴파일러는 if 조건 내에서 할당을 합법적으로 사용하는 경우가 있지만 if 문 안에 할당 연산자가 포함된 코드를 컴파일할 때 경고를 제공한다.이 경우, 경고가 발생하지 않도록 명시적으로 추가 괄호 한 쌍으로 할당을 포장해야 한다.

이와 유사하게, BASIC과 같은 일부 언어만을 사용한다.=할당과 평등에 대한 기호 모두 구문적으로 분리되어 있기 때문에(Pascal, Ada, Python 등과 마찬가지로 할당 연산자는 표현으로 나타낼 수 없다).

일부 프로그래머들은 상수와 비교하는 것을 일반적인 순서의 역순으로 쓰는 습관을 들이기도 한다.

  만일 (2 == a) {   /* = 대 ==를 잘못 사용하면 컴파일 시간 오류 */   } 

만약=우발적으로 사용된 결과 코드는 2가 변수가 아니기 때문에 유효하지 않다.컴파일러는 적절한 연산자를 대체할 수 있는 오류 메시지를 생성한다.이 코딩 스타일은 왼손 비교 또는 요다 조건이라고 불린다.

이 표에는 이 두 가지 유형의 평등에 대해 다양한 언어로 테스트하기 위한 다양한 메커니즘이 나열되어 있다.

언어 물리적 평등 구조평등 메모들
알골 68 a :=: b 또는 a is b a = b 할 때a그리고b핵심이다
C, C++ a == b *a == *b 할 때a그리고b핵심이다
C# object.ReferenceEquals(a, b) a.Equals(b) ==연산자 기본값:ReferenceEquals, 그러나 수행에 과부하될 수 있음Equals대신에
커먼 리스프 (eq a b) (equal a b)
얼랑 a =:= b a == b a와 b가 숫자일 때
가다 a == b reflect.DeepEqual(*a, *b) a와 b가 포인터일 때
자바 a == b a.equals(b)
자바스크립트 a === b a == b a와 b가 등가 문자를 포함하는 두 문자열 객체인 경우 === 연산자는 true를 반환한다.
OCaml, Smalltalk a == b a = b
파스칼 a^ = b^ a = b
$a == $b $a == $b 할 때$a그리고$b스칼라에 대한 언급이다.
PHP $a === $b $a == $b 할 때$a그리고$b사물이 있다
파이톤 a is b a == b
루비 a.equal?(b) a == b
계략 (eq? a b) (equal? a b)
스위프트 a === b a == b a와 b가 클래스 타입일 때
Visual Basic 입니다.네트[inequality1] a Is b또는object.ReferenceEquals(a, b) a = b또는a.Equals(b) C#과 동일
목표-C(Cocoa, GNUstep) a == b [a isEqual:b] 할 때a그리고b의 예인 객체에 대한 포인터임NSObject
  1. ^ 특허 출원:2003년 5월 14일,미국 애플리케이션 20,040,230,959 "IS NOT OPERATION"은ISNOT마이크로소프트의 직원들에 의한 운영자이 특허는 2004년 11월 18일에 허가되었다.

루비가 사용하다a === b"b는 세트 a의 멤버"를 의미하지만, 포함된 데이터 유형에 따라 멤버라는 의미에 대한 세부 사항은 상당히 다르다. ===여기서 "사례 평등" 또는 "사례 요약" 연산자로 알려져 있다.

참고 항목

참고 및 참조

  1. ^ Contributors. "Comparing Objects". PHP Manual. PHP Group. Retrieved June 29, 2014.{{cite web}}: 일반 이름(도움말) 포함, (도움말)에 외부 링크 포함
  2. ^ "PHP: Comparison Operators - Manual". Retrieved July 31, 2008.
  3. ^ 수학관계적, 논리적 연산자
  4. ^ Alexandrescu, Andrei. The D Programming Language. Addison Wesley. p. 58. ISBN 978-0-321-63536-5.
  5. ^ ALGOL과 유사한 언어뿐만 아니라 FORTRAN과 BAS에서도 사용됨IC
  6. ^ 일부 프로그래머들은 (데니스 리치에 따르면) 이러한 새로운 기호들의 이중적 의미(비트 연산자, 논리 결합자)에 의해 혼란스러워졌다.&&의 약간 현명한 의미만이 유지되었다.
  7. ^ 비록 Dennis Ritchie는 변수의 업데이트가 특정 유형의 프로그램에서 비교하는 것보다 더 빈번할 수 있기 때문에 이것이 "타입의 경제"와 관련이 있을 수 있다고 제안했다.
  8. ^ 0 스칼라 값은 거짓으로 해석되는 반면 0이 아닌 스칼라 값은 참으로 해석된다. 이는 일반적으로 어셈블리 언어 숙어와 유사한 정수 유형과 함께 사용된다.
  9. ^ Brian Kernighan and Dennis Ritchie (1988) [1978]. The C Programming Language (Second ed.). Prentice Hall., 19