В этом уроке мы начнем язык C с нуля: создадим файл main.c, скомпилируем его через gcc, запустим готовую программу и спокойно разберем, что делают #include, main, printf и return 0. Главное отличие от Python, JavaScript или PHP здесь в том, что C-файл не «запускается» напрямую. Его сначала нужно превратить в исполняемую программу
К концу урока у вас будет не просто строка Hello, World!, а понятная схема: исходный код -> компиляция -> исполняемый файл -> запуск
- Что получится в конце
- Что нужно заранее
- Создаем папку и файл
- Компиляция: почему это не запуск скрипта
- Запуск готовой программы
- Что делает #include <stdio.h>
- Что такое int main(void)
- Фигурные скобки и тело функции
- printf и символ новой строки
- return 0
- Меняем пример под себя
- Мини-карта процесса компиляции
- Частые ошибки и порядок проверки
- Что может быть еще интересно по этой теме
- Что почитать дальше по C
Что получится в конце
Мы напишем файл main.c:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Скомпилируем:
gcc -Wall -Wextra -std=c17 main.c -o hello
Запустим:
./hello
И увидим:
Hello, World!
На Windows имя файла может быть hello.exe, а запуск зависит от терминала. Но идея та же: компилятор сделал отдельную программу, и уже ее мы запускаем
Что нужно заранее
Нужны три вещи: текстовый редактор, терминал и компилятор C. В примерах используется gcc, но для первого урока подойдет и clang
Проверьте GCC:
gcc --version
Или Clang:
clang --version
Если ни одна команда не работает, сначала нужен урок Как установить компилятор C: GCC, Clang и онлайн-запуск. Онлайн-компилятор тоже подойдет для знакомства, но локальный запуск лучше показывает реальную механику: файл, команда компиляции, бинарник, запуск из терминала
Создаем папку и файл
Сделайте отдельную папку:
mkdir c-first
cd c-first
Создайте файл main.c. Расширение .c важно: так редактор, компилятор и человек понимают, что это исходный файл на языке C
Вставьте код:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Сохраните файл. Теперь в папке должен лежать один файл:
main.c
Компиляция: почему это не запуск скрипта
В языках вроде Python часто пишут:
python main.py
И файл выполняется интерпретатором. В C путь другой. Вы сначала просите компилятор собрать программу:
gcc main.c -o hello
main.c — исходный файл. -o hello задает имя готовой программы. Если не указать -o, GCC обычно создаст файл a.out, и новичок потом не понимает, откуда он взялся
Для учебного кода лучше сразу включить предупреждения:
gcc -Wall -Wextra -std=c17 main.c -o hello
-Wall и -Wextra включают много полезных предупреждений. -std=c17 просит компилятор проверять код по стандарту C17. Это не делает вас экспертом по стандартам, но помогает держать пример предсказуемым
Запуск готовой программы
После компиляции появится файл hello. На macOS и Linux запуск выглядит так:
./hello
Почему не просто hello? Текущая папка обычно не входит в список мест, где shell ищет команды. ./hello означает: запусти файл hello из текущей папки
Если после запуска видите:
Hello, World!
первый цикл завершен: написали код, скомпилировали, запустили
Что делает #include <stdio.h>
Строка:
#include <stdio.h>
подключает объявление функций стандартного ввода-вывода. Нам нужна функция printf. Без stdio.h компилятор может не знать, как правильно проверять вызов printf
Символ # означает директиву препроцессора. Препроцессор работает до основной компиляции: подставляет заголовочные файлы, обрабатывает макросы и условные включения. В первом уроке достаточно запомнить: хотите использовать printf — подключите stdio.h
Что такое int main(void)
Функция:
int main(void)
это точка входа программы. Когда операционная система запускает вашу программу, выполнение начинается с main
int перед main означает, что функция возвращает целое число. Это число становится кодом завершения программы
void в скобках означает: функция main не принимает аргументов. Есть и другой вариант с аргументами командной строки, но он появится позже:
int main(int argc, char *argv[])
Для первого файла вариант int main(void) самый спокойный и ясный
Фигурные скобки и тело функции
Тело функции находится между { и }:
{
printf("Hello, World!\n");
return 0;
}
Все, что должно выполниться при запуске программы, находится внутри этих скобок. В C пробелы и переносы обычно нужны для читаемости, а не для смысла. Зато фигурные скобки, кавычки, точки с запятой и круглые скобки имеют жесткое значение
Если забыть ; после printf, компилятор покажет ошибку. C не пытается угадать, где инструкция закончилась
printf и символ новой строки
Строка:
printf("Hello, World!\n");
печатает текст в стандартный вывод, обычно в терминал. \n внутри строки означает перевод строки. Без него следующий вывод или приглашение терминала могут прилипнуть к вашему тексту
Попробуйте временно заменить строку на:
printf("Hello, ");
printf("C!\n");
После компиляции и запуска вы увидите:
Hello, C!
Так становится видно: программа выполняет инструкции сверху вниз
return 0
Строка:
return 0;
завершает main и возвращает операционной системе код 0. В традиции командной строки 0 обычно означает успешное завершение, а ненулевые значения — ошибку или особую ситуацию
В маленьких современных примерах return 0 иногда опускают, потому что для main это допускается. Но новичку лучше писать явно. Так сразу видно: программа не просто «дошла до конца», она завершилась успешно
Меняем пример под себя
Добавим переменную:
#include <stdio.h>
int main(void)
{
char name[] = "Алия";
printf("Hello, %s!\n", name);
printf("This is your first C program.\n");
return 0;
}
Здесь
char name[]— массив символов, то есть строка в стиле C. Подробно строки будут в уроке [Массивы и строки в C: индексы, char[] и нулевой символ](https://aglamov.biz/jazyki-programmirovanija/si/massivy-i-stroki-v-c). Сейчас важно только увидеть:%sвprintfобозначает место, куда будет подставлена строка
Скомпилируйте снова:
gcc -Wall -Wextra -std=c17 main.c -o hello
./hello
Ожидаемый вывод:
Hello, Алия!
This is your first C program.
Если у терминала проблемы с кириллицей, временно используйте латиницу. Это не ошибка языка C, а вопрос кодировки терминала и окружения
Мини-карта процесса компиляции
Упрощенно процесс выглядит так:
main.c -> препроцессор -> компилятор -> линкер -> hello
Препроцессор обрабатывает #include. Компилятор переводит C-код в машинно-близкое представление. Линкер связывает ваш код со стандартной библиотекой, где живет printf. В конце получается исполняемый файл
На первом уроке не нужно знать все детали. Но полезно понимать, почему ошибка может появиться на разных этапах: не найден stdio.h, синтаксис сломан, не найден main, линкер не смог собрать программу
Частые ошибки и порядок проверки
gcc: command not found. Компилятор не установлен или терминал его не видит. Проверьте установку
main.c: No such file or directory. Вы запускаете команду не в той папке или файл называется иначе
expected ';' before 'return'. Где-то выше забыта точка с запятой, часто после printf
undefined reference to main. В программе нет правильной функции main, она названа иначе или файл не тот
stdio.h not found. Проблема с установкой компилятора или стандартных заголовков
Permission denied при запуске. Проверьте, что вы запускаете собранный файл и используете правильную команду. На macOS/Linux обычно ./hello
Рабочая диагностика простая: сначала проверьте папку и имя файла, потом команду компиляции, потом первую ошибку компилятора. Не чините сразу весь красный список: часто одна пропущенная скобка рождает пять сообщений
Что может быть еще интересно по этой теме
C подойдет первым языком? Подойдет, если вы хотите понять память, компиляцию, указатели и системную базу. Но он менее мягкий, чем Python или JavaScript: ошибки придется читать внимательно
GCC или Clang выбрать новичку? Для первых уроков подойдет любой. GCC часто встречается в Linux-материалах, Clang стандартно доступен в экосистеме macOS через developer tools
Почему C до сих пор изучают? Потому что он близко показывает, как программа превращается в машинный код, как устроены память, строки, массивы и работа с файлами. Это полезно даже тем, кто потом уйдет в C++, Rust, Go или embedded
Можно ли писать C в онлайн-компиляторе? Да, для первых экспериментов. Но локальный компилятор лучше учит реальной сборке: файлы, флаги, warnings, запуск бинарника
Что почитать дальше по C
- Как установить компилятор C: GCC, Clang и онлайн-запуск — если
gccилиclangне запускаются. - Типы, printf и scanf в C — чтобы разобраться с
int,double,char,%d,%f,%s. - if, switch и циклы в C на простых задачах — следующий шаг после линейной программы.
- [Массивы и строки в C: индексы, char[] и нулевой символ](https://aglamov.biz/jazyki-programmirovanija/si/massivy-i-stroki-v-c) — чтобы понять строку
char name[].



