대부분의 프로그래밍 언어에 '!>'(보다 크지 않음) 및 '! <'(보다 작지 않은) 연산자가없는 이유가 있습니까?


28

또는 역사의 단지 사고없는 경우 - - 더 있다는 것을 나는 어떤 이유가 궁금 !>!<에 사업자 대부분의 프로그래밍 언어?

a >= b (a는 OR과 b가 같다)!(a < b) (a NOT b) 와 같이 쓸 수있다 a !< b.

이 질문은 식 트리 빌더를 코딩하는 중이었습니다. 대부분의 프로그래밍 언어에는에 a != b대한 연산자가 !(a=b)있으므로 왜 아니오 !>!<?

최신 정보:

  • !<( 보다 작거나) 발음하기>=(더 크거나 같음) 보다 쉽습니다.
  • !<(보다 작지 않은) 유형 보다 >= 거나 (보다 크거나 같음)
  • !<(안 적은)가 * 이해하기 쉽고 보다 >=(크거나 같음)

* OR두 개의 연산자 (두 번째 피연산자)를 조작해야하는 이진 연산자 이기 때문에 NOT단항 연산자는 하나의 피연산자 (보다 작음) 만 사용해야합니다.


3
그건 아니 모든 언어로 발음하는 지 반드시 쉽게. 예를 들어 독일어에서 "größer / gleich"라고 말하면 "nicht kleiner"를 들어 본 적이 없습니다.
Ingo

1
쉽게 이해하는 인자 중 하나 물을 보유하지 않습니다. 관계 연산자에서는 정상이므로 두 경우 모두 피연산자를 조작해야합니다. 또한, 당신은 단지 뇌가 1 피연산자 대신 마십시오 2. 당신이 가지고에서 쉽게 작동 할 수 있다고 가정 어떤 신경 과학 분야에서 그 증거를?
Ingo

답변:


84

D 프로그래밍 언어DMC의 확장 C 및 C ++에 이러한 사업자 (모두 14 조합)을 지원했지만 흥미롭게도, D는 이러한 연산자를 중단 한 것입니다 주로하기 때문에,

  1. 정확히 무엇 a !< b입니까? 입니다 a>=b || isNaN(a) || isNaN(b). !<같지 않습니다 . >=왜냐하면 NaN !< NaNtrue NaN >= NaN는 거짓 이기 때문 입니다 . IEEE 754는 마스터하기 가 어렵 기 때문에를 사용 a !< b하면 NaN 처리에 대한 혼란이 발생할 수 있습니다. Phobos (D의 표준 라이브러리)에서 이러한 연산자를 검색 할 수 있으며 NaN이 관련된 독자를 상기시키기 위해 그 옆에 주석이 많이 사용됩니다.
  2. 따라서 D와 같은 연산자가 존재하더라도이를 사용하는 사람은 거의 없습니다.
  3. 드물게 사용되는이 연산자들에 대해 8 개의 토큰을 더 정의해야하는데, 이로 인해 컴파일러는 별다른 이점을 얻지 못합니다.
  4. 그리고 이러한 연산자가 !(a < b)없다면 , 동등한 연산자를 사용 하거나 명시적인 것을 좋아한다면 a >= b || isNaN(a) || isNaN(b)읽기가 더 쉽습니다.

또한 관계 (≮, ≯, ≰, ≱)는 !=(≠) 또는 >=(≥) 와 달리 기본 수학에서는 거의 보이지 않으므로 많은 사람들이 이해하기 어렵 습니다.

아마도 대부분의 언어가이를 지원하지 않는 이유 일 수도 있습니다.


seldomly seen in basic math-더 본 적이 없다. 우리는 수학적으로 동등한 수학으로 뒤집기 위해 대수학에서 다시 배웁니다 (특히 NaN기본 수학에는 나타나지 않기 때문에 )
Izkata

정말로 이럴 필요한 것은 어떤 행동하라 등의 변수를 선언하는 수단 인 double 을 제외하고 자신을위한 NaN행동. 많은 경우에, 모든 종류의 비교를 수행 할 수있는 코드 는 모든 것보다 큰 것을 비교하거나, 모든 것보다 작은 것을 비교하거나, 비교 시도에서 예외를 던지 길 NaN원할 NaN것입니다. 코드가 어떻게 고려 되어야 하는지 선언적 으로 지정하도록 허용하면 NaN올바른 동작을 달성하기 위해 명령형 코드를 사용할 필요성이 줄어 듭니다.
supercat

@supercat : <fenv.h>같은 함수를 사용하여 NaN 작업에서 예외를 발생시킬 수 fesetexceptflag있습니다.
kennytm

@KennyTM : 작업을 수행하기 전에 플래그를 설정하고 불완전하고 문제가 발생하기 쉬운 상태로 설정 해제해야하므로 전체 주문을 적용 할 가능성이 없습니다. 내가 이해하는 IEEE는 방금 총 주문을 부과하는 새로운 비교 방법을 도입했으며, 기한이 지난 변경을 환영합니다. 언어가 어떻게 반응하는지 보는 것이 흥미로울 것입니다.
supercat

47

정확히 동일한 의미를 가진 두 개의 서로 다른 연산자를 갖는 것은 의미가 없기 때문입니다.

  • "더 크지 않음"( !>)은 "작거나 같음"( <=) 과 정확히 동일합니다.
  • "더 작지 않음"( !<)은 "더 크거나 같음"( >=) 과 정확히 동일합니다.

이는 "같지 않음"( !=) 에는 적용되지 않으며 동일한 의미를 가진 연산자가 없습니다.

따라서 수정하면 아무런 이점없이 언어가 더 복잡해집니다.


5
무엇에 대한 x = x + 1, x += 1그리고 x++?

33
@ dunsmoreb : 그들 중 어느 것도 같은 것이 아닙니다. 오직 하나만이 "증가"의 목적을 수행합니다. 같은 목적을 위해 다른 두 표현을 활용했다는 사실은 관련이 없습니다. 둘 다 훨씬 더 일반적입니다.
DeadMG

1
<>는와 같은 의미를 가진 연산자 !=이며 Python 2는 둘 다 있습니다.
krlmlr

9
@ user946850 그리고 모두가 널리 실수로 간주되는 데 사용 <>오랜 시간 동안 사용되지 않으며이 3.0 이후 제거 (그리고 당신을 마음, 마지막 2.x에서 자료 , 2.7, 2010 년 여름에 출시되었다).

3
@svick ++ 연산자를 더욱 화려하게 만들어주는 C # 프로그래머가 여기에 오지 못하게하여 프로그램 동작에 대한 합리적인 가정을 한 다음 C ++ 프로그래머의 직업을 훔칩니다!

10

!<와 동의어입니다 >=. 나중에 잘 정의 된 수학 기호를 입력하는 방법입니다 . 당신이 바로 점이다 "이하보다" 그러나 그것은 (해석 될 수 구어체이고 모호 할 수 있으며, 음성 언어로 사용 하거나 잘못 해석 >). 반면에 프로그래밍과 수학은 명확하게 정의 된 명확한 용어를 사용합니다.

심지어 ANSI SQL 같은 3 치 논리에서 not x < y의 동등한 x >= y들이 모두 같은 보내기 NULL경우 하나 x또는 y이다 NULL. 그러나, 그것은 동일하지 어디, 비 ANSI 준수 SQL 언어이며, 그들은 해야합니까!< .


10
그러나 부동 소수점 숫자를 사용할 때는 일반적으로 동일하지 않습니다. 예를 들어와 비교하는 NaN것은 false이므로 !(2 < NaN) == truewhile (2 >= NaN) == false입니다.
hammar

@ hammar : 맞습니다.하지만 NaNs 와 관련된 모든 산술 관계에 해당 됩니다. 그들 모두는 정상적으로 행동하지 않습니다.
Nicol Bolas

@hammar-이것은 부동 소수점 오류입니다. 오드를 올바르게 구현하지 않았습니다. 그럼에도 불구하고 아무도 우리에게 강제로 구현하지 않기 때문에 큰 문제는 아닙니다. a !< b = not (a < b)우리는 단지 (! <) = (> =)라고 말할 수 있습니다.
Ingo

8

Transact-SQL에는 !> (이하)! <(이하) 연산자가 있습니다.

따라서 Sybase Microsoft 직원 중 누군가는 이것이 좋은 아이디어라고 생각했습니다. Microsoft Bob처럼! :)


이것은 2005 년에 추가되지 않았습니까?
JeffO

5
이 세상에는 혼자 동의하지 않는 많은 합의 된 조언을하지 않은 사람들이 있습니다. 합의! = 정확성.

@JeffO 그렇다면 Sybase가 아닌 Microsoft를 비난해야합니까?
yannis

흥미 롭군 나는 이것에 대한 이야기가 궁금하다.
surfasb

@surfasb 그래, 나도. 제 생각에는 그것이 단지 구문 설탕 일뿐입니다. 특별한 것은 없습니다.
yannis

4

답은 단순히 !<운영자 가 필요 없다는 것 입니다. 질문에서 지적했듯이 기존 표현을 부정 할 가능성 이 이미 >=있으며 <=왜 다른 연산자를 추가해야합니까?


나는 똑같은 일을하는 연산자를 추가 할 필요가 없지만 "they"가! <대신> =를 ​​선택한 이유는 NOT LESSER, GREATER OR EQUALS를 발음하는 것이 훨씬 쉽고 입력하기가 더 짧습니다. 이해하기 위해 뇌.
Alex Burtsev

!<보다 짧게 입력하지 >=않거나 무언가를 놓치고 있습니까?
Bryan Oakley 2012

나는 그것이 텍스트 표현 (발음 텍스트)임을 의미했습니다.
Alex Burtsev

4

에서 RFC 1925

추가 할 항목이 없을 때가 아니라 제거 할 항목이 없을 때 완벽에 도달했습니다.

기존 기능을 복제하는 추가 연산자를 추가해도 언어에 불필요한 (필요하지 않은) 복잡성 (토큰 라이저 및 구문 분석기)을 추가하는 것 외에 다른 작업은 수행하지 않습니다.

연산자 오버로드가 가능한 언어에서도 다른 연산자를 오버로드해야합니다. 때 혼란을 고려 bool operator<=하고 bool operator!>(예, 나는이 아직 일치 비교를 할 수있어) 다른 일을 반환 할 수 있습니다.

마지막으로, 메소드 또는 연산자가 여러 개 정의 된 언어를 생각하고 (Ruby-당신을보고 있습니다 ) <=를 사용하는 반면 다른 사람은!>를 사용하는 한 프로그래머가 있고 동일한 표현식에 대해 여러 코드 스타일이 있습니다.


예! 그것은 과학적 Parsimony의 원리입니다.
luser droog

3

! <는> =와 같습니다. 이제 모든 언어가 먼저 양수 연산자를 구현 한 다음 음수 연산자에 접근하기 때문에 두 번째가 아닌 이유는 무엇입니까? 중복 될 것이라고 생각하고 건너 뜁니다.

항상 긍정적 인 사례를 먼저 구현 한 다음 부정적인 사례로 이동하십시오 (:) 긍정적 사고, 나만의 견해 만)


2

그 이유는 프로그래밍 언어의 연산자가 수학적 전통에서 빌려 왔고 수학에서 "더 작거나 같음"과 "더 크거나 같음"이 직업만큼 좋은 것이기 때문에 "실제로 크지 않은"과 "작지 않은"을 사용하는 사람이 없기 때문입니다.

따라서 프로그래밍 언어에서는 일반적으로 같지 않은 ≠ 같은 기호를 얻습니다 ( !=또는 /=누군가 <>가 텍스트 연산자를 사용하지 않는 한 )

≤ 및 ≥ ( <=and >=) 처럼 보이는 것들


Btw, 나는 이해하기가 더 간단하지 않다는 OR의 주장에 동의하지 않습니다. 수학에서, 더 직접적인 대안이 있다면, 많은 부정과 관련된 증거 (부조리로의 축소와 같은)는 대개 눈살을 찌푸리게합니다. 또한 주문의 경우, 우리가 가지고있는 기본적인 지식 (그리고 무언가를 생각하거나 증명할 때 사용되는)은 <, =와> 사이의 3 인법이므로! <문은> =로 변환해야합니다. 유용한 것.


2

어셈블리 명령 세트를 부분적으로 비난했습니다. jge"크거나 같으면 점프" 와 같은 지침이 있습니다. "보다 작 으면 점프"와 반대로.

컴파일러 라이터는 어셈블리 라이터의 구성 요소를 제거했을 수 있습니다. 이는 아마도 칩에서 설계 될 때 어떻게 레이블이 지정되었는지에 기초한 것입니다.

...혹시.


1

나는 몇 년 전에 !=연산자 (같지 않음) 대신에 비슷한 <>것이 사용되는 언어를 보았습니다 . 그래도 그들의 이름을 기억할 수 없습니다 ...

!(a < b)또는 a !< b보다 읽기가 어렵다고 생각합니다 a >= b. 아마도 이것이 !<사용되지 않는 이유 일 것입니다 (제 의견으로는 추악하게 보임).


1
<>BASIC 방언, SQL 및 파스칼 방언에서 주로 사용됩니다.
yannis

@Yannis Rizos는 상기시켜 주셔서 감사합니다. 그들은 우리에게 고등학교에서 파스칼을 가르쳤고 그것이 내가 본 곳입니다 :).
Radu Murzea

2
파이썬 2도 <>3에서 제거되었지만 을 가지고 있습니다 .
Daniel Lubarov

논리적 인 관점에서 볼 때 평등이 잘 정의되어 있지만 실제로 유용한 순서는없는 복잡한 숫자와 같은 것을 가질 수 있기 때문에 !=보다 일반적 <>입니다.
David Thornley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.