Porovnávací operátory
Znaky < a >, které jste použili v podmínkách, jsou porovnávací operátory: porovnávají dvě hodnoty a výsledkem je pravda, nebo nepravda. Jazyk C jich má šest:
==rovná se:5 == 5!=nerovná se:5 != 3>větší než:5 > 3<menší než:3 < 5>=větší nebo rovno:5 >= 5<=menší nebo rovno:3 <= 5
Všechny příklady v seznamu jsou pravdivé. U !=, >= a <= je rovnítko vždy druhé a mezi znaky není mezera. Pozor na rozdíl mezi > a >= na hranici: 18 > 18 je nepravda, ale 18 >= 18 je pravda. „Je mu 18 nebo víc“ je proto vek >= 18.
„Rovná se“ se píše dvěma rovnítky, ==, protože jedno rovnítko už svou úlohu má: body = 10 přiřazuje, tedy uloží 10 do proměnné body. body == 10 porovnává: ptá se, jestli je v body 10, a nic nemění.
Napsat v podmínce = místo == je jedna z nejčastějších chyb. Na tomto webu ji překladač odhalí:
#include <stdio.h>
int main(void) {
int body = 7;
if (body = 10) {
printf("Plný počet bodů!\n");
}
printf("Body: %d\n", body);
return 0;
}Překladač ohlásí:
main.c:6:14: error: using the result of an assignment as a condition without parentheses [-Werror,-Wparentheses]
6 | if (body = 10) {
| ~~~~~^~~~
main.c:6:14: note: place parentheses around the assignment to silence this warning
6 | if (body = 10) {
| ^
| ( )
main.c:6:14: note: use '==' to turn this assignment into an equality comparison
6 | if (body = 10) {
| ^
| ==
1 error generated.body = 10 v podmínce nic neporovnává. Tento zápis by do body uložil hodnotu 10 a tu by pak použil jako podmínku. Hodnota 10 se počítá jako pravda, takže blok by se provedl pokaždé, ať bylo v body předtím cokoli. Jinde překladače jazyka C takový program obvykle propustí, nanejvýš s varováním, a program pak potichu dělá něco jiného, než má. Tady je to chyba, takže se o ní dozvíte hned. (Konec prvního řádku v hranatých závorkách jen pojmenovává kontrolu, která problém našla.)
Pod chybou překladač přidá dvě poznámky, řádky s note:, které radí, jak chybu opravit. Tady je správná ta druhá: použijte ==. První, o závorkách, je pro vzácný případ, kdy někdo v podmínce opravdu chce hodnotu uložit, a tou se neřiďte.
Porovnávat můžete i znaky, nejen čísla. Znak se píše do jednoduchých uvozovek:
char velikost = 'M';
if (velikost == 'M') {
printf("Vaši velikost máme\n");
}Tento kód vypíše:
Vaši velikost mámeVelké a malé písmeno jsou různé znaky, takže 'm' == 'M' je nepravda. Celé texty se v C porovnávají jinak; jak, se naučíte v lekci o řetězcích.
Pozor na == u desetinných čísel. Počítač většinu z nich ukládá jen přibližně, a tak je nepravdivé dokonce i 0.1 + 0.2 == 0.3. Proměnné typu double proto raději porovnávejte pomocí <, >, <= nebo >=.
Jak psát:
Pokyny
E-shop dává dárek svému stému zákazníkovi. Spusťte program a přečtěte si první řádek chybové hlášky: řekne vám, kde problém je a jaký. Opravte podmínku tak, aby porovnávala. Program pak vypíše Zákazník číslo 57.
Při objednávce za 1000 Kč a víc e-shop doručuje zdarma. Pod poslední printf vytvořte proměnnou cena_objednavky typu int s hodnotou 1000 a napište příkaz if s větví else: pokud je cena_objednavky aspoň 1000, vypište Doprava zdarma, jinak vypište Doprava stojí 99 Kč. Zdarma se doručuje i objednávka za přesně 1000 Kč, takže operátor vybírejte pečlivě. Program vypíše:
Zákazník číslo 57
Doprava zdarmaZačněte programovat zdarma
4/12