С самого начала в языке C было разрешено опускать фигурные скобки для одиночного оператора внутри конструкции if. Это сделало код компактнее, но спровоцировало множество неочевидных ошибок, особенно при расширении и модификации. Историческая причина — экономия места и простота синтаксиса для минималистичных случаев.
Проблема возникает, когда разработчик забывает, что без скобок if управляет только первым выражением после него: все следующие исполнены безусловно, даже если визуально это кажется неочевидным. Такой стиль ведёт к скрытым багам, которые сложно выявлять при чтении кода и возникновению ошибок из-за забытой табуляции или добавления новых строк.
Решение — всегда использовать фигурные скобки, даже если оператор всего один. Это повышает читаемость и безопасность кода.
Пример кода:
// Плохо: if (x > 0) do_something(); do_other(); // Выполняется всегда // Лучше: if (x > 0) { do_something(); do_other(); }
Ключевые особенности:
Влияет ли отступ (tab/space) на область действия if?
Нет, в языке C область действия определяется только скобками, а не отступами.
Какое поведение будет у такого кода?
if (a > 0) fun1(); fun2();
fun1() вызовется только если a > 0. fun2() всегда будет вызвана независимо от условия.
Каковы последствия, если при добавлении новой строки забыть добавить скобки?
Этот код может изменить поведение и привести к ошибкам, которые визуально сложно обнаружить, так как отступы никак не защищают от компиляционных ошибок.
Разработчик добавил второй оператор в однострочный if, забыв добавить скобки.
if (user) initialize(); log_access();
Плюсы:
Минусы:
Разработчик всегда использует фигурные скобки даже для одного оператора:
if (user) { initialize(); log_access(); }
Плюсы:
Минусы: