V této kapitole si představíme koncept, že některé závorky v jazyku C nejsou povinné.

Mějme jednoduchou IF strukturu

if (x > 10) {
    printf("X je vetsi nez 10\n");
}

Pro jazyk C platí, že pokud má IF struktura jenom jeden příkaz, tak můžeme závorky vynechat. Dostáváme tedy

if (x > 10)
    printf("X je vetsi nez 10\n");

Jazyk C je poměrně volný v psaní mezer (viz kapitola Mezery v jazyku C), tak můžeme udělat daný zápis i na jeden řádek

if (x > 10) printf("X je vetsi nez 10\n");

Případně nemusíte udělat ani odsazení příkazu v IF struktuře

if (x > 10)
printf("X je vetsi nez 10\n");

Rád bych připomněl, že i když něco udělat jde, tak to neznamená, že bychom to měli udělat.

Zde je potřeba dát si pozor, že pokud nepoužijete závorky a napíšete více příkazů, tak v IF struktuře bude pouze ten první. Můžeme si to demonstrovat následovně

if (x > 10)
    printf("Uvnitr IF\n");
    printf("Mimo IF\n");

V tomto případě se tisk Mimo IF provede vždy nezávisle na tom, jestli je podmínka pravdivá nebo nepravdivá. Stejně tomu bude v případě

if (x > 10)
    printf("Uvnitr IF\n"); printf("Mimo IF\n");

Nebo

if (x > 10) printf("Uvnitr IF\n"); printf("Mimo IF\n");

Pokud budeme mít následující program

#include <stdio.h>

int main() {
    int x = 5;
    if (x > 10) printf("Uvnitr IF\n"); printf("Mimo IF\n");

    return 0;
}

Tak dostáváme varování

...\main.c|5|warning: this 'if' clause does not guard... [-Wmisleading-indentation]|
...\main.c|5|note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'

Tím se nás kompilátor snaží upozornit, že druhé volání funkce printf se provede vždy.

Obdobné chování platí i cykly. Pokud máme jenom jeden příkaz, tak můžeme složené závorky vynechat

while (x > 10)
    printf("Uvnitr while\n");

Ale opět se nám může stát, že si neuvědomí, že druhý příkaz je mimo cyklus.

Následující program poběží někonečně, protože inkrementace je mimo cyklus.

#include <stdio.h>

int main() {
    int x = 0;
    while (x < 5)
        printf("Uvnitr while\n");
        x = x + 1;

    return 0;
}

Často se stává, že například IF podmínka začne jako jeden příkaz, tak to lidi napíšou bez závorek

if (x > 10)
    printf("Uvnitr IF\n");

Časem je ale potřeba přidat druhý příkaz do IF struktury. V lepší případě tam budou muset závorky stejně dopsat (to je mohli napsat na začátku)-

if (x > 10) {
    printf("Uvnitr IF\n");
    printf("Uvnitr IF\n");
}

V horším případě zapomenout závorky přídat a dostávájí špatné chování

if (x > 10)
    printf("Uvnitr IF\n");
    printf("Uvnitr IF\n");

Moje osobní doporučení je používat závorky vždy, ale každý to může vnímat jinak a je to čistě subjektivní záležitost.

Odkazy

Následující kapitola: Středník

GitHub diskuze k této kapitole

Zpátky na přehled

Předchozí kapitola: Bitové operace