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ć!

Wojciech Myszka
Wojciech Myszka
dr inż. adiunkt

Tak się tylko rozglądam…