&& y || no son operadores lógicos sino condicionales?

62

Estoy un poco confundido por la documentación de MSDN # C que establece que &y |son operadores lógicos y que &&y ||son los operadores condicionales.

Sigo llamando &&, ||y !operadores lógicos, ¿entonces estoy equivocado?

Juan v
fuente
44
Parece ilógico, pero hay una diferencia importante entre las dos clases, y es crítico que no asumas que, por ejemplo, |es intercambiable ||, aunque en muchos casos pueden intercambiarse sin un cambio aparente en el comportamiento del programa.
Daniel R Hicks el

Respuestas:

120

Estoy un poco confundido por la documentación de MSDN # C que establece que &y |son operadores lógicos y que &&y ||son los operadores condicionales. Sigo llamando &&, ||y !operadores lógicos, ¿entonces estoy equivocado?

No; Estás en lo correcto.

Existen numerosos errores de nomenclatura pequeños, en su mayoría sin importancia, en la documentación de MSDN; Traté de sacar la mayor cantidad posible de ellos, pero en los casos en que no es tan erróneo y engañoso, no siempre es un uso racional del tiempo. Vaya a la especificación si desea una declaración definitiva sobre el nombre de una característica de C #.

Entonces: la autoridad relevante es la especificación C #, que establece en la sección 7.11:

El &, ^y |los operadores son llamados los operadores lógicos.

Luego continúa desglosando los operadores lógicos integrados en operadores lógicos enteros, de enumeración, booleanos y booleanos anulables. También hay operadores lógicos definidos por el usuario; Vea las especificaciones para más detalles.

En la sección 7.12 tenemos

Los operadores &&y ||se denominan operadores lógicos condicionales. También se denominan operadores lógicos de "cortocircuito".

Entonces todos ellos son operadores lógicos . Algunos de ellos son operadores lógicos condicionales .

¿Qué hace que los operadores lógicos condicionales sean condicionales ? Uno podría hacer una suposición engañosa de que se debe a que generalmente se usan en declaraciones condicionales ( if) o expresiones condicionales ( ? :). La verdadera razón viene dada por la especificación:

Los operadores &&y ||son versiones condicionales de los operadores &y |: la operación x && ycorresponde a la operación x & y, excepto que yse evalúa solo si xno es falsa. La operación x || ycorresponde a la operación x | y, excepto que yse evalúa solo si xno es verdadera.

Los operadores lógicos condicionales se denominan así porque el operando de la mano derecha se evalúa condicionalmente dependiendo del valor del operando de la mano izquierda.

Podemos ver esto más vívidamente al notar que los operadores lógicos condicionales son simplemente "azúcares sintácticos" para expresiones condicionales . x && yes simplemente una forma más agradable de escribir x ? y : false, y x || yes simplemente una forma más agradable de escribir x ? true : y. Las expresiones lógicas condicionales son en realidad expresiones condicionales.

También hay una forma definida por el usuario del operador lógico condicional, y es un poco complicado. Consulte la especificación para más detalles.

Lectura adicional, si este tema le interesa:

Eric Lippert
fuente
3
@RobertHarvey: Correcto, el hecho de que & pueda operar en bools, tipos enteros o tipos de enumeración, pero && solo opera en bools no tiene nada que ver con la elección de nombrar a uno de ellos como la forma "condicional" del operador. El operador condicional es condicional porque tiene una rama condicional en su semántica de evaluación.
Eric Lippert
16
Tengo la impresión de que el término "operador de cortocircuito" es mucho más popular (y probablemente menos ambiguo) que "operador condicional" en el sentido descrito.
Doc Brown
15
@DocBrown: Seguramente es popular, pero siempre he encontrado que ese nombre es engañoso; parece haber sido acuñado por alguien que pensó que un "cortocircuito" y un "atajo" para obtener un resultado son lo mismo. Un cortocircuito es una falla peligrosa que puede destruir rápidamente un sistema eléctrico. Llamamos bloques "inseguros" en C # "inseguros" porque son peligrosos si se usan incorrectamente ; no demos las cosas cursi sino nombres engañosos cargados de valores. Ni siquiera me hagas comenzar con el operador de Elvis. :-)
Eric Lippert
26
@EricLippert: Si bien "cortocircuito" puede sonar aterrador para el público en general, no creo que K&R estuviera confundido acerca de la definición real. En ingeniería eléctrica, el cortocircuito de un circuito no siempre es una falla peligrosa, de hecho, lo hacemos intencionalmente todo el tiempo. Simplemente significa cortar una parte no deseada del circuito dándole a la electricidad un camino más corto a seguir.
hackerb9
1
@CortAmmon: querrá leer el siguiente párrafo donde menciono que la semántica del operador definida por el usuario es ligeramente diferente y que debería ver la especificación para más detalles.
Eric Lippert
27

En C # estos son todos operadores lógicos.

int x = 0xABCD & 0xFF // x == 0xCD

&&y ||se denominan " operadores lógicos condicionales " porque están en cortocircuito.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Tenga en cuenta que esta terminología difiere de un idioma a otro. En C y C ++ &&y ||son solo operadores lógicos. En Java, &y |se llaman Operadores Bitwise , mientras que C y C ++ los clasifica como Operadores Aritméticos .

Robert Harvey
fuente
3
Sí, Microsoft es la autoridad, pero el documento autorizado es la especificación. Consulte la sección 7.12, Operadores lógicos condicionales .
Eric Lippert
8
La moraleja de la historia es: es más importante comprender con precisión lo que hacen estos operadores que ser precisos sobre sus nombres.
Robert Harvey
21
Concéntrese en lo que hacen los operadores y deje de obsesionarse con el vocabulario. Ver también Nomenclatura considerada perjudicial .
Robert Harvey
44
+1. Todo lo que aparece en la pregunta son solo operadores que toman una o dos expresiones y evalúan su valor. Los adjetivos son la división innecesaria del cabello.
Blrfl
-2

El punto es que &y |están a nivel de bits los operadores, lo que significa que se aplican a y valores de cadena de bits de rendimiento. Y bitwise es un término muy utilizado entre los programadores.

Por ejemplo 0xff & 0x00 == 0x00, mientras 0xff | 0x00 == 0xff.

Y &&y ||se aplican a las condiciones, y producen los valores habituales de las condiciones; es decir truey false.

Por ejemplo true && false == false, mientras true || false == true.

Por lo tanto &&, y ||podría llamarse condicionales operadores, a pesar de que no es un término habitual entre los programadores.

Por supuesto, todos los programadores de C, C ++, Java y C # saben todo eso. Pero supongo que el malentendido sucede porque "operador condicional" no es un término que los programadores usamos con frecuencia.

Hilton Fernandes
fuente
55
Por supuesto, todos los programadores de C, C ++, Java y C # saben todo eso. Es una cosa muy grosera de escribir, lo que implica que el OP es estúpido. Lo mismo al escribirnos a los programadores , excluye el OP. Por favor no hagas eso.
DarkDust
1
No creo que su respuesta posterior brinde ningún valor agregado después de la respuesta aceptada de Eric Lippert, y además es incorrecta en el sentido de no entender el punto de la pregunta.
Honza Zidek
@DarkDust Todos los programadores de C, C ++, Java y C # deben comprender esos operadores. Esto no es ser grosero sino un hecho .
Phil1970
1
@ Phil1970: OP parece entender a estos operadores, se trata de aclarar los nombres . Desde este punto de vista, y habiendo enfatizado los términos relevantes en la respuesta de Hilton, esa frase suya se puede interpretar como que significa que cada programador sabe sobre estos detalles de nombres, pero usted no . Esto está mal (como se puede ver en las discusiones de las otras respuestas) y su redacción es grosera.
DarkDust
44
Queridos, lo siento si mi respuesta fue grosera. El inglés no es el primer idioma. En cualquier caso, nunca tuve la intención de implicar que el OP no era un programador. Al contrario, quise decir que estaba confundido por un nombre inusual en el texto que leía. Todo lo que intenté hacer fue aclarar los nombres inusuales por fragmentos de programa.
Hilton Fernandes