Перейти к основному содержимому

Первая программа на С

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…


Первая программа

Где применяют язык C

C — основа системного ПО — ОС, драйверы, встраиваемые устройства, runtime других языков. Минимум абстракций, прямой контроль памяти и производительности. Понимание C помогает читать код Unix, Linux, Python (интерпретатор на C).

Здесь — цепочка препроцессор → компилятор → линковщик и первая Hello, World.


Что происходит, когда вы запускаете программу на С

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

Этот процесс называется компиляцией. Он состоит из следующих шагов:

  1. Препроцессирование — обработка директив, начинающихся с символа #, таких как #include или #define. На этом этапе подключаются заголовочные файлы, раскрываются макросы, и исходный текст программы превращается в единый файл без ссылок на внешние ресурсы.
  2. Компиляция — перевод подготовленного текста программы в ассемблерный код, специфичный для целевой архитектуры (например, x86-64 или ARM).
  3. Ассемблирование — преобразование ассемблерного кода в объектный файл, содержащий машинные инструкции в двоичной форме, но ещё не готовый к запуску.
  4. Компоновка (линковка) — объединение одного или нескольких объектных файлов с библиотеками (например, стандартной библиотекой С) в единый исполняемый файл.

Результат этого процесса — исполняемый файл, который можно запустить на компьютере с совместимой операционной системой и архитектурой процессора.

Для выполнения этих этапов требуется специальная программа — компилятор. Наиболее распространённые компиляторы для С — это 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:

  1. Перейдите на официальный сайт https://www.mingw-w64.org/ или используйте доверенный установщик, такой как WinLibs.
  2. Скачайте сборку MinGW-w64, соответствующую вашей архитектуре (обычно x86_64).
  3. Распакуйте архив в удобное место на диске, например, в папку C:\mingw64.
  4. Добавьте путь к папке bin внутри этой директории (например, C:\mingw64\bin) в переменную среды PATH вашей системы.
  5. Проверка в новом окне cmd или PowerShell:
gcc --version

Разбор:

  • Команда проверяет, доступен ли компилятор gcc в текущем окружении командной строки.
  • Вывод версии подтверждает корректную настройку PATH и готовность toolchain к сборке программ.
  • Это базовая диагностика, которую полезно сделать до создания и компиляции первого исходника.

Если отображается версия компилятора, gcc доступен из терминала для сборки программ.


Подход 2 — Использование Visual Studio Community

Visual Studio — полноценная интегрированная среда разработки от Microsoft. Бесплатная версия Community включает компилятор MSVC, отладчик, редактор кода и средства управления проектами.

Для работы с С в Visual Studio:

  1. Скачайте и установите Visual Studio Community с официального сайта https://visualstudio.microsoft.com/ru/.
  2. Во время установки обязательно выберите рабочую нагрузку "Разработка классических приложений на C++". Несмотря на название, эта нагрузка включает поддержку языка С.
  3. После установки создайте новый проект типа "Пустой проект".
  4. Добавьте новый файл с расширением .c (например, main.c) в проект.
  5. Напишите код на С и нажмите кнопку запуска. Visual Studio автоматически скомпилирует и выполнит программу.

Этот подход удобен тем, что предоставляет мощные инструменты отладки и навигации по коду, но требует больше ресурсов и времени на установку.


Подход 3 — Использование Windows Subsystem for Linux (WSL)

Если вы предпочитаете работать в Unix-подобной среде, Windows предлагает подсистему WSL, которая позволяет запускать дистрибутивы Linux прямо внутри Windows.

Для этого:

  1. Включите компонент WSL через PowerShell (от имени администратора):
wsl --install
  1. Установите дистрибутив из Microsoft Store, например Ubuntu.
  2. После первого запуска создайте учётную запись пользователя.
  3. Установите GCC в Linux-среде командой:
sudo apt update && sudo apt install build-essential
  1. Теперь вы можете писать, компилировать и запускать программы на С так, как это делают в 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 &lt;stdio.h&gt;;
  • 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++", вы можете создать проект следующим образом:

  1. Откройте Visual Studio.
  2. Выберите "Создать проект".
  3. В списке шаблонов найдите "Пустой проект" (Empty Project) и нажмите "Далее".
  4. Укажите имя проекта, например HelloWorld, и путь для сохранения.
  5. Нажмите "Создать".

Теперь проект создан, но он пока пуст. Чтобы добавить код:

  1. В Обозревателе решений (Solution Explorer) щёлкните правой кнопкой мыши по папке "Файлы исходного кода".
  2. Выберите "Добавить → Создать элемент".
  3. В открывшемся окне выберите "Файл C++ (.cpp)", но измените расширение на .c в поле имени файла — например, введите main.c.
  4. Нажмите "Добавить".

В открывшемся редакторе введите тот же код:

#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:

  1. В терминале WSL (Ubuntu):
mkdir ~/hello && cd ~/hello
nano hello.c
gcc hello.c -o hello
./hello

На экране появится надпись Hello, World!.

Этот метод особенно ценен тем, что даёт доступ к Unix-среде, где большинство серверных и системных программ разрабатываются. Вы учитесь не только языку С, но и экосистеме, в которой он чаще всего применяется.


Сравнение подходов — какой выбрать?

КритерийGCC + MinGW-w64Visual StudioWSL + GCC
Требуемое место на диске~200 МБ5–10 ГБ~1–2 ГБ (плюс дистрибутив)
Скорость установкиБыстроДолгоСредняя
Понимание процесса сборкиПолноеЧастичное (автоматизация)Полное
Поддержка отладкиЧерез GDB (вручную)Встроенная, мощнаяЧерез GDB в терминале
Переносимость навыковВысокая (работает везде)Ограничена WindowsОчень высокая (Linux)
Подходит для новичковДа, при желании учитьсяДа, особенно визуальноДа, если знакомы с терминалом

Для первого знакомства с языком рекомендуется начать с MinGW-w64 и командной строки. Это позволяет увидеть каждый этап: от создания файла до запуска программы. После освоения основ можно перейти к IDE или WSL в зависимости от целей.


Советы по организации рабочего пространства

  1. Создайте отдельную папку для каждого проекта. Это предотвращает путаницу между файлами разных программ.
  2. Используйте осмысленные имена файлов. Например, calculator.c, temperature_converter.c, а не prog1.c.
  3. Комментируйте код. Даже в простых программах полезно писать комментарии, объясняющие, что делает каждая часть. Это помогает при возвращении к коду через неделю или месяц.
  4. Не бойтесь ошибок. Каждая ошибка — это шаг к пониманию. Компилятор — ваш союзник, а не противник.
  5. Экспериментируйте. Измените текст в 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 фиксирует стандарт языка, чтобы поведение кода было предсказуемым между машинами.

Что попробовать

  1. gcc -Wall -Wextra hello.c -o hello — включите предупреждения.
  2. Ввод имени через scanf / fgets — внимание к размеру буфера.
  3. Следующий шаг: C++ или ассемблер.

Мягкий переход от "Hello, World" к реальной пользе

После первой программы логично сделать 3 коротких шага:

  1. вывести переменную (int age = 25; printf("%d\n", age);),
  2. прочитать ввод пользователя,
  3. вынести часть логики в отдельную функцию.

Так вы сразу связываете "первый запуск" с темами Основы языка С, Управляющие конструкции, Функции и указатели.


Версия "чуть полезнее", чем просто вывод строки

Код ITЗагрузка примера кода…

Разбор:

  • Программа использует буфер char name[64], что ограничивает максимальный размер читаемой строки.
  • fgets(name, sizeof name, stdin) читает ввод безопасно по длине и предотвращает переполнение буфера.
  • Проверка на NULL обрабатывает ошибку или EOF, после чего программа завершается с кодом 1.
  • Финальный printf("Привет, %s", name); демонстрирует использование считанного значения в дальнейшем выводе.

Почему этот пример полезнее:

  • показывает работу с буфером фиксированного размера,
  • добавляет первую обработку ошибки,
  • иллюстрирует, что "рабочая" программа — это не только printf.

Привычки, которые стоит закрепить с первого дня

  • компилировать с предупреждениями (-Wall -Wextra),
  • держать одну задачу на одну функцию,
  • не использовать небезопасные устаревшие функции ввода,
  • проверять коды возврата у ввода/вывода.

Эти привычки пригодятся во всех следующих статьях раздела, особенно в Файловом вводе-выводе и Идиомах кода и обработке ошибок.


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на F#, Первая программа на ассемблере, Первая программа на 1С, Первая программа на COBOL, Первая программа на PowerShell, Первая программа на Fortran.