Articulo de referencia

Tipo de datos booleano

George Boole , quien da nombre al tipo de dato. En informática , el booleano (a veces utilizado por los programadores) es un tipo de dato que tiene uno de dos valores posibles (...

George Boole , quien da nombre al tipo de dato.

En informática , el booleano (a veces utilizado por los programadores) es un tipo de dato que tiene uno de dos valores posibles (generalmente denotados como verdadero y falso ) y que pretende representar los dos valores de verdad de la lógica y el álgebra booleana . Recibe su nombre de George Boole , quien definió por primera vez un sistema algebraico de lógica a mediados del siglo XIX. El tipo de dato booleano se asocia principalmente con las sentencias 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 dato lógico más general ; la lógica no siempre tiene que ser booleana (véase lógica probabilística ).

Generalidades

En lenguajes de programación con un tipo de dato booleano incorporado, como Pascal , C , Python o Java , los operadores de comparación, como >`and`, suelen estar definidos para devolver un valor booleano. Se pueden definir comandos condicionales e iterativos para probar expresiones con valores booleanos.

Los lenguajes sin un tipo de dato booleano explícito, como C90 y Lisp , aún pueden representar valores de verdad mediante algún otro tipo de dato. 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 > jy las expresiones lógicas conectadas por &&y ||se definen para tener el 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 representa 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 sin un tipo booleano explícito, admiten operaciones algebraicas booleanas como la conjunción ( AND, &, *), la disyunción ( OR, |, +), la equivalencia ( EQV, =, ==), la disyunción exclusiva o no equivalencia ( XOR, NEQV, ^, !=, ¬) y la negación ( NOT, ~, !, ¬).

En algunos lenguajes, como Ruby , Smalltalk y Alice , los valores verdadero y falso pertenecen a clases separadas , por ejemplo, Truey 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 booleanos de SQL pueden almacenar todos los valores lógicos resultantes de la evaluación de predicados en SQL. Sin embargo, una columna de tipo booleano puede restringirse solo a verdadero TRUEy FALSEfalso.

Implementaciones específicas del lenguaje

ALGOL y el tipo BOOLEAN incorporado

Uno de los primeros lenguajes de programación en proporcionar un BOOLEANtipo de dato explícito es ALGOL 60 (1960) con valores verdadero y falso y operadores lógicos denotados por símbolos '{\displaystyle \wedge }' (y), '{\displaystyle \vee }' (o), '{\displaystyle \supset }' (implica), '{\displaystyle \equiv }' (equivalencia), y '¬{\displaystyle \neg }' (no). Sin embargo, debido a las limitaciones de los dispositivos de entrada y los conjuntos de caracteres en muchas computadoras de la época, la mayoría de los compiladores utilizaban representaciones alternativas para muchos de los operadores, como ANDo 'AND'.

Este enfoque, que utiliza un 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.

C, C++, D, Objective-C, AWK

Las implementaciones iniciales del lenguaje C (1972) no proporcionaban un tipo booleano, y hasta el día de hoy los valores booleanos se representan comúnmente mediante enteros ( ints ) en los programas C. Los operadores de comparación ( >, ==, etc.) están definidos para devolver un intresultado entero con signo ( ), ya sea 0 (para falso) o 1 (para verdadero). Los operadores lógicos ( &&, ||, !, etc.) y las sentencias de prueba de condición ( if, while) asumen que cero (y por lo tanto también un puntero NULL o un terminador de cadena nulo '\0') es falso y todos los demás valores son verdaderos.

Tras la incorporación de los tipos enumerados ( ) a la versión de C del Instituto Nacional Estadounidense de Estándares ( ANSI C , 1989), muchos programadores de C se acostumbraron a definir sus propios tipos booleanos como tales, por motivos de legibilidad. Sin embargo, según los estándares del lenguaje, los tipos enumerados son equivalentes a los enteros; por lo tanto, la identidad efectiva entre booleanos y enteros sigue siendo válida para los programas en C.enum

El estándar C (desde C99 ) proporciona un tipo booleano llamado _Bool. Desde C23 , el booleano es ahora un tipo de datos central llamado bool, con valores truey false(anteriormente estos eran proporcionados por macros del encabezado stdbool.h, que ahora está obsoleto). El lenguaje garantiza que cualquier par de valores verdaderos se compararán como iguales (lo cual era imposible de lograr antes de la introducción del tipo). Los valores booleanos aún se comportan como enteros, se pueden almacenar en variables enteras y se pueden usar en cualquier lugar donde los enteros serían válidos, incluyendo en indexación, aritmética, análisis y formato. Este enfoque ( los valores booleanos son simplemente enteros ) se ha mantenido 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++ cuenta con el tipo de dato booleano booldesde C++98 , pero con conversiones automáticas de valores escalares y de puntero muy similares a las de C. Este enfoque fue adoptado también por muchos lenguajes posteriores, especialmente por algunos lenguajes de scripting como AWK .

El lenguaje de programación D tiene un tipo de dato booleano propio bool. Este booltipo es de tamaño byte y solo puede contener los valores verdadero o falso. Los únicos operadores que pueden aceptar operandos de tipo bool son: &, |, ^, &=, |=, ^=,  !, &&, || y ?: . Un valor se puede convertir implícitamente a cualquier tipo entero, donde falso se convierte en 0 y verdadero en 1. Los literales numéricos 0 y 1 se pueden convertir implícitamente a los valores booleanos falso y verdadero, respectivamente. Convertir una expresión a significa comprobar si es 0 o != 0 para tipos aritméticos, y nulo o != nulo para punteros o referencias.boolbool

Objective-C también tiene un tipo de dato booleano separado BOOL, con valores posibles que son YESo NO, equivalentes de verdadero y falso respectivamente. [ 4 ] Además, en los compiladores de Objective-C que admiten C99, _Boolse puede usar el tipo de C, ya que Objective-C es un superconjunto de C.

Adelante

Forth (lenguaje de programación) no tiene tipo booleano; utiliza enteros regulares: el valor 0 (todos los bits en bajo) representa falso y -1 (todos los bits en alto) representa verdadero. Esto permite que el lenguaje defina un único conjunto de operadores lógicos, en lugar de uno para cálculos matemáticos y otro para condiciones. [ 5 ]

Fortran

La primera versión de FORTRAN (1957) y su sucesora FORTRAN II (1958) no tienen valores ni operaciones lógicas; incluso la IFinstrucción condicional toma una expresión aritmética y se ramifica a una de tres ubicaciones según su signo; véase 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.), IFinstrucción lógica, operadores de comparación numérica con valor booleano ( .EQ., .GT., etc.) y operadores lógicos ( .AND., .OR., y .NOT.). En FORMATlas instrucciones, Lse proporciona un descriptor de formato específico (' ') para el análisis o formato de valores lógicos. Una extensión común anterior a FORTRAN 77 fue extender los operadores .EQ.y , o tal vez agregar un operador para comparar expresiones booleanas. [ 6 ] Fortran 77 agregó los operadores y para estandarizar las operaciones. Fortran 90 agregó operadores de comparación alternativos , , , , , y ..NE..XOR..EQV..NEQV.<<===/=>>=

Java

En Java , el valor del booleantipo de datos solo puede ser trueo false. [ 7 ]

Unidad

En Unity , el valor de boolean(también conocido como bool) puede ser trueo falsey se utiliza en la programación de scripts.

Lisp y Scheme

El lenguaje Lisp (1958) nunca tuvo un tipo de dato booleano incorporado. En cambio, las construcciones condicionales como condasumen que el valor lógico falso está representado por la lista vacía (), que se define como la misma que el átomo especial nilo NIL; mientras que cualquier otra expresión s se interpreta como verdadera . Para mayor comodidad, la mayoría de los dialectos modernos de Lisp predefinen el átomo tcon el valor t, de modo que tse puede usar como una notación mnemotécnica para verdadero .

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 scripting adoptaron modelos similares , incluso aquellos que tienen un tipo booleano o valores booleanos distintos; aunque los valores que se interpretan como falsos y los que se interpretan como 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 booleantipo dedicado, derivado como una especialización del símbolo. [ 8 ]

Pascal, Ada y Haskell

El lenguaje Pascal (1970) popularizó el concepto de tipos enumerados definidos por el programador, previamente disponibles con una nomenclatura diferente en COBOL , FACT y JOVIAL . Un tipo de dato integrado Booleanse proporcionó entonces como un tipo enumerado predefinido con valores FALSEy TRUE. Por definición, todas las comparaciones, operaciones lógicas y sentencias condicionales se aplicaban a y/o producían Booleanvalores. Por lo demás, el Booleantipo tenía todas las facilidades que estaban disponibles para los tipos enumerados en general, como el ordenamiento y el uso como índices. En contraste, la conversión entre Booleany enteros (o cualquier otro tipo) todavía 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 .

Perl y Lua

Perl no tiene un tipo de dato booleano. En cambio, cualquier valor puede comportarse como booleano en un contexto booleano (condición de ifuna whileinstrucción, argumento de &&una instrucción ||, etc.). El número 0, las cadenas"0" y "", la lista vacía ()y el valor especial undefse evalúan como falsos. [ 9 ] Todo lo demás se evalúa como verdadero.

Lua tiene un tipo de dato booleano, pero los valores no booleanos también pueden comportarse como tales. El valor no booleano nilse evalúa como falso, mientras que cualquier otro valor de tipo de dato se evalúa como verdadero. Esto incluye la cadena vacía ""y el número 0, que se consideran con frecuencia falseen otros lenguajes.

PL/I

PL/I no tiene un tipo de dato 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 sobre cada bit. La expresión de un elemento de una IFinstrucción es verdadera si algún bit es 1.

Python y Ruby

Python , desde la versión 2.3 en adelante, tiene un booltipo que es una subclase de int, el tipo entero estándar. [ 10 ] Tiene dos valores posibles: Truey 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 fraccional), 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 por defecto. [ 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 contenedores, __len__(el método especial para determinar la longitud de los contenedores) se utiliza si no se define el método de conversión booleana explícito.

En Ruby , por el contrario, solo nil(el valor nulo de Ruby) y un falseobjeto especial son falsos ; todo lo demás (incluido el entero 0 y los arreglos vacíos) es verdadero .

Rexx

Rexx no tiene un tipo de dato booleano. En cambio, 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.

SQL

Los booleanos aparecen en SQL cuando se necesita una condición , como en la cláusula WHERE , en forma de predicado que se produce mediante el uso de operadores como operadores de comparación, 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 e IS (NOT) UNKNOWN que evalúan un predicado, lo que precedió a la introducción del tipo Boolean en SQL:1999 .

El estándar SQL:1999 introdujo el tipo de datos BOOLEAN como una característica opcional (T031). Cuando se restringe mediante una restricción NOT NULL , un SQL BOOLEAN se comporta como los booleanos en otros lenguajes, que solo pueden almacenar valores TRUE y FALSE . Sin embargo, si es anulable, que es el valor predeterminado como todos los demás tipos de datos SQL, también puede tener el valor especial null. Aunque el estándar SQL define tres literales para el tipo BOOLEAN ( TRUE, FALSE y UNKNOWN ), también indica 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 el literal UNKNOWN ; se puede usar en su lugar. [ 16 ]UNKNOWN = UNKNOWNNULL

El tratamiento de los valores booleanos difiere entre los sistemas SQL.

Por ejemplo, en Microsoft SQL Server , el valor booleano no es compatible en absoluto, ni como 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 , p. ej ., mientras que una instrucción como produce un error de sintaxis. El tipo de datos BIT , que solo puede almacenar enteros 0 y 1 aparte de NULL , se usa comúnmente como una solución alternativa para almacenar valores booleanos, pero se necesitan soluciones alternativas como para convertir entre la expresión entera y la booleana.SELECTaFROMtWHEREaSELECTcolumnISNOTNULLFROMtUPDATEtSETflag=IIF(colISNOTNULL,1,0)WHEREflag=0

Microsoft Access , que utiliza el motor de base de datos Access (ACE/JET), [ 17 ] tampoco tiene un tipo de datos booleano. Al igual que MS SQL Server, utiliza un tipo de datos BIT . [ 18 ] En Access se 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 aspectos, aunque ambos son productos de Microsoft:

  1. Access representa TRUE como 1, mientras que en SQL Server es 1.
  2. Access no admite el estado triple nulo, compatible con SQL Server.

PostgreSQL tiene un tipo BOOLEAN distinto como en el 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 ] TRUE es lo mismo que el entero 1 y FALSE es lo mismo que el entero 0. [ 23 ] Cualquier entero distinto de cero es verdadero en las condiciones.TINYINT(1)

Cuadro

Tableau Software tiene un tipo de datos BOOLEAN. [ 24 ] El literal de un valor booleano es Trueo False. [ 25 ]

La INT()función Tableau convierte un valor booleano en un número, devolviendo 1 para verdadero y 0 para falso. [ 26 ]

Tcl

Tcl no tiene un tipo booleano independiente. Al igual que en C, se utilizan los enteros 0 (falso) y 1 (verdadero; de hecho, cualquier entero distinto de cero). [ 27 ]

Ejemplos de codificación:

establecer v 1 si { $v } { poner "V es 1 o verdadero" }

Lo anterior mostraráV es 1 o verdaderoya que la expresión se evalúa a 1.

establecer v "" si { $v } .... 

Lo anterior producirá un error, ya que la variable v no puede evaluarse como 0 o 1.

Verdadero

En algunos lenguajes de programación, cualquier expresión puede evaluarse en un contexto que espera un tipo de dato booleano. Normalmente (aunque esto varía según el lenguaje de programación), expresiones como el número cero , la cadena vacía , las listas vacías y null se tratan como falsos, y las cadenas con contenido (como "abc"), otros números y objetos se evalúan como verdaderos. A veces, estas clases de expresiones se denominan falsas y verdaderas. Por ejemplo, en Lisp , nil , la lista vacía, se trata como falso, 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, −0y false[ 28 ] a veces se denominan falsas (cuyo complemento es verdadero ) para distinguir entre booleanos con comprobación de tipo estricta y booleanos con conversión de tipo (véase también: Sintaxis de JavaScript#Conversión de tipos ). [ 29 ] A diferencia de Python, los contenedores vacíos (arrays, mapas, conjuntos) se consideran verdaderos. Lenguajes como PHP también utilizan este enfoque.

Véase también

Referencias

  1. Kernighan, Brian W .; Ritchie, Dennis M. (1978). El lenguaje de programación C (1.ª  ed.). Englewood Cliffs, NJ : Prentice Hall . pág . 41. ISBN  0-13-110163-3.
  2. Plauger, PJ ; Brodie, Jim (1992) [1989]. ANSI and ISO Standard C Programmer's Reference . Microsoft Press . pp. 86–93 . ISBN  1-55615-359-7.
  3. "Informe sobre el lenguaje algorítmico ALGOL 68, Sección 10.2.2" (PDF) . Agosto de 1968. Archivado (PDF) del original el 6 de abril de 2008. Recuperado el 30 de abril de 2007 .
  4. "Guías y código de ejemplo" . developer.apple.com . Archivado del original el 7 de septiembre de 2011. Consultado el 1 de mayo de 2018 .
  5. "4. Decisiones, decisiones..." Forth Inc. 11 de febrero de 2022. Consultado el 11 de febrero de 2022 .
  6. Digital Equipment Corporation, DECSystem10 FORTRAN IV Programmers Reference Manual . Reimpreso en Mathematical Languages ​​Handbook . Versión en línea archivada el 14 de agosto de 2011 en Wayback Machine, consultada el 16 de noviembre de 2011.
  7. "Java Booleans" . Tutoriales web en línea de W3Schools . Consultado el 17 de febrero de 2021 .
  8. "CLHS: Tipo BOOLEAN" .
  9. "perlsyn - Sintaxis de Perl / Verdad y falsedad" . Archivado del original el 26 de agosto de 2013. Consultado el 10 de septiembre de 2013 .
  10. van Rossum, Guido (3 de abril de 2002). "PEP 285 -- Agregar un tipo booleano" . Archivado del original el 1 de mayo de 2013. Recuperado el 15 de mayo de 2013 .
  11. "Expresiones" . Documentación de Python v3.3.2 . Archivado del original el 22 de mayo de 2013. Consultado el 15 de mayo de 2013 .
  12. C. Date (2011). SQL y la teoría relacional: Cómo escribir código SQL preciso . O'Reilly Media, Inc. pág. 83. ISBN  978-1-4493-1640-2.
  13. ISO/IEC 9075-2:2011 §4.5
  14. Martyn Prigmore (2007). Introducción a las bases de datos con aplicaciones web . Pearson Education Canada. pág. 197. ISBN  978-0-321-26359-9.
  15. Troels Arvin, Estudio sobre la implementación del tipo de datos BOOLEAN. Archivado el 9 de marzo de 2005 en Wayback Machine.
  16. "PostgreSQL: Documentación: 10: 8.6. Tipo booleano" . www.postgresql.org . Archivado del original el 9 de marzo de 2018. Consultado el 1 de mayo de 2018 .
  17. "Migrar una base de datos de Access a SQL Server" . support.microsoft.com . Consultado el 19 de octubre de 2020 .
  18. o365devx. "Tipos de datos SQL (Referencia de la base de datos de escritorio de Access)" . docs.microsoft.com . Consultado el 19 de octubre de 2020 .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  19. "Introducción a los tipos de datos y propiedades de campo" . support.microsoft.com . Consultado el 19 de octubre de 2020 .
  20. "Datos booleanos - Tutorial de MS-Access" . sourcedaddy.com . Consultado el 19 de octubre de 2020 .
  21. "Tipo booleano" . 27 de octubre de 2016.
  22. "MySQL :: Manual de referencia de MySQL 8.0 :: 12.1.1 Descripción general de los tipos numéricos" . dev.mysql.com . Archivado del original el 22 de septiembre de 2016.  
  23. "MySQL :: Manual de referencia de MySQL 8.0 :: 9.1.6 Literales booleanos" . dev.mysql.com .  
  24. "Tipos de datos" . help.tableau.com . Consultado el 19 de octubre de 2020 .
  25. "Formato de cálculos en Tableau" . help.tableau.com . Consultado el 19 de octubre de 2020 .
  26. "¿La operación booleana acelera Tableau? ¿Verdadero o falso?" . TAR Solutions . 11 de septiembre de 2020 . Consultado el 19 de octubre de 2020 .
  27. "PEP 285 -- Agregar un tipo booleano" . 4 de mayo de 2011. Archivado del original el 28 de marzo de 2018. Recuperado el 28 de marzo de 2018 .
  28. "Especificación del lenguaje ECMAScript" (PDF) . pág. 43. Archivado del original (PDF) el 12 de abril de 2015. Consultado el 12 de marzo de 2011 . 
  29. "Los elementos del estilo JavaScript" . Douglas Crockford. Archivado del original el 17 de marzo de 2011. Consultado el 5 de marzo de 2011 .