V minulém článku jsme si vysvětlili, jak je možné operátory v C/C++ rozdělit a také jsme si ukázali skupinu matematických operátorů. Dnes budeme v zavedeném systému pokračovat.
Relační operátory
Relační operátory slouží k porovnávání dvou hodnot – nejčastěji se jedná o číselné hodnoty. Relace v matematice popisují vztah mezi hodnotami. V C/C++ jsou relační operátory vždy binární. Jejich výsledkem je pravdivostní hodnota, která značí, jestli mezi operandy platí, nebo neplatí zvolená relace. I s těmito operátory jste se už určitě někde setkali.
a == b // a je rovno b a != b // a je různé od b a < b // a je menší než b a > b // a je větší než b a >= b // a je větší nebo rovno b a <= b // a je menší nebo rovno b
Jejich typické použití je v podmínce u příkazu if.
if(a < b) { Serial.println("a je mensi nez b"); }
Poznámka: Pozor na porovnávání řetězců. Překladač sice většinou zápis typu „aaa“ < „aab“ zvládne bez problémů, ale výsledek nebude takový, jaký čekáte. Pokud chcete porovnat dva řetězce, použijte například funkci strcmp. Také pozor na to, že tato funkce nevrací pravdivostní hodnotu, ale -1, 0, nebo 1 podle výsledku porovnání.
Logické operátory
Logické operátory pracují s operandy jako s logickými, tedy pravdivostními hodnotami true (pravda) a false (nepravda).
Malé historické okénko: Jazyk C původně pro pravdivostní hodnoty vlastní datový typ neměl a jako hodnota false byla brána číselná hodnota 0. Číselné hodnoty různé od 0 byly brány jako true (tedy i záporné hodnoty). Časem vznikla jednoduchá knihovna stdbool, která do C přinesla možnost používat typ bool a konstanty true, false. Byly to ale pouze makra. Skutečný datový typ bool přišel až s C++. Proměnné tohoto typu mohou nabývat dvou hodnot – true a false. Přístup k pravdivostním hodnotám, který byl použitý v C, ale zůstal i v C++, takže typ bool ani nemusíme využívat.
V C/C++ nalezneme tři logické operátory – AND, OR a negace.
Logické AND
Logické AND (česky spojka A) je binární operátor, jehož výsledek je true, pokud jsou oba operandy true. Tento operátor v kódu zapisujeme pomocí znaků &&.
a | b | a && b |
false | false | false |
false | true | false |
true | false | false |
true | true | true |
Logické OR
Výsledkem operátoru OR (česky NEBO) je true, pokud je alespoň jeden z operandů true. OR zapisujeme pomocí znaků ||.
a | b | a || b |
false | false | false |
false | true | true |
true | false | true |
true | true | true |
Logická negace
Logická negace (anglicky NOT) je unární operátor, který obrací pravdivostní hodnotu.
a | !a |
false | true |
true | false |
Bitové operátory
Bitové operátory jsou v mnohém podobné těm logickým. Rozdíl je ale v tom, že pracují na úrovni jednotlivých bitů. Kromě bitových AND, OR a negace existuje ještě bitové XOR a poté posuvy doleva a doprava.
Bitové AND, OR a XOR
Jsou operátory AND, OR a XOR zapisované popořadě &, | a ^. Tyto operátory postupují v čísle bit po bitu. Výsledek je popsán v následující tabulce (AND a OR je obdobné, jako u logických operátorů, XOR je 1, pokud právě jeden bit na dané pozici má hodnotu 1).
a | b | a & b | a | b | a ^ b |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
Bitová negace
Bitová negace (zapisovaná ~) jednoduše otočí všechny bity. Tedy:
(11001010)BIN = ~(00110101)BIN
Bitové posuvy
Velice zajímavými operátory jsou dva binární operátory << a >>, tedy bitové posuvy doleva a doprava. Oba se na číslo podívají jako na posloupnost nul a jedniček, kterou posunou o jeden bit doprava/doleva. Z jedné strany nula či jednička „vypadne“ a na druhou je potřeba ji vhodně doplnit.
Jejich zápis je: hodnota >> posuv, kde posuv značí, o kolik bitů se má hodnota posunout (v tomto případě doprava). Bitový posuv doleva (<<) je jednodušší. Vlevo jeden bit ubereme a vpravo přidáme bit s hodnotou 0.
U posuvu doprava (>>) je situace trochu komplikovanější, protože doplňujeme bit, který má stejnou hodnotu, jako znaménkový. Kdybychom totiž vždy doplnili 0, udělali bychom z bezznaménkového čísla ihned číslo znaménkové (o reprezentaci čísel jsme psali zde, o datových typech tady).
Na zbylé bitové operátory se podíváme zase příště.