Logiczny typ danych

Typ logiczny, typ boolowski (ang. boolean) – uporządkowany zbiór wartości logicznych, składający się z dokładnie dwóch elementów: prawda (true, 1, +) i fałsz (false, 0, -), wraz z towarzyszącymi im zdefiniowanymi operatorami standardowymi[1]. Nazwa pochodzi od angielskiego pioniera logiki, matematyka George'a Boole'a[1].

Zastosowanie

Typ logiczny stosuje się jako:

Różnice pomiędzy typem logicznym a typem liczbowym

Ze względu na to, iż każdą funkcję logiczną da się zapisać funkcją dającą jako wynik liczbę naturalną (fałsz - 0, prawda - liczba większa od zera), zaś operatory logiczne da się zapisać za pomocą mnożenia i dodawania, w niektórych językach programowania, np. w C (do C99), typ logiczny nie występował. Są jednak przyczyny, dla których typ logiczny jest stosowany:

  • brak zakresu (nie ma efektu przekroczenia zakresu poprzez sumowanie dwóch warunków prawdziwych),
  • oszczędność pamięci,
  • większa czytelność kodu.

Typy logiczne w językach programowania

Języki programowaniaTyp logiczny
C (od C99), C++, C#, Pythonbool
Pascal, Object Pascal/Delphi, Java, Luaboolean

Przykłady zastosowania

Pascal

{ definicja zmiennej typu logicznego }
var
    zmienna_log : Boolean;

{ deklaracja funkcji zwracającej typ logiczny }
function parzysta(l : Integer) : Boolean;
begin
    parzysta := ((l mod 2) = 0);
end;

{ użycie powyższych w programie }
begin
    zmienna_log := parzysta(4);
end.

C99

#include <stdbool.h>

int main()
{
    bool b = false;
    b = true;
}

C++

Przykłady konwersji między bool a innymi typami:

#include <string>

int main()
{ 
    using std::string; 
    // niejawne konwersje do bool
    bool a = 'a';               // char -> bool  [true]
    bool b = 0.0;               // double -> bool  [false] 
    bool c = -1;                // int -> bool  [true]
    bool d = 0;                 // int -> bool  [false]
    bool e = &a;                // bool * -> bool  [true]
    bool f = &string::clear;    // void (string::*)() -> bool  [true] 
   
    // niejawne konwersje z bool
    int i = false;              // bool -> int  [0]
    double j = true;            // bool -> double  [1.0]
}

C#

using System;

namespace TypLogiczny
{
    public class Parzysta
    {
        //metoda zwracająca typ logiczny:
        // true (prawda), jeśli liczba podana jako argument jest parzysta,
        // false (fałsz) w przeciwnym przypadku.
        static bool CzyParzysta(int i)
        {
            return (i % 2) == 0;
        }

        static void Main()
        {
            for(int i = 0; i <=25; i++)
            {
                if(CzyParzysta(i)) //wartość logiczna jako warunek instrukcji warunkowej if
                {
                    Console.WriteLine("Liczba {0} jest parzysta", i);
                }
                else
                {
                    Console.WriteLine("Liczba {0} jest nieparzysta", i);
                }
            }
        }
    }
}

PHP

function returnbool($arg) { return !!$arg; }

$b = returnbool(1); // zwraca prawdę (true)

// tak; true jest równoznaczne z 1
echo 'Test 1: ', ($b == 1) ? 'tak' : 'nie', '<br />';

// nie; true nie jest identyczne z 1
echo 'Test 2: ', ($b === 1) ? 'tak' : 'nie', '<br />';

Java

class LogicDataType{
  public static void main(String[] args){
    boolean a = true, b = false;
    System.out.println("\"a\" wynosi " + a + ", natomiast \"b\" wynosi " + b + '.');
  }
}

Delphi XE2/Object Pascal

unit LogicDataType;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TLogicDataTypes = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  LogicDataTypesForm: TLogicDataTypes;
  a, b : boolean;

implementation

{$R *.dfm}

procedure LogicDataTypesForm.FormShow(Sender: TObject);
begin
  a := true;
  b := false;
  Application.MessageBox('''a'' wynosi ' + BoolToStr(a) + ', ''b'' wynosi ' + BoolToStr(b) + '.', '''a'' i ''b''!');
end;

end.

Przypisy

  1. a b Niklaus Wirth: Wstęp do programowania systematycznego. Warszawa: Wydawnictwo Naukowo-Techniczne, 1978, s. 37-38.