Главная chevron_right Структура chevron_right Дополнительный синтаксис chevron_right {} (curly braces)

{} (curly braces)

Фигурные скобки {} обозначают начало и конец блока кода — тела функции, цикла или условия; каждая { должна иметь пару }, иначе компилятор выдаст ошибку.

Полная статья

Описание

Фигурные скобки { и } — фундаментальная часть языка C++, на котором строится программирование для Arduino. Они обозначают начало и конец блока кода: тела функции, цикла, условного оператора или любой другой составной конструкции.

Главное правило: каждая открывающая скобка { обязана иметь пару — закрывающую }. Если скобки не сбалансированы, компилятор выдаст ошибку, причём сообщение об ошибке может указывать совсем не на то место, где скобка пропущена. Это делает несбалансированные скобки одной из самых коварных проблем для начинающих.

Arduino IDE умеет подсвечивать парные скобки: достаточно кликнуть рядом с любой фигурной скобкой — и её «напарник» выделится в редакторе. Пользуйтесь этим, когда ищете ошибку.

Почему скобки сбивают с толку

Если вы раньше работали с языком BASIC, то привыкли к явным ключевым словам: RETURN завершает подпрограмму, ENDIF закрывает условие, NEXT — цикл. В C++ всё это заменяет одна закрывающая фигурная скобка }. Именно поэтому новичкам поначалу сложно понять, какой блок она закрывает — особенно когда конструкции вложены друг в друга.

Перемещение скобки даже на одну строку может кардинально изменить логику программы, не вызвав при этом ошибки компиляции. Код скомпилируется, но будет работать не так, как ожидалось.

Пример кода

Ниже показаны основные ситуации, в которых используются фигурные скобки.

Функции

    void myfunction(datatype argument) {
      // любой оператор(ы)
    }

Циклы

    while (boolean expression) {
      // любой оператор(ы)
    }

    do {
      // любой оператор(ы)
    } while (boolean expression);

    for (initialisation; termination condition; incrementing expr) {
      // любой оператор(ы)
    }

Условные операторы

    if (boolean expression) {
      // любой оператор(ы)
    }

    else if (boolean expression) {
      // любой оператор(ы)
    }
    else {
      // любой оператор(ы)
    }

Практические замечания

  • Следите за балансом сразу. Хорошая привычка — открыв скобку, сразу написать закрывающую, и только потом заполнять тело блока. Это избавляет от большинства ошибок с пропущенными скобками.
  • Отступы помогают читать. Принято делать отступ внутри каждой пары скобок — так визуально видно, какой код к какому блоку относится. Arduino IDE форматирует отступы автоматически через Ctrl+T (или Cmd+T на macOS).
  • Ошибка компилятора может указывать не туда. Если компилятор жалуется на неожиданный токен в конце файла или говорит об «ожидаемом }», ищите пропущенную скобку не в указанной строке, а выше — там, где открытый блок не был закрыт.
  • Вложенность требует аккуратности. Когда циклы и условия вложены друг в друга, количество скобок быстро растёт. Используйте подсветку парных скобок в IDE и не экономьте на отступах.
  • Пустые блоки тоже допустимы. Иногда нужно оставить тело функции или условия пустым — это синтаксически корректно: {}.

Полезные материалы