Me pregunto si hay alguna razón - o si es sólo un accidente de la historia - que no existen !>
y !<
los operadores en la mayoría de los lenguajes de programación?
a >= b
(un OR mayor es igual a b) podría escribirse como !(a < b)
(a NO menor b) , que es igual a !< b
.
Esta pregunta me llamó la atención cuando estaba en medio de la codificación de mi propio generador de árboles de expresión. La mayoría de los lenguajes de programación tienen a != b
operador para !(a=b)
, ¿por qué no !>
y !<
?
ACTUALIZAR:
!<
(no menor) es más fácil de pronunciar que>=
(mayor o igual)!<
(no menor) es más corto de escribir que>=
(mayor o igual)!<
(no menor) es más fácil de entender * que>=
(mayor o igual)
* debido a que OR
es un operador binario, su cerebro necesita operar dos operandos (rallador, igual), mientras que NOT
es un operador unario y su cerebro necesita operar solo con un operando (menor).
syntax
comparison
operators
Alex Burtsev
fuente
fuente
Respuestas:
El lenguaje de programación D y la extensión de DMC a C y C ++ admitieron estos operadores (las 14 combinaciones de ellos), pero curiosamente, D va a desaprobar estos operadores , principalmente porque
a !< b
? Esa>=b || isNaN(a) || isNaN(b)
. no!<
es lo mismo que>=
, porqueNaN !< NaN
es verdadero mientras queNaN >= NaN
es falso. IEEE 754 es difícil de dominar, por lo que usarloa !< b
solo causará confusión sobre el manejo de NaN: puede buscar dichos operadores en Phobos (biblioteca estándar de D), y una gran cantidad de uso tiene comentarios al lado para recordar a los lectores que NaN está involucrado,!(a < b)
, o si le gusta ser explícitoa >= b || isNaN(a) || isNaN(b)
, y son más fáciles de leer.Además, las relaciones (≮, ≯, ≰, ≱) rara vez se ven en matemáticas básicas, a diferencia de
!=
(≠) o>=
(≥), por lo que es difícil de entender para muchas personas.Estas son probablemente también las razones por las cuales la mayoría de los idiomas no las admiten.
fuente
seldomly seen in basic math
- Más bien, nunca visto. Aprendemos de nuevo en álgebra a cambiarlo al equivalente matemáticamente (especialmente porqueNaN
no aparece en matemáticas básicas)double
excepción a susNaN
comportamientos. En muchos casos, el código que podría realizar cualquier tipo de comparaciónNaN
querrá tener unaNaN
comparación más grande que todo, hacer que se compare más pequeño que todo o lanzar una excepción en el intento de comparación. Permitir que el código especifique de manera declarativa cómoNaN
debe considerarse reduciría la necesidad de usar un código imperativo para lograr un comportamiento correcto.<fenv.h>
funciones comofesetexceptflag
.Porque no tiene mucho sentido tener dos operadores diferentes con exactamente el mismo significado.
!>
) es exactamente lo mismo que "menor o igual" (<=
)!<
) es exactamente lo mismo que "mayor o igual" (>=
)Esto no se aplica a "no es igual" (
!=
), no hay operador con el mismo significado.Por lo tanto, su modificación complicaría el lenguaje sin ningún beneficio.
fuente
x = x + 1
,x += 1
yx++
?<>
es un operador con el mismo significado que!=
, y Python 2 tiene ambos.<>
está en desuso desde hace mucho tiempo y es removido desde el 3.0 (y que importa, la última versión 2.x vez , 2.7, fue lanzado en el verano de 2010).!<
es sinónimo>=
. Más adelante es solo una forma de escribir símbolos matemáticos bien definidos≥
. Tiene razón en que se utiliza "no menos que" en el lenguaje hablado, sin embargo, es coloquial y puede ser ambiguo (puede interpretarse≥
o malinterpretarse como>
). Por otro lado, la programación y las matemáticas utilizan una terminología claramente definida y sin ambigüedades.Incluso en la lógica de 3 valores, como ANSI SQL,
not x < y
es equivalente ax >= y
, ya que ambos danNULL
si unox
oy
esNULL
. Sin embargo, hay dialectos de SQL que no cumplen con ANSI, donde no es equivalente, y lo tienen!<
.fuente
NaN
es falso, entonces!(2 < NaN) == true
, mientras(2 >= NaN) == false
.NaN
s. Todos dejan de comportarse normalmente.a !< b = not (a < b)
, simplemente podríamos decir (! <) = (> =).Transact-SQL tiene operadores !> (No mayor que) y ! <(No menor que) .
Entonces, además de usted, alguien en
SybaseMicrosoft también pensó que sería una buena idea. ¡Al igual que Microsoft Bob! :)fuente
Creo que la respuesta es simplemente que no hay necesidad de un
!<
operador. Como señaló en su pregunta, ya existe>=
y<=
junto con la posibilidad de negar una expresión existente, entonces, ¿por qué agregar otro operador?fuente
!<
no es más corto de escribir que>=
, o me falta algo?De RFC 1925
Agregar operadores adicionales que duplican la funcionalidad existente no hace nada más que agregar complejidad (innecesaria) al lenguaje (y, por lo tanto, tokenizer y parser).
Considere también en idiomas en los que es posible la sobrecarga del operador, tendría que sobrecargar otro operador. Considere la confusión cuando
bool operator<=
ybool operator!>
podría devolver cosas diferentes (sí, sé que uno ya puede hacer comparaciones inconsistentes).Por último, pensar en lenguas donde se definen los métodos multiplican u operadores (Ruby - Yo estoy mirando a usted ) y usted tiene OMS utiliza un programador <=, mientras que otros usos!> Y que tienen múltiples estilos de código para la misma expresión.
fuente
! <es igual a> = Ahora, ¿por qué tenemos el segundo no primero porque todo el lenguaje implementa el operador positivo primero y luego se acerca al operador negativo, ya que la implementación> = también cubre! <y <= cubre!>. y pensé que serían redundantes y los omitirían.
Siempre trate de implementar el caso positivo primero y luego vaya al caso negativo (:) pensamiento positivo, solo mi opinión personal)
fuente
La razón es que los operadores en lenguajes de programación toman prestado de la tradición matemática y en matemáticas nadie usa "no mayor" y "no menor" ya que "menor o igual" y "mayor o igual" hacen un trabajo igual de bueno.
Entonces, en los lenguajes de programación, generalmente obtenemos un símbolo que parece ≠ para no es igual (
!=
o/=
, a menos que alguien sea sofisticado<>
o un operador textual)y cosas que parecen ≤ y ≥ (
<=
y>=
)Por cierto, no estoy de acuerdo con su afirmación de que NO es más fácil de entender y razonar sobre entonces O. En matemáticas, las pruebas que involucran muchas negaciones (como la reducción a lo absurdo) generalmente están mal vistas si hay una alternativa más directa disponible. Además, en el caso de ordenar, el conocimiento básico que tenemos (y que se usa al pensar o probar algo) es la tricotomía entre <, = y>, por lo que cualquier declaración! <Probablemente deba convertirse a> = si desea hacerlo algo útil con eso.
fuente
Culparía parcialmente al conjunto de instrucciones de montaje. Tienes instrucciones como
jge
"saltar si es mayor o igual que". A diferencia de "saltar si no menos de".Los escritores de compiladores pueden haberse equivocado de lo que se les ocurrió a los escritores de ensamblajes, lo que probablemente se basó en cómo se etiquetó cuando se diseñó en el chip.
...posiblemente.
fuente
Creo que vi algunos idiomas hace unos años donde, en lugar del
!=
operador (no igual),<>
se usaba algo así . Aunque no puedo recordar sus nombres ...Creo que es más difícil de leer
!(a < b)
oa !< b
quea >= b
. Probablemente esa sea la razón por la!<
que no se usa (en mi opinión, se ve feo).fuente
<>
se usa (was?) principalmente en dialectos BASIC, SQL y dialectos Pascal.<>
, aunque fue eliminado en 3.!=
es más general que<>
, ya que puede tener cosas (como números complejos) donde la igualdad está bien definida pero realmente no hay un orden útil.