W prawdziwym życiu często zadaje się pytania lub ktoś im zadaje pytania, na które można odpowiedzieć „tak” lub „nie”. „Czy jabłko jest owocem?” Tak. „Czy lubisz szparagi?” Nie.
Rozważmy teraz podobne stwierdzenie, na które można odpowiedzieć „prawda” lub „fałsz”: „Jabłka są owocem”. To oczywiście prawda. A może „Lubię szparagi”. Całkowicie fałszywe (fuj!).
Tego rodzaju zdania, które mają tylko dwa możliwe wyniki: tak/prawda lub nie/fałsz, są tak powszechne, że wiele języków programowania zawiera specjalny typ do radzenia sobie z nimi. Typ ten nazywany jest typem Boolean (uwaga: w języku angielskim wartość Boolean jest poprawnie pisana wielką literą, ponieważ nazwa pochodzi od jej wynalazcy, George'a Boole'a).
Zmienne logiczne
Zmienne logiczne to zmienne, które mogą mieć tylko dwie możliwe wartości: true, i false.
Aby zadeklarować zmienną boolowską, używamy słowa kluczowego bool.
bool b;Aby zainicjować lub przypisać true lub false wartość do zmiennej logicznej, używamy słów kluczowych true i false.
bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // domyślna inicjalizacja na falseTak jak jednoargumentowy operator minus (-) może zostać użyty do utworzenia liczby całkowitej ujemnej, operator logiczny NOT (!) może zostać użyty do odwrócenia wartości logicznej od true Do false lub false Do true:
bool b1 { !true }; // b1 zostanie zainicjowane wartością false
bool b2 { !false }; // b2 będzie zainicjowane wartością trueWartości logiczne nie są w rzeczywistości przechowywane w zmiennych boolowskich, ponieważ słowa „true” lub „fałszywe”. Zamiast tego są one zapisywane jako wartości całkowite: true jest zapisywane jako liczba całkowita 1, i false jest zapisywane jako liczba całkowita 0. Podobnie, gdy oceniane są wartości logiczne, w rzeczywistości nie są one oceniane jako „prawda” lub „fałsz”. Oceniają liczby całkowite 0 (fałsz) lub 1 (prawda). Ponieważ wartości logiczne przechowują wartości całkowite, są one uważane za typ całkowity.
Drukowanie wartości logicznych
Kiedy drukujemy wartości logiczne, std::cout wypisuje 0 for false, i 1 for true:
#include <iostream>
int main()
{
std::cout << true << '\n'; // prawdziwe zwracanie 1
std::cout << !true << '\n'; // !true daje wartość 0
bool b {false};
std::cout << b << '\n'; // b ma wartość false, co daje wartość 0
std::cout << !b << '\n'; // !b ma wartość true, co daje wartość 1
return 0;
}Wyjścia:
1 0 0 1
Użyj std::boolalpha print true lub false
Jeśli chcesz std::cout print true lub false zamiast 0 lub 1, możesz wydrukować std::boolalpha. Nie generuje to niczego, ale manipuluje sposobem std::cout wyprowadzaniem bool wartości.
Oto przykład:
#include <iostream>
int main()
{
std::cout << true << '\n';
std::cout << false << '\n';
std::cout << std::boolalpha; // wydrukuj bool jako prawdę lub fałsz
std::cout << true << '\n';
std::cout << false << '\n';
return 0;
}Wypisuje:
1 0 true false
Możesz użyć std::noboolalpha aby to ponownie wyłączyć.
Konwersja liczby całkowitej na wartość logiczną
W przypadku korzystania z inicjalizacji jednolitej możesz zainicjować zmienną za pomocą liczby całkowitej literały 0 (dla false) i 1 (dla true) (ale naprawdę powinieneś używać zamiast tego false i true ). Inne literały całkowite powodują błędy kompilacji:
#include <iostream>
int main()
{
bool bFalse { 0 }; // OK: inicjalizacja na false
bool bTrue { 1 }; // OK: inicjalizacja na prawdę
bool bNo { 2 }; // błąd: niedozwolone zawężanie konwersji
std::cout << bFalse << bTrue << bNo << '\n';
return 0;
}Jednak w każdym kontekście, w którym liczba całkowita może zostać przekonwertowana na wartość logiczną, liczba całkowita 0 jest konwertowana na false, a każda inna liczba całkowita jest konwertowana na true.
#include <iostream>
int main()
{
std::cout << std::boolalpha; // wydrukuj bool jako prawdę lub fałsz
bool b1 = 4 ; // inicjalizacja kopiowania umożliwia niejawną konwersję z int na bool
std::cout << b1 << '\n';
bool b2 = 0 ; // inicjalizacja kopiowania umożliwia niejawną konwersję z int na bool
std::cout << b2 << '\n';
return 0;
}Wypisuje:
true false
Uwaga: bool b1 = 4; może wygenerować ostrzeżenie. Jeśli tak, będziesz musiał wyłączyć traktowanie ostrzeżeń jako błędów, aby skompilować przykład.
Wprowadzanie wartości logicznych
Wprowadzanie wartości logicznych za pomocą std::cin czasami powoduje problemy dla nowych programistów.
Rozważ następujący program:
#include <iostream>
int main()
{
bool b{}; // domyślna inicjalizacja na false
std::cout << "Enter a boolean value: ";
std::cin >> b;
std::cout << "You entered: " << b << '\n';
return 0;
}Enter a Boolean value: true You entered: 0
Czekaj, co?
Domyślnie std::cin akceptuje tylko wprowadzanie numeryczne dla wartości logicznych zmienne: 0 Jest false, i 1 Jest true. Każda inna wartość liczbowa zostanie zinterpretowana jako true i spowoduje std::cin przejście w tryb awaryjny. Każda wartość nieliczbowa zostanie zinterpretowana jako false i spowoduje std::cin wejście w tryb awaryjny.
Powiązana treść
Tryb awaryjny (i sposób wyjścia z niego) omawiamy na lekcji 9.5 — std::cin i obsługa nieprawidłowych danych wejściowych.
W tym przypadku, ponieważ wprowadziliśmy true, std::cin cichą awarię i ustawiliśmy b Do false. W związku z tym, gdy std::cout drukuje wartość dla b, drukuje 0.
Aby umożliwić std::cin akceptację słów false i true jako danych wejściowych, należy najpierw wprowadzić dane do std::boolalpha:
#include <iostream>
int main()
{
bool b{};
std::cout << "Enter a boolean value: ";
// Pozwól użytkownikowi na wprowadzenie „prawdy” lub „fałszu” dla wartości logicznych
// Ważna jest wielkość liter, więc True lub TRUE nie będzie działać
std::cin >> std::boolalpha;
std::cin >> b;
// Wypiszmy także wartości bool jako `true` lub `false`
std::cout << std::boolalpha;
std::cout << "You entered: " << b << '\n';
return 0;
}Jednakże, gdy std::boolalpha jest włączone do wprowadzania danych, wartości liczbowe nie będą już akceptowane (oceniają do false i powodują przejście std::cin w tryb awarii).
Ostrzeżenie
Włączenie std::boolalpha dla wprowadzania danych pozwoli tylko na pisanie małymi literami false lub true do zaakceptowania. Odmiany pisane wielkimi literami nie będą akceptowane. 0 i 1 również nie będą już akceptowane.
Zauważ, że std::cin >> std::boolalpha; do wprowadzania wartości bool używamy jako true lub false, i std::cout << std::boolalpha; a do wyprowadzania wartości bool jako true lub false. Są to niezależne elementy sterujące, które można oddzielnie włączyć (za pomocą std::boolalpha) lub wyłączyć (za pomocą std::noboolalpha).
Zwracane wartości logiczne
Wartości logiczne są często używane jako wartości zwracane przez funkcje sprawdzające, czy coś jest prawdą, czy nie. Nazwy takich funkcji zazwyczaj rozpoczynają się od słowa Jest (np. isEqual) lub has (np. hasCommonDivisor).
Rozważ następujący przykład, który jest dość podobny do powyższego:
#include <iostream>
// zwraca wartość true, jeśli x i y są równe, false w przeciwnym razie
bool isEqual(int x, int y)
{
return x == y; // operator== zwraca wartość true, jeśli x jest równe y, i fałsz w przeciwnym razie
}
int main()
{
std::cout << "Enter an integer: ";
int x{};
std::cin >> x;
std::cout << "Enter another integer: ";
int y{};
std::cin >> y;
std::cout << std::boolalpha; // wydrukuj bool jako prawdę lub fałsz
std::cout << x << " and " << y << " are equal? ";
std::cout << isEqual(x, y) << '\n'; // zwróci wartość true lub false
return 0;
}Oto wynik dwóch uruchomień tego programu:
Enter an integer: 5 Enter another integer: 5 5 and 5 are equal? true
Enter an integer: 6 Enter another integer: 4 6 and 4 are equal? false
Jak to działa pracować? Najpierw wczytujemy wartości całkowite dla x i y. Następnie oceniane jest wyrażenie isEqual(x, y) . W pierwszym uruchomieniu skutkuje to wywołaniem funkcji isEqual(5, 5). Wewnątrz tej funkcji dokonywana jest ocena 5 == 5 , w wyniku której powstaje wartość true. Wartość true jest zwracana do wywołującego w celu wydrukowania przez std::cout. W drugim uruchomieniu wywołanie isEqual(6, 4) zwraca wartość false.
Wartości logiczne wymagają trochę przyzwyczajenia, ale gdy już się nimi zajmiesz, są całkiem odświeżające w swojej prostocie! Wartości logiczne również stanowią ogromną część języka — będziesz ich używać częściej niż wszystkich innych podstawowych typów razem wziętych!
Będziemy kontynuować naszą eksplorację wartości logicznych w następnej lekcji.

