Je me demande s'il y a une raison - ou si c'est juste un accident de l'histoire - qu'il n'y a pas d' opérateurs !>
et !<
dans la plupart des langages de programmation?
a >= b
(un plus grand OU est égal à b) pourrait être écrit comme !(a < b)
(un PAS moins b) , qui est égal à a !< b
.
Cette question m'a frappé lorsque j'étais en train de coder mon propre constructeur d'arbres d'expression. La plupart des langages de programmation ont un a != b
opérateur pour !(a=b)
, alors pourquoi non !>
et !<
?
MISE À JOUR:
!<
(pas moins) est plus facile à prononcer que>=
(supérieur ou égal)!<
(pas moins) est plus court à taper que>=
(supérieur ou égal)!<
(pas moins) est plus facile à comprendre * que>=
(supérieur ou égal)
* parce que OR
c'est un opérateur binaire dont vous avez besoin pour faire fonctionner deux opérandes (râpe, égal), alors que NOT
c'est un opérateur unaire et que votre cerveau n'a besoin de fonctionner qu'avec un seul opérande (moins).
syntax
comparison
operators
Alex Burtsev
la source
la source
Réponses:
Le langage de programmation D et l'extension de DMC en C et C ++ ont pris en charge ces opérateurs (les 14 combinaisons d'entre eux), mais il est intéressant de noter que D va déprécier ces opérateurs , principalement parce que
a !< b
? Ça l'esta>=b || isNaN(a) || isNaN(b)
.!<
n'est pas le même que>=
, carNaN !< NaN
est vrai tandis queNaN >= NaN
est faux. IEEE 754 est difficile à maîtriser, donc l'utilisation dea !< b
to causera juste une confusion sur la gestion de NaN - vous pouvez rechercher de tels opérateurs dans Phobos (la bibliothèque standard de D), et un certain nombre d'utilisations ont des commentaires à côté pour rappeler aux lecteurs que NaN est impliqué,!(a < b)
, ou si l'on veut être explicitea >= b || isNaN(a) || isNaN(b)
, et ils sont plus faciles à lire.De plus, les relations (≮, ≯, ≰, ≱) sont rarement vues en mathématiques de base, contrairement à
!=
(≠) ou>=
(≥), il est donc difficile à comprendre pour beaucoup de gens.Ce sont probablement aussi les raisons pour lesquelles la plupart des langues ne les prennent pas en charge.
la source
seldomly seen in basic math
- plus comme, jamais vu. Nous apprenons en algèbre à le retourner à l'équivalent mathématique (d'autant plus qu'ilNaN
n'apparaît pas dans les mathématiques de base)double
sauf pour leursNaN
comportements. Dans de nombreux cas, le code qui pourrait effectuer n'importe quel type de comparaisonNaN
voudra avoir uneNaN
comparaison plus grande que tout, une comparaison plus petite que tout, ou lever une exception lors de la tentative de comparaison. Le fait de permettre au code de spécifier de manière déclarative la manière dontNaN
il convient de considérer réduirait la nécessité d'utiliser du code impératif pour obtenir un comportement correct.<fenv.h>
fonctions commefesetexceptflag
.Parce que cela n'a pas beaucoup de sens d'avoir deux opérateurs différents avec exactement la même signification.
!>
) est exactement le même que «inférieur ou égal» (<=
)!<
) est exactement le même que «supérieur ou égal» (>=
)Cela ne s'applique pas à «pas égal» (
!=
), il n'y a pas d'opérateur avec la même signification.Ainsi, votre modification rendrait la langue plus compliquée sans aucun avantage.
la source
x = x + 1
,x += 1
etx++
?<>
est un opérateur ayant la même signification que!=
Python 2 et les deux.<>
est obsolète depuis longtemps et elle est supprimée depuis 3.0 (et rappelez-vous, la dernière version 2.x jamais , 2.7, a été publiée à l'été 2010).!<
est synonyme de>=
. Plus tard, ce n'est qu'une façon de taper un symbole mathématique bien défini≥
. Vous avez raison de dire que «pas moins de» est utilisé dans la langue parlée, mais c'est familier et peut être ambigu (peut être interprété≥
ou mal interprété comme>
). D'un autre côté, la programmation et les mathématiques utilisent une terminologie clairement définie et sans ambiguïté.Même dans une logique à 3 valeurs, comme ANSI SQL,
not x < y
est équivalent àx >= y
, car ils donnent tous les deuxNULL
si l'unx
ou l' autre l'y
estNULL
. Cependant, il existe des dialectes SQL non conformes à ANSI, où ils ne sont!<
pas équivalents, et ils en ont .la source
NaN
est faux, alors!(2 < NaN) == true
, alors que(2 >= NaN) == false
.NaN
art. Ils arrêtent tous de se comporter normalement.a !< b = not (a < b)
, on pourrait juste dire (! <) = (> =).Transact-SQL possède les opérateurs !> (Pas plus grand que) et ! <(Pas moins que) .
Donc, à part vous, quelqu'un chez
SybaseMicrosoft a également pensé que ce serait une bonne idée. Tout comme Microsoft Bob! :)la source
Je pense que la réponse est simplement qu'il n'y a pas besoin d'un
!<
opérateur. Comme vous l'avez souligné dans votre question, il existe déjà>=
et<=
avec la possibilité de nier une expression existante, alors pourquoi ajouter un autre opérateur?la source
!<
n'est pas plus court à taper que>=
, ou manque-t-il quelque chose?De RFC 1925
L'ajout d'opérateurs supplémentaires qui dupliquent des fonctionnalités existantes ne fait rien d'autre que d'ajouter de la complexité (inutile) au langage (et donc au tokenizer et à l'analyseur).
Considérez également dans les langues où la surcharge d'opérateur est possible, vous auriez encore un autre opérateur à surcharger. Considérez la confusion quand
bool operator<=
etbool operator!>
pourriez retourner différentes choses (oui, je sais que l'on peut déjà faire des comparaisons incohérentes).Enfin, pensez des langues où les méthodes ou les opérateurs se multiplient définis (Ruby - Je regarde vous ) et vous avez un programmeur qui utilise <= tout autre utilise!> Et vous avez plusieurs styles de code pour la même expression.
la source
! <est égal à> = Maintenant, pourquoi nous en avons un deuxième pas le premier parce que tout le langage implémente d'abord l'opérateur positif puis l'approche de l'opérateur négatif, comme l'implémentation> = couvre également! <et <= couvre!>. et a pensé qu'ils seraient redondants et les ignorer.
Essayez toujours de mettre en œuvre le cas positif d'abord, puis passez au cas négatif (:) pensée positive, moi uniquement)
la source
La raison en est que les opérateurs dans les langages de programmation empruntent à la tradition mathématique et en mathématiques personne n'utilise vraiment "pas plus grand" et "pas plus petit" car "plus petit ou égal" et "plus ou moins" font tout aussi bien leur travail.
Donc, dans les langages de programmation, nous obtenons généralement un symbole ressemblant à ≠ pour non égal à (
!=
ou/=
, à moins que quelqu'un soit fantaisiste<>
ou un opérateur textuel)et des choses qui ressemblent à ≤ et ≥ (
<=
et>=
)Btw, je ne suis pas d'accord avec votre affirmation selon laquelle NON est plus simple à comprendre et à raisonner que OU. En mathématiques, les preuves impliquant beaucoup de négations (comme la réduction à l'absurde) sont généralement mal vues s'il existe une alternative plus directe. De plus, dans le cas de la commande, les connaissances de base que nous avons (et qui sont utilisées pour penser ou prouver quelque chose) sont la tricotomie entre <, = et> donc toute!! Instruction doit probablement être convertie en> = si vous voulez faire quoi que ce soit d'utile.
la source
Je blâmerais partiellement le jeu d'instructions d'assemblage. Vous avez des instructions telles que
jge
"sauter si supérieur ou égal". Par opposition à "sauter sinon moins que".Les rédacteurs du compilateur ont peut-être abandonné ce que les rédacteurs d'assemblage ont proposé, qui était probablement basé sur la façon dont il a été étiqueté lors de sa conception sur la puce.
...peut-être.
la source
Je pense que j'ai vu quelques langues il y a quelques années où, au lieu de l'
!=
opérateur (pas égal), quelque chose comme a<>
été utilisé. Je ne me souviens pas de leurs noms, cependant ...Je pense que c'est plus difficile à lire
!(a < b)
oua !< b
quea >= b
. C'est probablement la raison pour laquelle il!<
n'est pas utilisé (il a l'air moche à mon avis).la source
<>
est (était?) principalement utilisé par les dialectes BASIC, SQL et Pascal.<>
, bien qu'il ait été supprimé en 3.!=
c'est plus général que<>
, puisque vous pouvez avoir des choses (comme des nombres complexes) où l'égalité est bien définie mais il n'y a vraiment pas d'ordre utile.