Z samego początku w języku C zezwolono na pomijanie nawiasów klamrowych dla pojedynczego operatora wewnątrz konstrukcji if. Uczyniło to kod bardziej zwarty, ale spowodowało wiele nieoczywistych błędów, szczególnie przy rozszerzaniu i modyfikacji. Historyczny powód to oszczędność miejsca i prostota składni dla minimalistycznych przypadków.
Problem pojawia się, gdy programista zapomina, że bez nawiasów if zarządza tylko pierwszym wyrażeniem po nim: wszystkie następne są wykonywane bezwarunkowo, nawet jeśli wizualnie wydaje się to nieoczywiste. Taki styl prowadzi do ukrytych błędów, które trudno wykryć podczas przeglądania kodu oraz do błędów z powodu zapomnianych wcięć lub dodania nowych linii.
Rozwiązanie — zawsze używać nawiasów klamrowych, nawet jeśli operator jest tylko jeden. To zwiększa czytelność i bezpieczeństwo kodu.
Przykład kodu:
// Źle: if (x > 0) do_something(); do_other(); // Wykonywane zawsze // Lepiej: if (x > 0) { do_something(); do_other(); }
Kluczowe cechy:
Czy wcięcie (tab/space) wpływa na zakres działania if?
Nie, w języku C zakres działania definiuje się tylko nawiasami, a nie wcięciami.
Jakie będzie zachowanie takiego kodu?
if (a > 0) fun1(); fun2();
fun1() zostanie wywołane tylko, jeśli a > 0. fun2() zawsze zostanie wywołana niezależnie od warunku.
Jakie są konsekwencje, jeśli zapomnimy dodać nawiasów przy dodawaniu nowej linii?
Ten kod może zmienić zachowanie i prowadzić do błędów, które wizualnie trudno wykryć, ponieważ wcięcia w żaden sposób nie chronią przed błędami kompilacji.
Programista dodał drugi operator do jednoliniowego if, zapominając dodać nawiasy.
if (user) initialize(); log_access();
Zalety:
Wady:
Programista zawsze używa nawiasów klamrowych nawet dla jednego operatora:
if (user) { initialize(); log_access(); }
Zalety:
Wady: