Продолжаем разбирать неочевидные моменты в программировании. В прошлый раз мы рассказали про разницу между табами и пробелами. Теперь — о точках с запятой: зачем они нужны и когда не нужны.
Зачем нужна точка с запятой
В большинстве языков программирования точка с запятой разделяет команды. Компьютер сам этого сделать не может, ему нужно явно сказать: «Всё, вот это — вся команда, выполняй её в таком виде».
В некоторых языках вместо точки с запятой используют перенос на новую строку; иногда интерпретатор языка умеет угадывать, где вы имели в виду точку с запятой; но в базе точка с запятой — самый популярный разделитель.
На примере: почему важно разделять команды
В большинстве случаев, если не разделить команды, компилятор или интерпретатор просто сообщат об ошибке: мол, ожидали конец команды, а ты нам ерунду какую-то подсунул. Но иногда ошибки не будет, хотя программа будет работать совсем не так, как имел в виду разработчик. Это похоже на расстановку запятых в предложении «Казнить нельзя помиловать». Вот пример.
В C++ есть команда автоинкремента после обращения. Она выглядит как два плюса подряд, и её можно поставить до или после переменной. Место расположения переменной важно: в зависимости от него алгоритм автоинкремента будет работать по-разному.
Вот пример: j = i++
. Предположим, что в переменной i находится число 2. Работать будет так:
- Компьютер берёт значение переменной i и отправляет его в переменную j.
- После присваивания компьютер увеличивает значение переменной i на единицу.
- По итогу в переменной j число 2, в переменной i число 3.
Обратный пример: j = ++i
(то есть переместили автоинкремент до переменной). Теперь он работает так:
- Компьютер сначала увеличивает i на единицу.
- После увеличения он присваивает новое значение в J.
- По итогу в переменных i и j число 3.
Теперь представьте, что у нас вот такой кусок кода:
z = x
++y -= 2
Для компьютера этот кусок выглядит так, потому что в этом языке ему плевать на переносы строк и пробелы:
z=x++y-=2
Из этого кода не очевидно, к какой переменной относится оператор ++. Компьютер либо выполнит какое-то стандартное действие для таких случаев, либо выбросит ошибку.
Чтобы стало очевидно, нужно просто разделить команды точкой с запятой:
z=x++;y-=2
На самом деле, вместо точки с запятой мог бы быть любой другой символ, например знак параграфа — §. Но разработчикам языков программирования было удобнее ставить то, что есть на любой клавиатуре, и то, что несложно набрать одним пальцем.
Точка с запятой в JavaScript
Чаще всего в проектах мы используем JavaScript, в котором точка с запятой тоже разделяет команды:
a = 3;
b = 5;
c = a + b;
console.log(c);
Но если мы возьмём тот же код, уберём оттуда точки с запятой и выполним его в браузере, то ошибки почему-то тоже не будет:
a = 3
b = 5
c = a + b
console.log(c)
Дело в том, что в JavaScript есть встроенный механизм автоматической вставки точек с запятой, который называется ASI. Он распознаёт команды и сам добавляет разделители в нужных местах. Этот механизм справляется с большинством случаев, но иногда он тоже не понимает, где ставить точку с запятой.
Например, с этим алгоритм точно не справится:
a = b + c
(d + e).print()
Дело в том, что это необязательно сложение и вызов какого-то метода второй командой — ещё это может быть вызовом метода print()
функции c с аргументом (d + e)
:
a = b + c(d + e).print()
Компьютер не знает, что именно мы имели в виду, поэтому здесь он остановится и выдаст ошибку.
Механизм ASI не значит, что в JavaScript не нужны точки с запятой. Скорее это значит, что разработчики JavaScript позаботились о вашем комфорте и постарались защитить от некоторых ошибок. Так-то точки с запятой нужны.
В каких ещё языках есть точка с запятой
Точка с запятой есть в большинстве современных языков программирования, на которые повлияли C и C++:
- Java,
- Perl,
- PHP,
- C#,
- Scala,
- Pascal,
- TypeScript.
Также она используется в языке запросов SQL. Иногда её используют для разделения данных внутри CSV-файлов — в них Excel может сохранять свои таблицы с данными (хотя CSV расшифровывается как comma-separated values, то есть «значения, разделённые запятой»).
Когда точка с запятой не нужна
Точка с запятой не нужна в тех языках, в которых явно задаются границы команд — так компьютер сразу определяет начало и конец команды без точки с запятой. Например, в Python для этого используют отступы и переносы строк — с ними интерпретатор понимает, что начинается новая команда и к чему она относится.
Когда Python только появлялся, многие программисты по привычке ставили в нём точку с запятой. Разработчики решили научить язык не воспринимать это как ошибку, а просто игнорировать этот символ. При этом редактор кода подсветит точки с запятой красным, чтобы программист обратил на это внимание и убрал их из кода:
Комментарии
В совсем старых языках программирования, например в ассемблерах и Лиспе, точка с запятой используется для обозначения комментария в коде:
MOV AL, 61h ; Отправляем в AL десятичное число 97 (61 в шестнадцатеричной системе)
В современных языках точку с запятой для комментариев не используют — вместо этого ставят решётку, слеш, звёздочки или угловые скобки.