Pochopení toku řízení v C: Logické a podmíněné příkazy

7

C neprovádí kód pouze lineárně. Dělá rozhodnutí. Každé rozhodnutí, které program C učiní, je založeno na booleovském výrazu. Ať už použijete příkaz „if“ nebo smyčku „while“, logika se scvrkne na jednu otázku: je tato podmínka pravdivá nebo nepravdivá?

Podívejme se na základní příklad.

Zde se program ptá na zadání. Toto číslo uloží do proměnné b. Poté zkontroluje stav. Dotyčný logický výraz je (b < 0). C to spočítá. Pokud je výsledek pravdivý, program vypíše "Hodnota je záporná." Pokud je nepravda, program nedělá nic. Ona mlčí.

Pravidlo je jednoduché. If the expression evaluates to True, C executes the single line immediately following the if. Nebo pokud použijete složené závorky {}, provede se celý blok uvnitř. Pokud je výraz False, C tento řádek nebo blok úplně přeskočí.

Ale programy se zřídka zabývají pouze jedním výsledkem. Často potřebujete také zpracovat nula nebo kladná čísla.

Tato struktura používá else if a else k pokrytí zbývajících případů. Dále zkontroluje nulu. Pokud se to nezdaří, předpokládá se, že hodnota je kladná.

Někdy se rozhodování komplikuje. Možná budete muset zkontrolovat více podmínek současně.

Tento výrok se čte jako přirozený jazyk. Pokud se x rovná y A j je větší než k, pak nastavte z na 1. V opačném případě nastavte q na 10. Podobné příkazy budete používat během své kariéry v C. Většina řešení bude jednoduchá. Někdy se mohou zkomplikovat.

Věnujte zvýšenou pozornost syntaxi. Častou chybou začátečníků je záměna zadání a srovnání.

C používá == pro testování rovnosti.
C uses = to assign a value to a variable.

Jejich smíchání vede k chybám, které se těžko hledají. Jeden nastavuje hodnotu. Druhý kontroluje stav. Nejsou zaměnitelné.

C also relies on specific operators for logical operations. The symbol && represents the logical AND operation. Zajišťuje, že obě strany podmínky musí být pravdivé.

Here's a quick reference on all the Boolean operators in C:

  • == : rovnost
  • != : nerovnost
  • * * : méně než
  • *> : více než
  • <= : menší nebo rovno
  • >= : větší nebo rovno

Loop Logic v C: while, do-while a for

Použití smyčky while je jednoduché. It reflects the simplicity of the standard if statement. Zvažte tento kus kódu:

while (a < b) { printf("%d\n", a); a = a + 1; }

Tato struktura opakuje provádění dvou řádků uvnitř složených závorek. Zastaví se pouze tehdy, když a bude větší nebo rovno b. Logika je lineární. Zkontrolujte stav. Proveďte tělo smyčky. Opakovat.

C také nabízí konstrukci do-while. Na rozdíl od standardní smyčky while kontroluje podmínku po prvním spuštění. Tím je zajištěno, že blok kódu bude proveden alespoň jednou.

Poznámka: Výše uvedený příklad používá příkaz if uvnitř funkce. Skutečná smyčka do-while by obalila tělo smyčky a zkontrolovala podmínku na konci.

Smyčka for jako zkratka

Smyčka for je v podstatě zhuštěná verze příkazu while. Kombinuje inicializaci, kontrolu a inkrementaci do jednoho řádku.

Podívejte se na tuto standardní smyčku while:

x = 1;
zatímco (x<10) { bla bla bla x++; // x++ je totožné s x=x+1 }

Můžete to přepsat jako cyklus for:

for(x=1; x<10; x++) { bla bla bla }

Komponenty jsou zřejmé. x=1 provede inicializaci. x<10 provede kontrolu. x++ zvyšuje hodnotu. Smyčka for je jednoduše komprimuje. Nejste omezeni na jednoduché proměnné. Do těchto sekcí můžete vložit složitou logiku.

Zvažte tento příklad:

a=1;
b=6;
zatímco (a < b) { a++; printf("%d\n",a); }

Promění se v:

for (a=1,b=6; a < b; a++,printf("%d\n",a));

Funguje to. Je to také matoucí. Operátor čárka umožňuje použití více operátorů v sekcích inicializace a přírůstku. V sekci recenze to nefunguje. Mnoho vývojářů C tuto kompaktnost miluje. Jiní to považují za nečitelné. Rozdělují kód na části. Oba přístupy jsou platné. Choose based on who will maintain the code in the future.

Nebezpečí použití = místo == v C

Operátor == způsobuje bolesti hlavy. Vývojáři často mylně vkládají jeden = do booleovských výrazů. Kompilátor přijímá obě možnosti. Chování se velmi liší.

V C se booleovské výrazy vyhodnocují jako celá čísla. Zero means False. Jakékoli nenulové celé číslo znamená True. This means that any integer can exist in a Boolean context.

Zvažte tento správný kód C:

if (a) { printf("Nenulové"); }

Pokud je a cokoliv jiného než 0, blok se provede.

Nyní se podívejte na if (a=b). To neporovnává hodnoty. Přiřadí b proměnné a a poté zkontroluje novou hodnotu a. Pokud je b 0, podmínka je nepravdivá. Pokud se b rovná čemukoli jinému, podmínka je pravdivá. Proměnná a je upravena. Je pravděpodobné, že to není to, co jste plánovali. Pravděpodobně jsi myslel == pro srovnání.

Tato funkce není zbytečná. It has valid use cases. But this is a trap. Buďte opatrní při používání = a ==. One character changes the logic from comparison to assignment.