stringtranslate.com

tipo de datos booleanos

En informática , el booleano (a veces abreviado como Bool) es un tipo de datos que tiene uno de dos valores posibles (generalmente denotados como verdadero y falso ) que pretende representar los dos valores de verdad de la lógica y el álgebra booleana . Lleva el nombre de 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 cambiando 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ógico más general : la lógica no siempre tiene que ser booleana (ver lógica probabilística ).

Generalidades

En lenguajes de programación con un tipo de datos booleano incorporado, como Pascal y Java , los operadores de comparación como >y generalmente se definen 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 utiliza 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 sólo dos valores. La implementación de booleanos en las computadoras probablemente se represente como una palabra completa , en lugar de un bit; Esto suele deberse a la forma 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, Truey False, respectivamente, por lo que no existe un solo tipo booleano .

En SQL , que utiliza una lógica de tres valores para comparaciones explícitas debido a su tratamiento especial de Nulls , 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 puedan almacenar todos valores lógicos resultantes de la evaluación de predicados en SQL. Una columna de tipo booleano se puede restringir a solo TRUEy FALSEaunque.

Implementaciones específicas del lenguaje

ALGOL y el tipo BOOLEAN incorporado

Uno de los primeros lenguajes de programación en proporcionar un BOOLEANtipo de datos explícito es ALGOL 60 (1960) con valores verdadero y falso y operadores lógicos indicados por los símbolos ' ' (y), ' ' (o), ' ' (implica), ' ' ( equivalencia), y ' ' (no). Sin embargo, debido a los límites del dispositivo de entrada y del juego de caracteres en muchas computadoras de la época, la mayoría de los compiladores utilizaron representaciones alternativas para muchos de los operadores, como o .AND'AND'

Este enfoque con 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.

fortran

La primera versión de FORTRAN (1957) y su sucesor FORTRAN II (1958) no tienen valores ni operaciones lógicas; incluso el IFenunciado condicional toma una expresión aritmética y se ramifica a una de tres ubicaciones según su signo; ver aritmética SI . 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.), operadores de comparación numéricos con valores booleanos ( .EQ., .GT., etc.) y operadores lógicos ( .NOT., .AND., .OR.). En FORMATlas declaraciones, se proporciona un descriptor de formato específico (' L') para analizar o formatear valores lógicos. [4]

Ceceo y esquema

El lenguaje Lisp (1958) nunca tuvo un tipo de datos 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 . Por conveniencia, la mayoría de los dialectos modernos de Lisp predefinen el átomo tpara que tenga valor t, de modo que tpueda usarse como notación mnemotécnica para verdadero .

Este enfoque ( cualquier valor puede usarse como valor booleano ) se mantuvo en la mayoría de los dialectos Lisp ( Common Lisp , Scheme , Emacs Lisp ), y muchos lenguajes de programación adoptaron modelos similares , incluso aquellos que tienen un tipo booleano distinto o valores booleanos; aunque qué valores se interpretan como falsos y cuáles son verdaderos varían de un idioma a otro. En Scheme, por ejemplo, el valor falso es un átomo distinto de la lista vacía, por lo que este último se interpreta como verdadero . Common Lisp, por otro lado, también proporciona el booleantipo dedicado, derivado como una especialización del símbolo. [5]

Pascal, Ada y Haskell

El lenguaje Pascal (1970) popularizó el concepto de tipos enumerados definidos por el programador , anteriormente disponibles con diferente nomenclatura en COBOL , FACT y JOVIAL . BooleanLuego se proporcionó un tipo de datos integrado como un tipo enumerado predefinido con valores FALSEy TRUE. Por definición, todas las comparaciones, operaciones lógicas y declaraciones condicionales se aplicaron y/o produjeron Booleanvalores. Por lo demás, el Booleantipo tenía todas las facilidades disponibles para los tipos enumerados en general, como ordenar y utilizar como índices. Por el contrario, la conversión entre Booleans y enteros (o cualquier otro tipo) todavía requería pruebas explícitas o llamadas a funciones, como en ALGOL 60. Este enfoque ( booleano es un tipo enumerado ) fue adoptado por la mayoría de los lenguajes posteriores que tenían tipos enumerados, como Modula , Ada y Haskell .

C, C++, D, Objetivo-C, AWK

Las implementaciones iniciales del lenguaje C (1972) no proporcionaron ningún tipo booleano y, hasta el día de hoy, los valores booleanos se representan comúnmente mediante números enteros ( ints) en los programas C. Los operadores de comparación ( >, ==, etc.) están definidos para devolver un resultado entero con signo ( int), ya sea 0 (para falso) o 1 (para verdadero). Los operadores lógicos ( &&, ||, !, etc.) y las declaraciones de prueba de condiciones ( if, while) suponen que cero es falso y todos los demás valores son verdaderos.

enumDespués de que se agregaron los tipos enumerados a la versión de C del American National Standards Institute , ANSI C (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 números enteros según los estándares del lenguaje; por lo que la identidad efectiva entre booleanos y enteros sigue siendo válida para programas en C.

El estándar C (desde C99 ) proporciona un tipo booleano, llamado _Bool. Al incluir el encabezado stdbool.h, se puede usar el nombre más intuitivo booly las constantes truey false. El lenguaje garantiza que dos valores verdaderos cualesquiera se compararán iguales (lo que era imposible de lograr antes de la introducción del tipo). Los valores booleanos todavía se comportan como números enteros, se pueden almacenar en variables enteras y usarse 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 solo números enteros ) se ha mantenido en todas las versiones posteriores de C. Tenga en cuenta que esto no significa que se pueda almacenar cualquier valor entero 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 los de C. Este enfoque también fue adoptado por muchos lenguajes posteriores, especialmente por algunos lenguajes de scripting como AWK .

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

Objective-C también tiene un tipo de datos booleano separado BOOL, cuyos valores posibles son YESo NOequivalentes a verdadero y falso respectivamente. [6] Además, en los compiladores de Objective-C que admiten C99, _Boolse puede utilizar el tipo de C, ya que Objective-C es un superconjunto de C.

Java

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

Perl y Lua

Perl no tiene ningún tipo de datos booleano. En cambio, cualquier valor puede comportarse como booleano en un contexto booleano (condición de ifo whiledeclaración, argumento de &&o ||, etc.). El número 0, las cadenas "0" y "", la lista vacía ()y el valor especial undefse 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 sin valor nilse 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 muy a menudo se consideran falseen otros idiomas.

PL/I

PL/I no tiene ningún tipo de datos booleanos. En cambio, 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-elemento de una IFdeclaración es verdadera si algún bit es 1.

Rexx

Rexx no tiene ningún tipo de datos booleanos. 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.

tcl

Tcl no tiene un tipo booleano separado. 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:

 establezca  v 1 si { $v } { pone "V es 1 o verdadero" }         

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

 establezca  v "" si { $v } ....      

Lo anterior generará un error, ya que la variable v no se puede evaluar como 0 o 1.

Python, Ruby y JavaScript

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 fraccionario), el valor nulo ( None), la cadena vacía y los contenedores vacíos (listas, conjuntos , etc.) se consideran booleanos falsos; todos los demás valores se consideran booleanos verdaderos 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 contenedores, __len__se utiliza (el método especial para determinar la longitud de los contenedores) si no está definido el método de conversión booleano explícito.

En Ruby , por el contrario, sólo nil(el valor nulo de Ruby) y un falseobjeto especial son falsos ; todo lo demás (incluido el número entero 0 y las matrices vacías) es verdadero .

En JavaScript , las cadenas vacías ( ""), null, undefined, NaN, +0, −0 y false[12] a veces se denominan falsas (cuya complemento es veraz ) para distinguir entre booleanos estrictamente verificados y coaccionados . [13] A diferencia de Python, los contenedores vacíos (matrices, mapas, conjuntos) se consideran veraces. Lenguajes como PHP también utilizan este enfoque.

SQL

Los 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 operadores de comparación, operador IN , IS (NOT) NULL , etc. Sin embargo, aparte de TRUE y FALSE , estos operadores También puede producir un tercer estado, llamado DESCONOCIDO , cuando se realiza la comparación .NULL

El estándar SQL92 introdujo los operadores ES (NO) VERDADERO, ES (NO) FALSO y ES (NO) DESCONOCIDO que evalúan un predicado, que son anteriores a la introducción del tipo booleano en SQL:1999 .

El estándar SQL:1999 introdujo un tipo de datos BOOLEAN como característica opcional (T031). Cuando está restringido por una restricción NOT NULL , un SQL BOOLEAN se comporta como booleanos en otros lenguajes, que solo pueden almacenar valores VERDADEROS y FALDOS . Sin embargo, si admite valores NULL, que es el valor predeterminado como todos los demás tipos de datos SQL, también puede tener el valor NULL especial. Aunque el estándar SQL define tres literales para el tipo BOOLEAN ( VERDADERO, FALSO y DESCONOCIDO ), también dice que NULL BOOLEAN y UNKNOWN "pueden usarse indistintamente para significar exactamente lo mismo". [14] [15] Esto ha causado cierta controversia porque la identificación sujeta a UNKNOWN a las reglas de comparación de igualdad para NULL. Más precisamente no es VERDADERO sino DESCONOCIDO/NULL . [16] A partir de 2012, pocos sistemas SQL importantes implementan la función T031. [17] Firebird y PostgreSQL son excepciones notables, aunque PostgreSQL no implementa ningún literal DESCONOCIDO ; se puede utilizar en su lugar. [18]UNKNOWN = UNKNOWNNULL

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 tipo de datos independiente ni representable como un número 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 declaració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 es necesario utilizar soluciones alternativas, como convertir entre el número entero y la expresión booleana.SELECT a FROM t WHERE aSELECT column IS NOT NULL FROM tUPDATE t SET flag = IIF(col IS NOT NULL, 1, 0) WHERE flag = 0

Microsoft Access , que utiliza Access Database Engine (ACE/JET), [19] tampoco tiene un tipo de datos booleano. Similar a MS SQL Server, utiliza un tipo de datos BIT . [20] En Access se le conoce como tipo de datos Sí/No [21] el cual 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. [22] Esto difiere de MS SQL Server en dos formas, aunque ambos son productos de Microsoft:

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

PostgreSQL tiene un tipo BOOLEAN distinto como en el estándar, [23] 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 ; [24] VERDADERO es lo mismo que el entero 1 y FALSO es lo mismo que el entero 0. [25] Cualquier entero distinto de cero es verdadero en las condiciones.TINYINT(1)

Cuadro

Tableau Software tiene un tipo de datos BOOLEANO. [26] El literal de un valor booleano es Trueo False. [27]

La INT()función de Tableau convierte un valor booleano en un número y devuelve 1 para Verdadero y 0 para Falso. [28]

Adelante

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. [29]

Ver también

Referencias

  1. ^ Kernighan, Brian W ; Ritchie, Dennis M. (1978). El lenguaje de programación C (1ª ed.). Englewood Cliffs, Nueva Jersey : Prentice Hall . pag. 41.ISBN _ 0-13-110163-3.
  2. ^ Plauger, PJ ; Brodie, Jim (1992) [1989]. Referencia del programador ANSI e ISO Standard C. Prensa de Microsoft . págs. 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) desde el original el 6 de abril de 2008 . Consultado el 30 de abril de 2007 .
  4. ^ Digital Equipment Corporation, Manual de referencia de programadores de DECSystem10 FORTRAN IV . Reimpreso en Manual de lenguajes matemáticos . Versión online Archivado el 14 de agosto de 2011 en Wayback Machine , consultado el 16 de noviembre de 2011.
  5. ^ "CLHS: Escriba BOOLEANO".
  6. ^ "Guías y código de muestra". desarrollador.apple.com . Archivado desde el original el 7 de septiembre de 2011 . Consultado el 1 de mayo de 2018 .
  7. ^ "Booleanos de Java". Tutoriales web en línea de W3Schools . Consultado el 17 de febrero de 2021 .
  8. ^ "perlsyn - Sintaxis de Perl / Verdad y falsedad". Archivado desde el original el 26 de agosto de 2013 . Consultado el 10 de septiembre de 2013 .
  9. ^ "PEP 285: agregar un tipo bool". 4 de mayo de 2011. Archivado desde el original el 28 de marzo de 2018 . Consultado el 28 de marzo de 2018 .
  10. ^ van Rossum, Guido (3 de abril de 2002). "PEP 285: agregar un tipo bool". Archivado desde el original el 1 de mayo de 2013 . Consultado el 15 de mayo de 2013 .
  11. ^ "Expresiones". Documentación de Python v3.3.2 . Archivado desde el original el 22 de mayo de 2013 . Consultado el 15 de mayo de 2013 .
  12. ^ "Especificación del lenguaje ECMAScript" (PDF) . pag. 43. Archivado desde el original (PDF) el 12 de abril de 2015 . Consultado el 12 de marzo de 2011 .
  13. ^ "Los elementos del estilo JavaScript". Douglas Crockford. Archivado desde el original el 17 de marzo de 2011 . Consultado el 5 de marzo de 2011 .
  14. ^ C. Fecha (2011). SQL y teoría relacional: cómo escribir código SQL preciso. O'Reilly Media, Inc. pág. 83.ISBN _ 978-1-4493-1640-2.
  15. ^ ISO/IEC 9075-2:2011 §4.5
  16. ^ Martyn Prigmore (2007). Introducción a las Bases de Datos con Aplicaciones Web. Pearson Educación Canadá. pag. 197.ISBN _ 978-0-321-26359-9.
  17. ^ Troels Arvin, Encuesta sobre la implementación del tipo de datos BOOLEAN Archivado el 9 de marzo de 2005 en Wayback Machine.
  18. ^ "PostgreSQL: Documentación: 10: 8.6. Tipo booleano". www.postgresql.org . Archivado desde el original el 9 de marzo de 2018 . Consultado el 1 de mayo de 2018 .
  19. ^ "Migrar una base de datos de Access a SQL Server". soporte.microsoft.com . Consultado el 19 de octubre de 2020 .
  20. ^ 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}}: Mantenimiento CS1: nombres numéricos: lista de autores ( enlace )
  21. ^ "Introducción a los tipos de datos y propiedades de campo". soporte.microsoft.com . Consultado el 19 de octubre de 2020 .
  22. ^ "Datos booleanos: tutorial de MS-Access". fuentedaddy.com . Consultado el 19 de octubre de 2020 .
  23. ^ "Tipo booleano". 27 de octubre de 2016.
  24. ^ "MySQL :: Manual de referencia de MySQL 8.0 :: 12.1.1 Descripción general del tipo numérico". dev.mysql.com . Archivado desde el original el 22 de septiembre de 2016.
  25. ^ "MySQL :: Manual de referencia de MySQL 8.0 :: 9.1.6 Literales booleanos". dev.mysql.com .
  26. ^ "Tipos de datos". ayuda.tableau.com . Consultado el 19 de octubre de 2020 .
  27. ^ "Formato de cálculos en Tableau". ayuda.tableau.com . Consultado el 19 de octubre de 2020 .
  28. ^ "El valor booleano hace que Tableau sea más rápido: ¿verdadero o falso?". Soluciones TAR . 2020-09-11 . Consultado el 19 de octubre de 2020 .
  29. ^ "4. Decisiones, Decisiones..." Forth Inc. 2022-02-11 . Consultado el 11 de febrero de 2022 .