Разбор первой программы на языке C

Разбор первой программы на языке C

На прошлом занятии мы установили компилятор GCC и создали простейший пример hello world. На этом уроке разберем этот пример по строкам. Сначала посмотрите код:

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}
Code language: Arduino (arduino)

Код очень простой: он выводит одну строку текста в консоль.

Далее разберем каждую строку кода сверху вниз.

1. #include <stdio.h>

На первом уроке мы кратко упомянули предварительную обработку, эта первая строка — директива предварительной обработки. Как это определить? По символу #.

#: Маркер директивы препроцессора, передается препроцессору и выполняется на первом шаге компиляции.

include: Ключевое слово для подключения заголовочных файлов, его задача — скопировать весь код указанного файла в текущую программу.

<stdio.h>: Стандартный заголовочный файл ввода-вывода (standard input output). В нем собраны функции для вывода текста на экран и чтения данных с клавиатуры, функция printf, которую мы используем ниже, определена именно здесь.

Строго говоря, предварительная обработка не является частью синтаксиса языка C. Препроцессинг C не входит в основной синтаксис языка C, это отдельный этап, который компилятор запускает перед основной компиляцией. Он является частью общего процесса сборки, но не относится к собственной синтаксической и семантической системе C.

Проще говоря: отдельная программа-препроцессор выполняет текстовые замены. В случае #include <stdio.h> эта строка заменяется всем содержимым файла stdio.h. Предположим, что в stdio.h написан только текст AAAAAAAAA.

Тогда перед передачей кода компилятору он примет такой вид:

 AAAAAAAAA

int main()
{
    printf("hello, world\n");
    return 0;
}
Code language: Arduino (arduino)

Конечно это лишь условный пример, реальное содержимое заголовочного файла намного сложнее. Любопытные ученики могут открыть файл и посмотреть его содержимое.

Этот заголовочный файл хранится на вашем компьютере, путь зависит от операционной системы:

Системы Linux/Unix: Обычно путь /usr/include/stdio.h

Windows (Visual Studio): Путь VC/include/stdio.h

macOS (Xcode): Путь /Applications/Xcode.app/.../usr/include/stdio.h

Вы можете использовать инструменты поиска, чтобы найти расположение этого файла на своем устройстве.

Теперь у вас есть базовое понимание работы препроцессинга?

Если удалить строку #include <stdio.h>, компилятор не распознает функцию printf и выдаст ошибку. Попробуйте удалить эту строку и скомпилировать через gcc, чтобы увидеть результат.

После удаления подключения заголовочного файла

При повторной компиляции появится сообщение об ошибке

2. int main()

main = Точка входа любой программы на языке C

  1. При запуске любой программы C операционная система автоматически начинает выполнение с функции main. В одной программе может быть только одна функция main.
  2. int: Тип возвращаемого значения функции, сокращение от integer (целое число).
  3. (): Указывает, что это функция; внутри скобок можно указать параметры, пустые скобки означают отсутствие параметров.

Такой синтаксис main унаследовали большинство последующих языков программирования, это единственная точка запуска программы. При двойном клике по exe-файлу или вводе команды в терминал (например hello) операционная система сама вызывает эту функцию main.

int в начале обозначает тип возвращаемого значения функции. Позже, когда мы будем создавать собственные функции, нам придется всегда указывать этот тип — мы разберем это на следующих уроках.

Круглые скобки () нужны для объявления параметров, которые принимает функция; здесь они пустые, значит параметров нет. Существует и вариант с параметрами:

int main(int argc, char *argv[])

Эта запись принимает два параметра: целое число и массив строк, детальный разбор оставим на следующие занятия.

Параметры функции main передаются операционной системой, откуда берутся эти значения?

Вы наверняка использовали консольные утилиты, например команду ping. При вызове ping 12.36.4.xxx для проверки сети ping — это программа ping.exe, а IP-адрес 12.36.4.xxx является параметром, передаваемым в функцию main ping.exe.

Аналогично для нашей программы hello: если в терминале написать hello abc, то abc передастся как параметр. Переменные в скобках main принимают эти значения, введенные пользователем и переданные ОС.

Запомните пока простое правило: main — единственная точка входа программы, только одна на весь код, вызывается операционной системой, аргументы командной строки передаются в main через ОС.

3. { } Фигурные скобки

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

4. printf("hello, world\n");

  • printf: Сокращение от print format, функция форматированного вывода, выводит текст в консоль.
  • Двойные кавычки " ": Оборачивают строковую константу, внутри пишется выводимый текст.
  • \n: Экранированный символ, перевод строки: после вывода текста курсор автоматически переходит на новую строку.
  • ;: Маркер конца оператора в C. Каждая исполняемая строка должна заканчиваться точкой с запятой, при ее отсутствии возникнет ошибка компиляции.

Буква f в названии функции означает format (форматирование), мы подробно разберем это позже. Сейчас достаточно понять, что эта строка выводит в консоль текст hello, world\n, а \n добавляет автоматический перевод строки.

5. return 0;

  • return: Возвращает целое число из функции main и завершает ее выполнение. Зачем нужен return? Потому что мы указали тип возврата int для main, значит внутри функции обязательно нужно вернуть целое число.
  • 0: Общепринятое значение, означающее, что программа завершилась без ошибок, корректно, сообщает операционной системе статус выполнения.
    • Возврат 0 = Программа выполнилась успешно
    • Возврат любого числа, отличного от 0 (например return 1;) = Аварийное завершение программы с ошибкой

Современные стандарты C позволяют опускать строку return 0; в конце main, компилятор добавит ее автоматически. Однако начинающим рекомендуется писать ее явно для соблюдения стандартов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *