Zastanawiam się, czy istnieje jakikolwiek powód - lub, jeśli jest to tylko przypadek historyczny - że nie istnieją !>
i !<
operatorzy w większości języków programowania?
a >= b
(większa OR równa się b) może być zapisana jako !(a < b)
(NIE mniejsza b) , która równa się a !< b
.
To pytanie uderzyło mnie, gdy byłem w trakcie kodowania własnego konstruktora drzewa wyrażeń. Większość języków programowania ma a != b
operatora !(a=b)
, więc dlaczego nie !>
i !<
?
AKTUALIZACJA:
!<
(nie mniejszy) jest łatwiejszy do wymówienia niż>=
(większy lub równy)!<
(nie mniejszy) jest krótszy do wpisania niż>=
(większy lub równy)!<
(nie mniej) jest łatwiejszy do zrozumienia * niż>=
(większy lub równy)
* ponieważ OR
jest operatorem binarnym, twój mózg musi operować dwoma operandami (większa, równa), podczas gdy NOT
jest operatorem jednoargumentowym i twój mózg musi operować tylko jednym operandem (mniejszym).
syntax
comparison
operators
Alex Burtsev
źródło
źródło
Odpowiedzi:
Język programowania D i rozszerzenie DMC do C i C ++ wspierały te operatory (wszystkie 14 ich kombinacji), ale co ciekawe, D zamierza wycofać te operatory , głównie dlatego, że
a !< b
? Jesta>=b || isNaN(a) || isNaN(b)
. nie!<
jest tym samym, co , ponieważ jest prawdą, podczas gdy fałszem. IEEE 754 jest trudny do opanowania, więc używanie do spowoduje po prostu zamieszanie związane z obsługą NaN - możesz wyszukiwać takich operatorów w Phobos (standardowa biblioteka D), a całkiem sporo zastosowań ma komentarze, które przypominają czytelnikom, że NaN jest zaangażowany,>=
NaN !< NaN
NaN >= NaN
a !< b
!(a < b)
, lub jeśli ktoś chce być wyraźnya >= b || isNaN(a) || isNaN(b)
, i są łatwiejsi do odczytania.Poza tym relacje (≮, ≯, ≰, ≱) rzadko są postrzegane w podstawowej matematyce, w przeciwieństwie do
!=
(≠) lub>=
(≥), więc dla wielu osób trudno je zrozumieć.Są to prawdopodobnie również powody, dla których większość języków ich nie obsługuje.
źródło
seldomly seen in basic math
- bardziej jak nigdy. Uczymy się w algebrze, aby po prostu przerzucić ją na matematycznie równoważną (zwłaszcza,NaN
że nie pojawia się w podstawowej matematyce)double
wyjątki od swoichNaN
zachowań. W wielu przypadkach kod, który może wykonać dowolne porównanie,NaN
będzie chciałNaN
porównywać większe niż wszystko, porównywać mniejsze niż wszystko lub rzucać wyjątek przy próbie porównania. Zezwolenie kodowi na deklaratywne określenie sposobu, w jakiNaN
należy go traktować, zmniejszyłoby potrzebę użycia kodu imperatywnego w celu osiągnięcia poprawnego zachowania.<fenv.h>
funkcji takich jakfesetexceptflag
.Ponieważ nie ma sensu mieć dwóch różnych operatorów o dokładnie tym samym znaczeniu.
!>
) jest dokładnie taki sam jak „mniejszy lub równy” (<=
)!<
) jest dokładnie taki sam jak „większy lub równy” (>=
)Nie dotyczy to „nie równa się” (
!=
), nie ma operatora o tym samym znaczeniu.Tak więc modyfikacja sprawiłaby, że język byłby bardziej skomplikowany bez żadnych korzyści.
źródło
x = x + 1
,x += 1
ix++
?<>
jest operatorem o takim samym znaczeniu jak!=
, a Python 2 ma oba.<>
została zaniechana przez długi czas i jest usuwana od 3.0 (a przeszkadza ci ostatni release 2.x kiedykolwiek , 2,7, został wydany w lecie 2010 roku).!<
jest synonimem>=
. Później to tylko sposób na wpisanie dobrze zdefiniowanego symbolu matematycznego≥
. Masz rację, że w języku mówionym używa się słowa „nie mniej niż” , ale jest ono potoczne i może być dwuznaczne (może być interpretowane≥
lub interpretowane jako>
). Z drugiej strony programowanie i matematyka wykorzystują jasno zdefiniowaną, jednoznaczną terminologię.Nawet w logice 3 wartości, takich jak ANSI SQL,
not x < y
jest równoważnex >= y
, ponieważ dadząNULL
jeżeli jedenx
luby
jestNULL
. Istnieją jednak dialekty SQL niezgodne z ANSI, w których nie są one równoważne, i tak jest!<
.źródło
NaN
jest fałszywe, więc!(2 < NaN) == true
póki(2 >= NaN) == false
.NaN
s. Wszystkie przestają się normalnie zachowywać.a !< b = not (a < b)
, moglibyśmy po prostu powiedzieć (! <) = (> =).Transact-SQL ma !> (Nie większy niż) i ! <(Nie mniej niż) operatorów.
Tak więc, oprócz ciebie, ktoś w
SybaseMicrosoft również pomyślał, że to byłby dobry pomysł. Podobnie jak Microsoft Bob! :)źródło
Myślę, że odpowiedź brzmi: po prostu nie ma potrzeby
!<
operatora. Jak podkreślił w swoim pytaniu nie ma już>=
i<=
wraz z możliwością zanegować istniejący wyraz, więc dlaczego dodać innego operatora?źródło
!<
nie jest krótszy do pisania niż>=
, czy coś mi brakuje?Od RFC 1925
Dodanie dodatkowych operatorów, które powielają istniejącą funkcjonalność, nie robi nic innego, niż tylko (niepotrzebną) złożoność języka (a tym samym tokenizera i parsera).
Rozważ również w językach, w których możliwe jest przeciążenie operatora, miałbyś jeszcze jednego operatora do przeciążenia. Rozważ zamieszanie, kiedy
bool operator<=
ibool operator!>
może zwrócić różne rzeczy (tak, wiem, że można już dokonać niespójnych porównań).Na koniec pomyśl o językach, w których metody lub operatory są wielokrotnie zdefiniowane (Ruby - patrzę na ciebie ) i masz jednego programistę, który używa <= podczas gdy inny używa!> I masz wiele stylów kodu dla tego samego wyrażenia.
źródło
! <jest równe> = Teraz mamy drugi, a nie pierwszy, ponieważ wszystkie języki najpierw implementują operator dodatni, a następnie podejście do operatora ujemnego, ponieważ implementacja> = obejmuje również! <i <= obejmuje!>. i pomyślał, że będą zbędni i pominą ich.
Zawsze najpierw próbuj zaimplementować przypadek pozytywny, a następnie przejdź do przypadku negatywnego (:) pozytywne myślenie, tylko dla mnie widok osobisty)
źródło
Powodem jest to, że operatorzy w językach programowania zapożyczają się z tradycji matematycznej, a w matematyce nikt tak naprawdę nie używa „nie większych” i „nie mniejszych”, ponieważ „mniejszy lub równy” i „większy lub równy” wykonują równie dobrą robotę.
Tak więc w językach programowania zwykle otrzymujemy symbol wyglądający jak ≠ dla nie równy (
!=
lub/=
, chyba że ktoś ma ochotę<>
lub operator tekstowy)i rzeczy, które wyglądają jak ≤ i ≥ (
<=
i>=
)Przy okazji, nie zgadzam się z twoim twierdzeniem, że NIE jest łatwiejsze do zrozumienia i uzasadnienia na temat LUB. W matematyce dowody zawierające wiele negacji (jak redukcja do absurdu) są zwykle odrzucane, jeśli istnieje bardziej bezpośrednia alternatywa. Ponadto w przypadku zamawiania podstawową wiedzą, którą posiadamy (i która jest wykorzystywana podczas myślenia lub udowadniania czegoś), jest trikotomia pomiędzy <, = i>, więc dowolne wyrażenie! <Prawdopodobnie należy przekonwertować na> =, jeśli chcesz to zrobić cokolwiek przydatnego z tym.
źródło
Częściowo winiłbym zestaw instrukcji montażu. Masz instrukcje takie jak
jge
„skacz, jeśli większy lub równy”. W przeciwieństwie do „skoku, jeśli nie mniej niż”.Autorzy kompilatora mogli odejść od tego, co wymyślili autorzy asemblera, co prawdopodobnie opierało się na tym, jak zostało oznaczone przy projektowaniu na chipie.
...możliwie.
źródło
Wydaje mi się, że kilka lat temu widziałem kilka języków, w których zamiast
!=
operatora (nie równego)<>
użyto czegoś podobnego . Nie pamiętam jednak ich nazw ...Myślę, że jest to trudniejsze do odczytania
!(a < b)
luba !< b
niea >= b
. Prawdopodobnie to jest powód, dla którego!<
nie jest używany (moim zdaniem wygląda brzydko).źródło
<>
jest (był?) używany głównie przez dialekty BASIC, SQL i Pascal.<>
, chociaż został usunięty w wersji 3.!=
jest bardziej ogólny niż<>
, ponieważ można mieć rzeczy (takie jak liczby zespolone), w których równość jest dobrze zdefiniowana, ale tak naprawdę nie ma użytecznej kolejności.