Język C i nawiasy klamrowe

Na ostatnim kolokwium pojawiły się informacje, że kod jest niepoprawny, gdyż „brakuje nawiasów klamrowych” (zwłaszcza w przypadku instrukcji if).
Jest to odważne stwierdzenie (pomijając już fakt, że znakomita większość przykładów kompiluje się i nie zawiera błędów formalnych/skłądniowych).
Jak to jest z nawiasami?
W przypadku poleceń if, for, while nawias jest niezbędny gdy obejmuje więcej niż jedno polecenie wykonywalne. Zatem zamiast pisać:
if (a == 1)
{
printf("a równe 1\n");
}
spokojnie można napisać
if (a == 1)
printf("a równe 1\n");
natomiast już w przypadku
double a = 1.;
while (a > 0)
{
printf("a = %f\n", a);
a = a / 2.;
}
nawiasu klamrowego pominąć nie można.
Problem pojawia się gdy mamy stwierdzić „ile instrukcji jest w poniższym kodzie?”
if (a == 1)
printf("prawda\n");
else
printf("fałsz\n");
Jest to jedna instrukcja złożona.
To:
{
int i = 3;
printf("%d\n", i / 5);
}
jest również jedna instrukcja złożona.
W przypadku jednak instrukcji if zagnieżdżonej w innej instrukcji if pojawia się problem:
if (b == 1)
if (a == 1)
printf("prawda\n");
else
printf('fałsz\n');
powstaje pytanie do której z instrukcji if odnosi się polecenie else, to znaczy czy kod należy zapisać tak:
if ( b == 1 )
if ( a == 1 )
printf("prawda\n");
else
printf('fałsz\n');
czy może raczej tak:
if ( b == 1 )
if ( a == 1 )
printf("prawda\n");
else
printf('fałsz\n');
I w tym przypadku, ze względu na czytelność kodu dobrze jest dodawać nawiasy klamrowe (choć kompilator nie będzie miał wątpliwości i zinterpretuje to po swojemu). A programista ma wiedzieć!