Méně známé skutečnosti o jazyce C: Dva různé typy for cyklů

Od Petr Zemek, 2010-11-06

Když se zeptáte programátora v jazyce C na for cyklus, tak vám odvětí, že se skládá z hlavičky, která je tvořena třemi výrazy oddělenými středníky, kde do první se dává deklarace proměnných, do druhé podmínka ukončení cyklu, a do poslední akce provedená po každé iteraci. Každá z těchto částí je nepovinná. A pak následuje tělo cyklu. Co je ale zajímavé, tak je to, že to není tak úplně pravda a volitelnost částí záleží na typu for cyklu, který se použije.

Jak to tedy je?

V následujícím textu se odkazuji na sekci 6.8.5 v normě ISO C99. Podle této normy jsou v jazyce C dva různé for cykly:

I. typ: První typ má následující syntaxi: for ( expression-opt ; expression-opt ; expression-opt ) statement

Vidíme, že všechny tři části hlavičky jsou nepovinné, a tak to odpovídá tomu, co by vám odpověděl onen programátor. Tak v čem je tedy háček? V tom, že v C99 lze napsat následující kód, kde v první části je deklarace lokální proměnné cyklu:

for (int i = 0; i < 10; ++i) {
    // ...
}

Znalci už možná pokyvují hlavou: podle C99 není deklarace výrazem (expression) (viz sekce 6.5). Nemůžete napsat něco jako if (int x = 1). Tak jak je tedy možné, že to funguje? Zde právě nastupuje na scénu druhý typ for cyklu.

II. typ: Druhý typ má následující syntaxi: for ( declaration expression-opt ; expression-opt ) statement

Všimněte si, že ten první středník, který byl v prvním typu for cyklu, je nyní součástí deklarace a není to oddělovač :). A jelikož deklarace nemůže být prázdná, tak první část tohoto typu for cyklu není volitelná. Proto volitelnost oněch částí závisí na tom, který z těchto dvou typů for cyklů použijete.

Co C++?

V C++ je situace jednodušší, protože tam je deklarace výrazem, a tudíž je tam pouze jeden for cyklus.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
7 + 11 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.