Обычно каждая команда в любом языке программирования делает что-то полезное: создаёт переменные, присваивает значения, организует циклы и так далее. Но есть ещё пустые операторы — они ничего не делают, но ими часто пользуются. Рассказываем, как это работает и зачем применяется.
Что такое пустой оператор
Пустой оператор — это оператор, который не выполняет никакого действия. Когда компьютер встречает такое, он пропускает его и выполняет команды дальше.
Иногда бывает так, что программисту нужно сделать цикл или функцию, в которых пока ничего нет — например, чтобы быстро написать базовую логику, а потом заняться деталями. Если в Python мы попробуем создать пустую функцию и дальше продолжить писать основной код, то получим ошибку:
Python выдал ошибку IndentationError — он увидел, что мы объявили функцию, и ждал её содержимое на новой строке после отступа. С точки зрения компьютера, мы поступили неправильно: команда, которая относится к функции, записана неверно.
Чтобы выйти из такой ситуации, используют пустой оператор — в Python это команда pass. Её можно вставлять в коде в любое место, где требуется какое-то действие. Добавим эту команду в функцию и посмотрим на результат:
То же самое происходит и в циклах: если нам нужен цикл, который пока ничего не делает, достаточно добавить в него pass вместо настоящих команд:
for i in range(10): pass
Где ещё применяется пустой оператор
В новых обработчиках событий. В наших проектах мы часто создаём обработчики событий — функции, которые реагируют на происходящее: нажатие клавиш, нажатие кнопок на экране, движения мыши или загрузку элементов. При создании таких обработчиков часто используют заглушки — пустые обработчики, внутри которых ничего не происходит. Так делают, чтобы написать общую структуру программы, а потом наполнить её жизнью:
function onClickFunction () {
// здесь потом появится код
}
Для синхронизации потоков и разрешения блокировок. В Java есть метод wait() — он используется для приостановки потока до тех пор, пока не будет получен сигнал о его возобновлении. В этом случае пустой оператор можно использовать как условие ожидания такого сигнала:
synchronized (lock) {
while (!condition) {
try {
// ожидание сигнала
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// пустой оператор
}
В каких языках он есть
Пустой оператор есть почти во всех языках программирования, но выглядит он по-разному в зависимости от синтаксиса. Например, в C, C++ и JavaScript это точка с запятой, в Java этим могут быть фигурные скобки, а в Ассемблере это NOP.
Что плохого в пустом операторе
Пустой оператор — временное решение, поэтому как только его можно заменить на настоящие команды, это сразу нужно сделать. Дело в том, что иногда такой оператор может привести к таким ситуациям:
- У переменной могут появиться неопределённые значения. Если пустой оператор используется в цикле, то он никак не повлияет на переменную цикла или переменную в условии цикла. Это может привести к непредсказуемым последствиям.
- Сложность отладки — с пустым оператором не всегда понятно, где именно возникает ошибка.
- Нечитаемый код — если в программе много пустых операторов, то сложно понять, что именно делает код и как устроена внутренняя логика работы.
Что будет, если написать программу только из одних пустых операторов?
Так сделать, конечно, можно, но зачем?
При переводе в машинный код компьютер убирает из текста программы все пустые операторы, чтобы они не занимали место в памяти. В итоге программа из одних пустых операторов превратится в очень маленький код, который завершает работу сразу после запуска.