Первая программа на С
Play ITЗагрузка интерактивного демо…
Первая программа
Где применяют язык C
C — основа системного ПО — ОС, драйверы, встраиваемые устройства, runtime других языков. Минимум абстракций, прямой контроль памяти и производительности. Понимание C помогает читать код Unix, Linux, Python (интерпретатор на C).
Здесь — цепочка препроцессор → компилятор → линковщик и первая Hello, World.
Что происходит, когда вы запускаете программу на С
Программа на С не исполняется напрямую процессором. Она проходит несколько этапов преобразования, прежде чем станет машинным кодом — последовательностью команд, которые понимает центральный процессор.
Этот процесс называется компиляцией. Он состоит из следующих шагов:
- Препроцессирование — обработка директив, начинающихся с символа
#, таких как#includeили#define. На этом этапе подключаются заголовочные файлы, раскрываются макросы, и исходный текст программы превращается в единый файл без ссылок на внешние ресурсы. - Компиляция — перевод подготовленного текста программы в ассемблерный код, специфичный для целевой архитектуры (например, x86-64 или ARM).
- Ассемблирование — преобразование ассемблерного кода в объектный файл, содержащий машинные инструкции в двоичной форме, но ещё не готовый к запуску.
- Компоновка (линковка) — объединение одного или нескольких объектных файлов с библиотеками (например, стандартной библиотекой С) в единый исполняемый файл.
Результат этого процесса — исполняемый файл, который можно запустить на компьютере с совместимой операционной системой и архитектурой процессора.
Для выполнения этих этапов требуется специальная программа — компилятор. Наиболее распространённые компиляторы для С — это GCC (GNU Compiler Collection) и Clang. В среде Windows также часто используется компилятор от Microsoft — MSVC (Microsoft Visual C++).
Можно ли писать и запускать программы на С в Windows
Да, программы на С можно писать, компилировать и запускать в операционной системе Windows. Для этого существует несколько подходов, каждый из которых имеет свои особенности.
Подход 1 — Использование MinGW-w64 и GCC
MinGW-w64 — это порт компилятора GCC и связанных инструментов для Windows. Он позволяет компилировать программы на С без необходимости устанавливать дополнительные подсистемы. MinGW-w64 генерирует нативные исполняемые файлы Windows (с расширением .exe), которые работают без установки дополнительных библиотек.
Чтобы начать работу с MinGW-w64:
- Перейдите на официальный сайт https://www.mingw-w64.org/ или используйте доверенный установщик, такой как WinLibs.
- Скачайте сборку MinGW-w64, соответствующую вашей архитектуре (обычно x86_64).
- Распакуйте архив в удобное место на диске, например, в папку
C:\mingw64. - Добавьте путь к папке
binвнутри этой директории (например,C:\mingw64\bin) в переменную средыPATHвашей системы. - Проверка в новом окне cmd или PowerShell:
gcc --version
Разбор:
- Команда проверяет, доступен ли компилятор
gccв текущем окружении командной строки. - Вывод версии подтверждает корректную настройку
PATHи готовность toolchain к сборке программ. - Это базовая диагностика, которую полезно сделать до создания и компиляции первого исходника.
Если отображается версия компилятора, gcc доступен из терминала для сборки программ.
Подход 2 — Использование Visual Studio Community
Visual Studio — полноценная интегрированная среда разработки от Microsoft. Бесплатная версия Community включает компилятор MSVC, отладчик, редактор кода и средства управления проектами.
Для работы с С в Visual Studio:
- Скачайте и установите Visual Studio Community с официального сайта https://visualstudio.microsoft.com/ru/.
- Во время установки обязательно выберите рабочую нагрузку "Разработка классических приложений на C++". Несмотря на название, эта нагрузка включает поддержку языка С.
- После установки создайте новый проект типа "Пустой проект".
- Добавьте новый файл с расширением
.c(например,main.c) в проект. - Напишите код на С и нажмите кнопку запуска. Visual Studio автоматически скомпилирует и выполнит программу.
Этот подход удобен тем, что предоставляет мощные инструменты отладки и навигации по коду, но требует больше ресурсов и времени на установку.
Подход 3 — Использование Windows Subsystem for Linux (WSL)
Если вы предпочитаете работать в Unix-подобной среде, Windows предлагает подсистему WSL, которая позволяет запускать дистрибутивы Linux прямо внутри Windows.
Для этого:
- Включите компонент WSL через PowerShell (от имени администратора):
wsl --install
- Установите дистрибутив из Microsoft Store, например Ubuntu.
- После первого запуска создайте учётную запись пользователя.
- Установите GCC в Linux-среде командой:
sudo apt update && sudo apt install build-essential
- Теперь вы можете писать, компилировать и запускать программы на С так, как это делают в Linux.
Этот метод особенно полезен, если вы планируете в будущем работать с серверными или встраиваемыми системами, где доминируют Unix-подобные ОС.
Написание первой программы
Традиционно первая программа на любом языке программирования выводит на экран фразу "Hello, World!". Эта простая задача демонстрирует базовую структуру программы, подключение стандартных библиотек и использование функций ввода-вывода.
Вот как выглядит такая программа на языке С:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Разбор:
#include <stdio.h>подключает объявления стандартных функций ввода-вывода, включаяprintf.int main(void)определяет точку входа программы и фиксирует, что аргументы командной строки не используются.- Вызов
printf("Hello, World!\n");пишет строку вstdout, а\nпереносит курсор на новую строку. return 0;возвращает операционной системе код успешного завершения.
Разберём каждую часть этого кода по порядку.
Директива #include <stdio.h>
Эта строка — директива препроцессора. Она указывает компилятору включить содержимое заголовочного файла stdio.h в начало программы. Заголовочный файл содержит объявления функций, связанных со стандартным вводом и выводом — printf, scanf, puts, fgets и других. Функция gets была удалена из стандарта начиная с C11 из-за невозможности безопасно ограничить длину ввода; в новых программах её не используют.
Без подключения stdio.h компилятор не узнает, что такое printf, и выдаст ошибку. В языке С все используемые функции должны быть объявлены до их вызова, и заголовочные файлы служат для этого.
Функция main
Каждая программа на С начинается с функции main. Это точка входа — место, с которого операционная система передаёт управление вашей программе после её запуска.
Объявление int main(void) означает следующее:
int— тип возвращаемого значения. Функцияmainвозвращает целое число, которое передаётся операционной системе как код завершения программы.main— имя функции.(void)— список параметров. Словоvoidв скобках говорит о том, что функция не принимает аргументов извне.
Альтернативный вариант — int main(int argc, char *argv[]) — используется, когда программа должна обрабатывать аргументы командной строки. Для первой программы такой сложности не требуется.
Тело функции
Фигурные скобки { } ограничивают тело функции. Всё, что находится между ними, выполняется при запуске программы.
Внутри тела вызывается функция printf("Hello, World!\n");.
printf— функция вывода форматированной строки на стандартное устройство вывода (обычно терминал)."Hello, World!\n"— строковый литерал. Он заключён в двойные кавычки и передаётся функции как аргумент.\n— управляющая последовательность, обозначающая символ новой строки. Без неё курсор останется в конце выведенного текста, и следующий вывод начнётся сразу после него.
После вывода строки программа выполняет инструкцию return 0;.
return— команда, которая завершает выполнение функции и возвращает значение вызывающей стороне.0— стандартное значение, означающее успешное завершение программы. Любое другое число обычно интерпретируется как ошибка.
Эта структура — минимально необходимая для корректной программы на С. Она соответствует стандарту языка и будет работать на любой совместимой системе.
Сохранение и компиляция программы
Чтобы превратить текст программы в исполняемый файл, нужно выполнить несколько шагов.
Шаг 1 — Создание файла с исходным кодом
Откройте любой текстовый редактор — Блокнот (Notepad), Notepad++, Visual Studio Code, Sublime Text или другой. Важно использовать простой текстовый редактор, а не программы вроде Microsoft Word, которые добавляют невидимое форматирование.
Скопируйте в редактор код:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Сохраните файл с расширением .c, например, как hello.c. Расположение файла может быть любым — удобно создать отдельную папку для ваших проектов, например, C:\projects\hello.
Шаг 2 — Открытие терминала
В cmd или PowerShell перейдите в каталог с исходником:
cd C:\projects\hello
Убедитесь, что файл присутствует, выполнив:
dir
Вы должны увидеть hello.c в списке.
Шаг 3 — Компиляция
С MinGW-w64 и GCC в PATH:
gcc hello.c -o hello.exe
Разбор:
gcc hello.cкомпилирует и линкует исходникhello.cв исполняемый файл.- Опция
-o hello.exeзадаёт имя результата явно, чтобы не использовать имя по умолчанию. - При успешном выполнении в текущей директории появляется готовый файл запуска
hello.exe.
Эта команда говорит компилятору:
- взять файл
hello.cкак исходный код, - скомпилировать его,
- создать исполняемый файл с именем
hello.exe.
Если всё сделано правильно, команда завершится без сообщений. В той же папке появится файл hello.exe.
Без -o GCC на Linux создаёт исполняемый файл a.out, в Windows — часто a.exe. Следующая компиляция в той же папке перезапишет этот файл без предупреждения, поэтому для учебных проектов имя лучше задавать явно.
Лаборатория — увидеть этапы компиляции
Повторите компиляцию с сохранением промежуточных файлов:
gcc hello.c -save-temps -o hello.exe
В каталоге появятся, среди прочего:
hello.i— результат препроцессора: в конце — ваш исходник, выше — раскрытый текст из#include <stdio.h>;hello.s— ассемблерный лист для целевой архитектуры;- объектный файл и исполняемый
hello.exe.
Откройте .i и .s в текстовом редакторе и сравните с исходным hello.c. Подробная схема этапов — в инструментальной цепочке; пошаговые команды -E/-S/-c — там же.
Шаг 4 — Запуск программы
Введите в терминале:
hello.exe
Или просто:
hello
На экране появится:
Hello, World!
Программа завершится, и вы снова увидите приглашение командной строки.
Что делать, если возникли ошибки
Ошибки при компиляции — нормальная часть процесса обучения. Компилятор всегда сообщает о проблемах максимально точно.
Например, если вы забыли точку с запятой:
printf("Hello, World!\n")
Компилятор выдаст сообщение вроде:
error: expected ';' before 'return'
Это означает, что после вызова printf ожидалась точка с запятой, но она отсутствует. Исправьте строку, добавив ;, и повторите компиляцию.
Если вы написали prinft вместо printf, компилятор сообщит:
warning: implicit declaration of function 'prinft'
error: undefined reference to 'prinft'
Первое предупреждение говорит, что функция не объявлена. Вторая ошибка — линковщик не может найти реализацию этой функции. Исправьте опечатку, и программа заработает.
Главное правило: читайте сообщения компилятора внимательно. Они указывают номер строки и тип проблемы. Со временем вы научитесь быстро находить и исправлять такие ошибки.
Альтернативные способы запуска — Visual Studio и WSL
Хотя компиляция через командную строку с использованием GCC — это прямой и прозрачный путь, многие начинающие программисты предпочитают использовать интегрированные среды разработки (IDE), которые автоматизируют многие рутинные действия. Рассмотрим два популярных варианта в Windows: Visual Studio Community и Windows Subsystem for Linux (WSL).
Запуск через Visual Studio Community
После установки Visual Studio и выбора рабочей нагрузки "Разработка классических приложений на C++", вы можете создать проект следующим образом:
- Откройте Visual Studio.
- Выберите "Создать проект".
- В списке шаблонов найдите "Пустой проект" (Empty Project) и нажмите "Далее".
- Укажите имя проекта, например
HelloWorld, и путь для сохранения. - Нажмите "Создать".
Теперь проект создан, но он пока пуст. Чтобы добавить код:
- В Обозревателе решений (Solution Explorer) щёлкните правой кнопкой мыши по папке "Файлы исходного кода".
- Выберите "Добавить → Создать элемент".
- В открывшемся окне выберите "Файл C++ (.cpp)", но измените расширение на
.cв поле имени файла — например, введитеmain.c. - Нажмите "Добавить".
В открывшемся редакторе введите тот же код:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Теперь нажмите Ctrl+F5 (или кнопку "Запуск без отладки"). Visual Studio автоматически скомпилирует проект, соберёт исполняемый файл и запустит консольное окно с результатом.
Преимущество этого подхода — автоматическая настройка путей к компилятору, библиотекам и отладчику. Недостаток — зависимость от тяжёлой IDE, которая может отвлекать от понимания базовых принципов компиляции.
Запуск через WSL (Windows Subsystem for Linux)
Если вы активировали WSL и установили, например, Ubuntu, процесс становится почти идентичным тому, что используется в Linux:
- В терминале WSL (Ubuntu):
mkdir ~/hello && cd ~/hello
nano hello.c
gcc hello.c -o hello
./hello
На экране появится надпись Hello, World!.
Этот метод особенно ценен тем, что даёт доступ к Unix-среде, где большинство серверных и системных программ разрабатываются. Вы учитесь не только языку С, но и экосистеме, в которой он чаще всего применяется.
Сравнение подходов — какой выбрать?
| Критерий | GCC + MinGW-w64 | Visual Studio | WSL + GCC |
|---|---|---|---|
| Требуемое место на диске | ~200 МБ | 5–10 ГБ | ~1–2 ГБ (плюс дистрибутив) |
| Скорость установки | Быстро | Долго | Средняя |
| Понимание процесса сборки | Полное | Частичное (автоматизация) | Полное |
| Поддержка отладки | Через GDB (вручную) | Встроенная, мощная | Через GDB в терминале |
| Переносимость навыков | Высокая (работает везде) | Ограничена Windows | Очень высокая (Linux) |
| Подходит для новичков | Да, при желании учиться | Да, особенно визуально | Да, если знакомы с терминалом |
Для первого знакомства с языком рекомендуется начать с MinGW-w64 и командной строки. Это позволяет увидеть каждый этап: от создания файла до запуска программы. После освоения основ можно перейти к IDE или WSL в зависимости от целей.
Советы по организации рабочего пространства
- Создайте отдельную папку для каждого проекта. Это предотвращает путаницу между файлами разных программ.
- Используйте осмысленные имена файлов. Например,
calculator.c,temperature_converter.c, а неprog1.c. - Комментируйте код. Даже в простых программах полезно писать комментарии, объясняющие, что делает каждая часть. Это помогает при возвращении к коду через неделю или месяц.
- Не бойтесь ошибок. Каждая ошибка — это шаг к пониманию. Компилятор — ваш союзник, а не противник.
- Экспериментируйте. Измените текст в
printf, попробуйте вывести два сообщения, добавьте пустую строку. Наблюдение за результатом укрепляет интуицию.
Что дальше?
После успешного запуска первой программы открывается путь к изучению фундаментальных концепций языка С:
- переменные и типы данных,
- операторы и выражения,
- условные конструкции (
if,else), - циклы (
for,while), - функции и модульность,
- работа с массивами и строками,
- указатели и управление памятью.
Каждая из этих тем строится на базе того, что вы уже сделали: написали, скомпилировали и запустили программу. Теперь вы не просто пользователь компьютера — вы человек, который заставляет его выполнять свои команды.
Язык С требует внимания к деталям, но вознаграждает глубоким пониманием того, как работает программное обеспечение. Первая программа — это не просто "Hello, World!". Это первый шаг в мир создания технологий.
Частые ошибки
| Симптом | Причина |
|---|---|
undefined reference to main | Нет функции main или не тот файл линкуется |
stdio.h: No such file | Не установлен toolchain (MinGW/Build Tools) |
| Segmentation fault | Выход за границы массива / NULL-указатель |
return 0 не помогает | Ошибка до return — смотрите предупреждения -Wall |
Сборка с предупреждениями
gcc -Wall -Wextra -std=c11 hello.c -o hello.exe
Разбор:
-Wallвключает основной набор предупреждений компилятора о подозрительных конструкциях.-Wextraдобавляет дополнительные проверки (неиспользуемые параметры, сравнения с константами и т.д.).-std=c11фиксирует стандарт языка, чтобы поведение кода было предсказуемым между машинами.
Что попробовать
gcc -Wall -Wextra hello.c -o hello— включите предупреждения.- Ввод имени через
scanf/fgets— внимание к размеру буфера. - Следующий шаг: C++ или ассемблер.
Мягкий переход от "Hello, World" к реальной пользе
После первой программы логично сделать 3 коротких шага:
- вывести переменную (
int age = 25; printf("%d\n", age);), - прочитать ввод пользователя,
- вынести часть логики в отдельную функцию.
Так вы сразу связываете "первый запуск" с темами Основы языка С, Управляющие конструкции, Функции и указатели.
Версия "чуть полезнее", чем просто вывод строки
Код ITЗагрузка примера кода…
Разбор:
- Программа использует буфер
char name[64], что ограничивает максимальный размер читаемой строки. fgets(name, sizeof name, stdin)читает ввод безопасно по длине и предотвращает переполнение буфера.- Проверка на
NULLобрабатывает ошибку илиEOF, после чего программа завершается с кодом1. - Финальный
printf("Привет, %s", name);демонстрирует использование считанного значения в дальнейшем выводе.
Почему этот пример полезнее:
- показывает работу с буфером фиксированного размера,
- добавляет первую обработку ошибки,
- иллюстрирует, что "рабочая" программа — это не только
printf.
Привычки, которые стоит закрепить с первого дня
- компилировать с предупреждениями (
-Wall -Wextra), - держать одну задачу на одну функцию,
- не использовать небезопасные устаревшие функции ввода,
- проверять коды возврата у ввода/вывода.
Эти привычки пригодятся во всех следующих статьях раздела, особенно в Файловом вводе-выводе и Идиомах кода и обработке ошибок.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Первые шаги (маршрут подборки) — Первая программа на F#, Первая программа на ассемблере, Первая программа на 1С, Первая программа на COBOL, Первая программа на PowerShell, Первая программа на Fortran.