Logical operators
Los operadores lógicos aplican operaciones estándar de álgebra booleana a sus operandos.
| Operador | Nombre del operador | Ejemplo | Resultado |
|---|---|---|---|
| ! | NOT lógico | ! a | la negación lógica de a |
| && | AND lógico | a && b | el AND lógico de a y b |
| || | OR lógico | a || b | el OR lógico de a y b |
Contenidos |
NOT lógico
La expresión NOT lógica tiene la forma
!
expresión
|
|||||||||
donde
| expression | - | una expresión de cualquier tipo escalar |
El operador lógico NOT tiene tipo int . Su valor es 0 si expression se evalúa a un valor que compara desigual a cero. Su valor es 1 si expression se evalúa a un valor que compara igual a cero. (por lo tanto ! E es lo mismo que ( 0 == E ) )
#include <stdbool.h> #include <stdio.h> #include <ctype.h> int main(void) { bool b = !(2+2 == 4); // no verdadero printf("!(2+2==4) = %s\n", b ? "true" : "false"); int n = isspace('a'); // distinto de cero si 'a' es un espacio, cero en caso contrario int x = !!n; // "bang-bang", expresión idiomática común en C para mapear enteros a [0,1] // (todos los valores distintos de cero se convierten en 1) char *a[2] = {"non-space", "space"}; puts(a[x]); // ahora x puede usarse de forma segura como índice para un array de 2 strings }
Salida:
!(2+2==4) = false non-space
AND lógico
La expresión lógica AND tiene la forma
lhs
&&
rhs
|
|||||||||
donde
| lhs | - | una expresión de cualquier tipo escalar |
| rhs | - | una expresión de cualquier tipo escalar, que solo se evalúa si lhs no es igual a 0 |
El operador lógico-AND tiene tipo int y el valor 1 si tanto lhs como rhs se comparan diferentes de cero. Tiene el valor 0 en caso contrario (si lhs o rhs o ambos se comparan iguales a cero).
Hay un punto de secuencia después de la evaluación de lhs . Si el resultado de lhs se compara igual a cero, entonces rhs no se evalúa en absoluto (la llamada evaluación de cortocircuito )
#include <stdbool.h> #include <stdio.h> int main(void) { bool b = 2+2==4 && 2*2==4; // b == true 1 > 2 && puts("this won't print"); char *p = "abc"; if(p && *p) // common C idiom: if p is not null // AND if p does not point at the end of the string { // (note that thanks to short-circuit evaluation, this // will not attempt to dereference a null pointer) // ... // ... then do some string processing } }
OR Lógico
La expresión OR lógica tiene la forma
lhs
||
rhs
|
|||||||||
donde
| lhs | - | una expresión de cualquier tipo escalar |
| rhs | - | una expresión de cualquier tipo escalar, que solo se evalúa si lhs se compara igual a 0 |
El operador lógico-OR tiene tipo int y el valor 1 si cualquiera de los dos lhs o rhs se compara como desigual a cero. Tiene valor 0 en caso contrario (si ambos lhs y rhs se comparan como iguales a cero).
Hay un punto de secuencia después de la evaluación de lhs . Si el resultado de lhs se compara desigual a cero, entonces rhs no se evalúa en absoluto (lo que se denomina evaluación de cortocircuito )
#include <stdbool.h> #include <stdio.h> #include <string.h> #include <errno.h> int main(void) { bool b = 2+2 == 4 || 2+2 == 5; // true printf("true or false = %s\n", b ? "true" : "false"); // logical OR can be used simialar to perl's "or die", as long as rhs has scalar type fopen("test.txt", "r") || printf("could not open test.txt: %s\n", strerror(errno)); }
Salida posible:
true or false = true could not open test.txt: No such file or directory
Referencias
- Estándar C11 (ISO/IEC 9899:2011):
-
- 6.5.3.3 Operadores aritméticos unarios (p: 89)
-
- 6.5.13 Operador AND lógico (p: 99)
-
- 6.5.14 Operador OR lógico (p: 99)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 6.5.3.3 Operadores aritméticos unarios (p: 79)
-
- 6.5.13 Operador AND lógico (p: 89)
-
- 6.5.14 Operador OR lógico (p: 89)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 3.3.3.3 Operadores aritméticos unarios
-
- 3.3.13 Operador AND lógico
-
- 3.3.14 Operador OR lógico
Véase también
| Operadores comunes | ||||||
|---|---|---|---|---|---|---|
| asignación |
incremento
decremento |
aritméticos | lógicos | comparación |
acceso a
miembros |
otros |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
Véase también
|
Documentación de C++
para
Operadores lógicos
|