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áme

Velké 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 >=.

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 zdarma

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

4/12