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.