Este es el único lugar que he visto en mi vida and
, or
y not
que figuran como operadores reales en C ++. Cuando escribí un programa de prueba en NetBeans, obtuve el subrayado rojo como si hubiera un error de sintaxis y pensé que el sitio web estaba mal, pero es NetBeans el que está mal porque se compiló y ejecutó como se esperaba.
Puedo ver !
que me favorecen, not
pero la legibilidad de and
&& or
parece mayor que la de sus hermanos gramaticales. ¿Por qué existen estas versiones de los operadores lógicos y por qué aparentemente nadie las usa? ¿Es esto C ++ verdaderamente válido o algún tipo de compatibilidad con C que se incluyó con el lenguaje?
c++
language-features
logical-operators
defectuoso
fuente
fuente
||
y&&
, tal vez, incluso!
a veces. Las palabras siempre son mejores que el "ruido de línea", sin mencionar la posible confusión con los operadores de manipulación de bits.and
es más legible y luego escribir "and
&&or
" sin embargo :)Respuestas:
Se originaron en C en el encabezado
<iso646.h>
. En ese momento, había teclados que no podían escribir los símbolos requeridos para&&
(por ejemplo), por lo que el encabezado contenía#define
los que los ayudarían a hacerlo, definiendo (en nuestro ejemplo)and
ser&&
. Por supuesto, a medida que pasaba el tiempo, esto se hizo menos utilizado.En C ++, se convirtieron en lo que se conoce como tokens alternativos . No es necesario incluir nada para usar estos tokens en un compilador compatible (como tal, la versión C ++ - ified del encabezado C
<ciso646>
, está en blanco). Los tokens alternativos son como los tokens normales, excepto por la ortografía. Entonces, durante el análisisand
es exactamente lo mismo que&&
, es solo una forma diferente de deletrear lo mismo.En cuanto a su uso: debido a que rara vez se usan, su uso suele ser más sorprendente y confuso que útil. Estoy seguro de que si fuera normal, serían mucho más fáciles de leer, pero la gente está tan acostumbrada
&&
y||
cualquier otra cosa se distrae.EDITAR: Sin embargo, he visto un ligero aumento en su uso desde que publiqué esto. Todavía los evito.
fuente
or
onot
sin incluir el encabezado.Existen para la usabilidad (soporte de caracteres en los sabores de teclado / pantalla) y la legibilidad general, pero hay otra razón que hoy en día es más pronunciada. Casi ninguna de las respuestas aquí , aquí , o incluso la respuesta principal aquíExplique la razón principal por la que muchos de nosotros preferimos las versiones de palabras a las versiones de símbolos (y una razón principal por la que otros idiomas las usan): errores. Las diferencias entre las versiones de palabras son muy visibles. Las diferencias entre las versiones de los símbolos son notablemente menores, hasta el punto de tentar a los errores en un grado comparativamente mucho mayor: "x | y" no es "x || y", pero cuando se incluye en una expresión más amplia, muchos de nosotros pierda la diferencia. Es similar a la mezcla accidental común del operador de asignación versus igualdad. Por esta razón, me deshice de las versiones de símbolos (no fue fácil) a favor de las versiones de palabras. Prefiero que alguien haga una doble toma de ellos debido a nuestro amor por las cosas viejas que tentar a los insectos.
fuente
/Za
) para admitir las palabras clave alternativas (consulte stackoverflow.com/a/555524/368896 ). Eso presumiblemente también tiene otros impactos. Entonces, en Visual Studio, no es necesariamente seguro seguir este consejo.x | y
es visualmente distinto (en fuentes monoespaciadas) dex || y
, pero encuentro que,!
por ejemplo, esif (!f(xyz) && ...
más fácil pasar por alto queif (not f(xyz) && ...
.and
,or
ynot
en una expresión booleana, en realidad mejora la legibilidad y resalta la distinción a las manipulaciones de bits. Por lo tanto, en mi humilde opinión, deberíamos considerar cambiar nuestros amados viejos hábitos para mejorar ...and
y elor
sesgo de pensamiento de las personas sobre cómo deberían funcionar? Por ejemplo, enif (a == b or c)
lugar deif (a == b || a == c)
, algo como esto aparece casi todos los días aquí en StackOverflow. Los símbolos abstractos que están desconectados del idioma inglés reducen estos errores.En C ++, son palabras clave reales. En C, son macros definidas en
<iso646.h>
. Consulte http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .fuente
and
y&&
son funcionalmente iguales en C ++. Los operadoresand
yor
son C ++ verdaderamente válidos y forman parte del estándar del lenguaje.Para más detalles sobre otras respuestas con un ejemplo concreto, hay otra razón, además de sólo "legibilidad" preferir
and
más&&
. Deletrear "y" explícitamente cuando se trata de un Y lógico elimina la posibilidad de errores sutiles.Considera esto:
Las tres sentencias if se compilarán, ¡pero la última significa algo completamente diferente y no intencionado!
Si siempre usa
and
cuando se refiere a un AND lógico, nunca podrá escribir accidentalmente un solo "&" y hacer que su código se compile correctamente y se ejecute con resultados misteriosos.Otro buen ejercicio: intente omitir un carácter de "y" por accidente y vea qué sucede. ;)
fuente
and
y&&
son funcionalmente idénticos" a la respuesta ... Y si lees mi respuesta, verás que estoy diciendo que NO se trata de legibilidad;)