Close

Operátory v C/C++ – 2. díl

Operátory v C/C++ - 2. díl

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ů &&.

aba && b
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

Logické OR

Výsledkem operátoru OR (česky NEBO) je true, pokud je alespoň jeden z operandů true. OR zapisujeme pomocí znaků ||.

aba || b
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

Logická negace

Logická negace (anglicky NOT) je unární operátor, který obrací pravdivostní hodnotu.

a!a
falsetrue
truefalse

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).

aba & ba | ba ^ b
00000
01011
10011
11110
c cpp butove binarni operatory
Binární bitové operátory

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).

c cpp bitove posuvy
Bitové posuvy

Na zbylé operátory se podíváme zase příště.

Zbyšek Voda

Napsat komentář