En informática , el tipo de datos booleano (a veces abreviado como Bool) es un tipo de datos que tiene uno de dos valores posibles (generalmente denominados verdadero y falso ) que está destinado a representar los dos valores de verdad de la lógica y el álgebra de Boole . Recibe su nombre en honor a George Boole , quien definió por primera vez un sistema algebraico de lógica a mediados del siglo XIX. El tipo de datos booleano se asocia principalmente con declaraciones condicionales , que permiten diferentes acciones al cambiar el flujo de control dependiendo de si una condición booleana especificada por el programador se evalúa como verdadera o falsa. Es un caso especial de un tipo de datos lógicos más general : la lógica no siempre necesita ser booleana (consulte lógica probabilística ).
En lenguajes de programación con un tipo de datos booleano incorporado, como Pascal y Java , los operadores de comparación como >
y ≠
se definen generalmente para devolver un valor booleano. Se pueden definir comandos condicionales e iterativos para probar expresiones con valores booleanos.
Los lenguajes sin un tipo de datos booleano explícito, como C90 y Lisp , aún pueden representar valores de verdad mediante algún otro tipo de datos. Common Lisp usa una lista vacía para falso y cualquier otro valor para verdadero. El lenguaje de programación C usa un tipo entero , donde las expresiones relacionales como i > j
y expresiones lógicas conectadas por &&
y ||
se definen para tener valor 1 si es verdadero y 0 si es falso, mientras que las partes de prueba de if
, while
, for
, etc., tratan cualquier valor distinto de cero como verdadero. [1] [2] De hecho, una variable booleana puede considerarse (e implementarse) como una variable numérica con un dígito binario ( bit ), o como una cadena de bits de longitud uno, que puede almacenar solo dos valores. La implementación de booleanos en computadoras probablemente se represente como una palabra completa , en lugar de un bit; esto generalmente se debe a las formas en que las computadoras transfieren bloques de información.
La mayoría de los lenguajes de programación, incluso aquellos que no tienen un tipo booleano explícito, admiten operaciones algebraicas booleanas como conjunción ( AND
, &
, *
), disyunción ( OR
, |
, +
), equivalencia ( EQV
, =
, ==
), exclusiva o no equivalencia ( XOR
, NEQV
, ^
, !=
, ¬
) y negación ( NOT
, ~
, !
, ¬
).
En algunos lenguajes, como Ruby , Smalltalk y Alice, los valores verdadero y falso pertenecen a clases separadas , por ejemplo, True
y False
, respectivamente, por lo que no existe un único tipo booleano .
En SQL , que utiliza una lógica de tres valores para comparaciones explícitas debido a su tratamiento especial de los valores nulos , el tipo de datos booleano (introducido en SQL:1999 ) también se define para incluir más de dos valores de verdad, de modo que los valores booleanos de SQL puedan almacenar todos los valores lógicos resultantes de la evaluación de predicados en SQL. Una columna de tipo booleano se puede restringir a solo TRUE
y FALSE
aunque.
Uno de los primeros lenguajes de programación que proporciona un BOOLEAN
tipo de datos explícito es ALGOL 60 (1960) con valores verdadero y falso y operadores lógicos denotados por los símbolos ' ' (y), ' ' (o), ' ' (implica), ' ' (equivalencia) y ' ' (no). Sin embargo, debido a los límites de los dispositivos de entrada y del conjunto de caracteres en muchas computadoras de la época, la mayoría de los compiladores usaban representaciones alternativas para muchos de los operadores, como o .AND
'AND'
Este enfoque como tipo de datosBOOLEAN
incorporado (ya sea primitivo o predefinido) fue adoptado por muchos lenguajes de programación posteriores, como Simula 67 (1967), ALGOL 68 (1970), [3] Pascal (1970), Ada (1980), Java (1995) y C# (2000), entre otros.
La primera versión de FORTRAN (1957) y su sucesor FORTRAN II (1958) no tienen valores ni operaciones lógicas; incluso la IF
declaración condicional toma una expresión aritmética y se ramifica a una de tres ubicaciones según su signo; consulte IF aritmético . FORTRAN IV (1962), sin embargo, sigue el ejemplo de ALGOL 60 al proporcionar un tipo de datos booleano ( LOGICAL
), literales de verdad ( .TRUE.
y .FALSE.
), IF
declaración lógica, operadores de comparación numérica con valores booleanos ( .EQ.
, .GT.
, etc.) y operadores lógicos ( .NOT.
, .AND.
, .OR.
, .EQV.
y .NEQV.
). En FORMAT
las declaraciones, se proporciona un descriptor de formato específico (' L
') para el análisis o formateo de valores lógicos. [4]
El lenguaje Lisp (1958) nunca tuvo un tipo de datos booleano incorporado. En cambio, las construcciones condicionales como cond
suponen que el valor lógico false está representado por la lista vacía ()
, que se define como la misma que el átomo especial nil
o NIL
; mientras que cualquier otra expresión s se interpreta como true . Por conveniencia, la mayoría de los dialectos modernos de Lisp predefinen el átomo t
para que tenga valor t
, de modo que t
se pueda usar como una notación mnemotécnica para true .
Este enfoque ( cualquier valor puede usarse como valor booleano ) se mantuvo en la mayoría de los dialectos de Lisp ( Common Lisp , Scheme , Emacs Lisp ), y muchos lenguajes de script adoptaron modelos similares , incluso los que tenían un tipo booleano o valores booleanos distintos; aunque los valores que se interpretan como falsos y los que son verdaderos varían de un lenguaje a otro. En Scheme, por ejemplo, el valor falso es un átomo distinto de la lista vacía, por lo que esta última se interpreta como verdadera . Common Lisp, por otro lado, también proporciona el boolean
tipo dedicado, derivado como una especialización del símbolo. [5]
El lenguaje Pascal (1970) popularizó el concepto de tipos enumerados definidos por el programador , previamente disponibles con una nomenclatura diferente en COBOL , FACT y JOVIALBoolean
. Luego se proporcionó un tipo de datos integrado como un tipo enumerado predefinido con valores FALSE
y TRUE
. Por definición, todas las comparaciones, operaciones lógicas y declaraciones condicionales se aplicaban a y/o producían Boolean
valores. De lo contrario, el Boolean
tipo tenía todas las facilidades que estaban disponibles para los tipos enumerados en general, como el ordenamiento y el uso como índices. Por el contrario, la conversión entre Boolean
s y enteros (o cualquier otro tipo) aún requería pruebas explícitas o llamadas a funciones, como en ALGOL 60. Este enfoque ( Boolean es un tipo enumerado ) fue adoptado por la mayoría de los lenguajes posteriores que tenían tipos enumerados, como Modula , Ada y Haskell .
Las implementaciones iniciales del lenguaje C (1972) no proporcionaban ningún tipo booleano y, hasta el día de hoy, los valores booleanos se representan comúnmente mediante números enteros ( int
) en los programas de C. Los operadores de comparación ( >
, ==
, etc.) están definidos para devolver un int
resultado entero con signo ( ), ya sea 0 (para falso) o 1 (para verdadero). Los operadores lógicos ( &&
, ||
, !
, etc.) y las declaraciones de prueba de condición ( if
, while
) suponen que cero es falso y todos los demás valores son verdaderos.
Después de que enum
se añadieran los tipos enumerados a la versión de C del Instituto Nacional Estadounidense de Estándares ( ANSI C, por sus siglas en inglés) (1989), muchos programadores de C se acostumbraron a definir sus propios tipos booleanos como tales, por razones de legibilidad. Sin embargo, los tipos enumerados son equivalentes a los números enteros según los estándares del lenguaje; por lo tanto, la identidad efectiva entre los booleanos y los números enteros sigue siendo válida para los programas de C.
El C estándar (desde C99 ) proporciona un tipo booleano, llamado _Bool
. Al incluir el encabezado stdbool.h
, se puede usar el nombre más intuitivo bool
y las constantes true
y false
. El lenguaje garantiza que dos valores verdaderos cualesquiera se compararán como iguales (lo que era imposible de lograr antes de la introducción del tipo). Los valores booleanos aún se comportan como números enteros, se pueden almacenar en variables enteras y se pueden usar en cualquier lugar donde los números enteros sean válidos, incluso en indexación, aritmética, análisis y formato. Este enfoque ( los valores booleanos son simplemente números enteros ) se ha conservado en todas las versiones posteriores de C. Tenga en cuenta que esto no significa que cualquier valor entero se pueda almacenar en una variable booleana.
C++ tiene un tipo de datos booleano separado bool
, pero con conversiones automáticas de valores escalares y de puntero que son muy similares a las de C. Este enfoque fue adoptado también por muchos lenguajes posteriores, especialmente por algunos lenguajes de script como AWK .
El lenguaje de programación D tiene un tipo de datos booleano adecuado bool
. El bool
tipo es un tipo del tamaño de un byte que solo puede contener el valor true o false. Los únicos operadores que pueden aceptar operandos de tipo bool son: &, |, ^, &=, |=, ^=, !, &&, || y ?:. Un bool
valor se puede convertir implícitamente a cualquier tipo integral, donde false se convierte en 0 y true en 1. Los literales numéricos 0 y 1 se pueden convertir implícitamente a los valores bool false y true, respectivamente. Convertir una expresión en bool
significa probar si es 0 o !=0 para tipos aritméticos, y null o !=null para punteros o referencias.
Objective-C también tiene un tipo de datos booleano separado BOOL
, con valores posibles que son YES
o NO
, equivalentes de verdadero y falso respectivamente. [6] Además, en los compiladores Objective-C que admiten C99, _Bool
se puede usar el tipo de C, ya que Objective-C es un superconjunto de C.
En Java , el valor del boolean
tipo de datos solo puede ser true
o false
. [7]
Perl no tiene un tipo de datos booleano. En cambio, cualquier valor puede comportarse como booleano en un contexto booleano (condición de la declaración if
or while
, argumento de &&
or ||
, etc.). El número 0
, las cadenas "0"
and ""
, la lista vacía ()
y el valor especial undef
se evalúan como falso. [8] Todo lo demás se evalúa como verdadero.
Lua tiene un tipo de datos booleano, pero los valores no booleanos también pueden comportarse como booleanos. El valor no booleano nil
se evalúa como falso, mientras que cualquier otro valor de tipo de datos se evalúa como verdadero. Esto incluye la cadena vacía ""
y el número 0
, que se consideran muy a menudo false
en otros lenguajes.
PL/I no tiene un tipo de datos booleano. En su lugar, los operadores de comparación generan valores BIT(1); '0'B representa falso y '1'B representa verdadero . Los operandos de, por ejemplo, &
, |
, ¬
, se convierten en cadenas de bits y las operaciones se realizan en cada bit. La expresión de elemento de una IF
declaración es verdadera si cualquier bit es 1.
Rexx no tiene un tipo de datos booleano. En su lugar, los operadores de comparación generan 0 o 1; 0 representa falso y 1 representa verdadero . Los operandos de, por ejemplo, &
, |
, ¬
, deben ser 0 o 1.
Tcl no tiene un tipo booleano independiente. Al igual que en C, se utilizan los números enteros 0 (falso) y 1 (verdadero; de hecho, cualquier número entero distinto de cero). [9]
Ejemplos de codificación:
establece v 1 si { $v } { pone "V es 1 o verdadero" }
Lo anterior mostraráV es 1 o verdaderoya que la expresión evalúa a 1.
establecer v "" si { $v } ....
Lo anterior generará un error, ya que la variable v no se puede evaluar como 0 o 1.
Python , desde la versión 2.3 en adelante, tiene un bool
tipo que es una subclase de int
, el tipo entero estándar. [10] Tiene dos valores posibles: True
y False
, que son versiones especiales de 1 y 0 respectivamente y se comportan como tales en contextos aritméticos. Además, un valor numérico de cero (entero o fraccionario), el valor nulo ( None
), la cadena vacía y los contenedores vacíos (listas, conjuntos , etc.) se consideran falsos booleanos; todos los demás valores se consideran verdaderos booleanos de forma predeterminada. [11] Las clases pueden definir cómo se tratan sus instancias en un contexto booleano a través del método especial __nonzero__
(Python 2) o __bool__
(Python 3). Para los contenedores, __len__
se utiliza (el método especial para determinar la longitud de los contenedores) si no se define el método de conversión booleano explícito.
En Ruby , por el contrario, sólo nil
(el valor nulo de Ruby) y un false
objeto especial son falsos ; todo lo demás (incluido el entero 0 y las matrices vacías) es verdadero .
Los valores booleanos aparecen en SQL cuando se necesita una condición , como la cláusula WHERE , en forma de predicado que se produce mediante el uso de operadores como los operadores de comparación, el operador IN , IS (NOT) NULL , etc. Sin embargo, además de TRUE y FALSE , estos operadores también pueden producir un tercer estado, llamado UNKNOWN , cuando se realiza una comparación con .NULL
El estándar SQL92 introdujo los operadores IS (NOT) TRUE, IS (NOT) FALSE y IS (NOT) UNKNOWN que evalúan un predicado, lo cual es anterior a la introducción del tipo booleano en SQL:1999 .
El estándar SQL:1999 introdujo un tipo de datos BOOLEAN como una característica opcional (T031). Cuando está restringido por una restricción NOT NULL , un BOOLEAN de SQL se comporta como los booleanos en otros lenguajes, que solo pueden almacenar valores TRUE y FALSE . Sin embargo, si es nulo, que es el valor predeterminado como todos los demás tipos de datos SQL, también puede tener el valor nulo especial. Aunque el estándar SQL define tres literales para el tipo BOOLEAN ( TRUE, FALSE y UNKNOWN ), también dice que NULL BOOLEAN y UNKNOWN "pueden usarse indistintamente para significar exactamente lo mismo". [12] [13] Esto ha causado cierta controversia porque la identificación somete a UNKNOWN a las reglas de comparación de igualdad para NULL. Más precisamente, no es TRUE sino UNKNOWN/NULL . [14] A partir de 2012, pocos sistemas SQL importantes implementan la característica T031. [15] Firebird y PostgreSQL son excepciones notables, aunque PostgreSQL no implementa ningún literal UNKNOWN ; se puede utilizar en su lugar. [16]UNKNOWN = UNKNOWN
NULL
El tratamiento de los valores booleanos difiere entre los sistemas SQL.
Por ejemplo, en Microsoft SQL Server , el valor booleano no se admite en absoluto, ni como un tipo de datos independiente ni representable como un entero. Muestra el mensaje de error "Una expresión de tipo no booleano especificada en un contexto donde se espera una condición" si una columna se usa directamente en la cláusula WHERE , por ejemplo , mientras que una instrucción como produce un error de sintaxis. El tipo de datos BIT , que solo puede almacenar números enteros 0 y 1 además de NULL , se usa comúnmente como una solución alternativa para almacenar valores booleanos, pero se deben usar soluciones alternativas como para convertir entre el entero y la expresión booleana.SELECT a FROM t WHERE a
SELECT column IS NOT NULL FROM t
UPDATE t SET flag = IIF(col IS NOT NULL, 1, 0) WHERE flag = 0
Microsoft Access , que utiliza el motor de base de datos de Access (ACE/JET), [17] tampoco tiene un tipo de datos booleano. De manera similar a MS SQL Server, utiliza un tipo de datos BIT . [18] En Access se lo conoce como un tipo de datos Sí/No [19] que puede tener dos valores; Sí (Verdadero) o No (Falso). El tipo de datos BIT en Access también se puede representar numéricamente; Verdadero es −1 y Falso es 0. [20] Esto difiere de MS SQL Server en dos formas, aunque ambos son productos de Microsoft:
PostgreSQL tiene un tipo BOOLEAN distinto al del estándar, [21] que permite almacenar predicados directamente en una columna BOOLEAN y permite usar una columna BOOLEAN directamente como predicado en una cláusula WHERE .
En MySQL , BOOLEAN se trata como un alias de ; [22] VERDADERO es lo mismo que el entero 1 y FALSO es lo mismo que el entero 0. [23] Cualquier entero distinto de cero es verdadero en las condiciones.TINYINT(1)
Tableau Software tiene un tipo de datos BOOLEAN. [24] El literal de un valor booleano es True
o False
. [25]
La función Tableau INT()
convierte un valor booleano en un número, devolviendo 1 para Verdadero y 0 para Falso. [26]
Forth (lenguaje de programación) no tiene tipo booleano, utiliza números enteros regulares: el valor 0 (todos los bits bajos) representa falso y -1 (todos los bits altos) representa verdadero. Esto permite que el lenguaje defina solo un conjunto de operadores lógicos, en lugar de uno para cálculos matemáticos y otro para condiciones. [27]
En algunos lenguajes de programación, cualquier expresión puede evaluarse en un contexto que espera un tipo de datos booleano. Normalmente (aunque esto varía según el lenguaje de programación) las expresiones como el número cero , la cadena vacía , las listas vacías y null se tratan como falsas, y las cadenas con contenido (como "abc"), otros números y objetos se evalúan como verdaderas. A veces, estas clases de expresiones se denominan falsy y truthy. Por ejemplo, en Lisp , nil , la lista vacía, se trata como falsa y todos los demás valores se tratan como verdaderos. En C , el número 0 o 0.0 es falso y todos los demás valores se tratan como verdaderos.
En JavaScript , la cadena vacía (""
), null
, undefined
, NaN, +0, −0 y false
[28] a veces se denominan falsy (cuyo complemento es truthy ) para distinguir entre booleanos con verificación de tipo estricta y booleanos forzados (ver también: Sintaxis de JavaScript#Conversión de tipo ). [29] A diferencia de Python, los contenedores vacíos (matrices, mapas, conjuntos) se consideran verdaderos. Los lenguajes como PHP también utilizan este enfoque.{{cite web}}
: CS1 maint: nombres numéricos: lista de autores ( enlace )