Язык C (Си) — это компилируемый процедурный язык программирования общего назначения, созданный в начале 1970-х годов Деннисом Ритчи в Bell Labs. Он дает прямой доступ к памяти и близок к аппаратуре, поэтому на нем пишут операционные системы, драйверы и программы для микроконтроллеров.
Содержание
Ниже разберу, что такое язык C и чем он отличается от C++, где его применяют, как написать и скомпилировать первую программу через gcc и какие ошибки чаще всего ловят новички. Весь код прогнан компилятором, вывод показан как есть.
Немного истории и зачем нужен C
C появился как рабочий инструмент: на нем в начале 1970-х переписали операционную систему Unix, чтобы не привязывать ее к одному процессору. Идея прижилась — переносимый язык, близкий к железу, но читаемее ассемблера.
Язык давно стандартизирован. Первый общепризнанный стандарт — ANSI C (C89/C90), затем вышли C99, C11, C17 и актуальный на 2026 год C23 (ISO/IEC 9899:2024). Стандарты в основном расширяют язык, сохраняя совместимость со старым кодом.
За десятилетия C стал одной из основ системного программирования. Ядро Linux почти целиком написано на C, на нем же построены многие СУБД, среды исполнения и системные утилиты.
Чем C отличается от C++
Это разные языки, хотя названия и синтаксис похожи. C++ вырос из C в начале 1980-х как «C с классами» (автор — Бьярне Страуструп), но сегодня развивается своим путем и несет собственную идеологию.
Ключевое отличие: C — процедурный язык без встроенного объектно-ориентированного программирования, а C++ добавляет классы, шаблоны, исключения и большую стандартную библиотеку (STL). Многие простые программы на чистом C собираются и компилятором C++, но обратное неверно.
| Признак | C | C++ |
|---|---|---|
| Появился | начало 1970-х, Деннис Ритчи | начало 1980-х, Бьярне Страуструп |
| Основная парадигма | процедурная | ООП, обобщенное и процедурное программирование |
| Классы и объекты | нет | есть |
| Стандартная библиотека | компактная (stdio, stdlib, string) | большая, включая STL с контейнерами и алгоритмами |
| Ввод-вывод | функции printf/scanf из stdio.h | потоки cin/cout из iostream (плюс доступен printf) |
| Управление памятью | вручную: malloc/free | new/delete, умные указатели, RAII |
| Где чаще применяют | ОС, драйверы, встраиваемые системы | игры, высоконагруженные и десктоп-приложения |
Если коротко: C выбирают там, где нужен минимальный, предсказуемый и близкий к аппаратуре код, а C++ — где к этому добавляется объектная модель и богатая библиотека.
Для чего используют язык C
C ценят за компактный рантайм, компиляцию в машинный код и ручной контроль над памятью. Отсюда его основные области:
- операционные системы и их ядра (например, ядро Linux);
- встраиваемое ПО и микроконтроллеры — прошивки, IoT, автомобильная и промышленная электроника;
- драйверы устройств и низкоуровневые системные утилиты;
- среды исполнения и инструменты других языков (эталонный интерпретатор Python — CPython — написан на C);
- ресурсоемкие библиотеки, где важны скорость и точная работа с памятью.
Там, где счет идет на такты и байты, а среды выполнения (как у Python или Java) может не быть вовсе, C остается рабочим выбором.
Первая программа на C: hello world
Начну с минимального полного примера, который можно скопировать и запустить. Сохраните его в файл hello.c:
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
Скомпилировать и запустить (в терминале Linux или macOS):
gcc hello.c -o hello
./hello
Вывод в консоли:
Hello, world!
Теперь разберу программу по частям:
#include <stdio.h>— директива препроцессора; подключает стандартную библиотеку ввода-вывода, из которой беретсяprintf.int main(void)— главная функция, с нее начинается выполнение программы.int— тип возвращаемого значения,voidв скобках означает «без параметров».printf("Hello, world!\n");— выводит строку в консоль;\n— перевод строки. Каждая инструкция заканчивается точкой с запятой.return 0;— возвращает 0 операционной системе как признак успешного завершения.
Уточнение по среде: на macOS команда gcc обычно вызывает компилятор clang, а не настоящий GCC. Для учебных примеров результат одинаковый, различаются в основном тексты предупреждений и ошибок.
Базовый синтаксис C
Программа на C состоит из инструкций (каждая заканчивается точкой с запятой) и блоков кода в фигурных скобках {}. Отступы, в отличие от Python, на смысл не влияют — только на читаемость. Комментарии: // ... однострочный и /* ... */ многострочный.
C — статически типизированный язык: тип переменной задается при объявлении и не меняется. Базовые типы — int (целое), double и float (дробное), char (один символ):
#include <stdio.h>
int main(void) {
int age = 25; // celoe chislo
double price = 19.99; // chislo s plavajushchej tochkoj
char grade = 'A'; // odin simvol v odinarnyh kavychkah
printf("age=%d price=%.2f grade=%c\n", age, price, grade);
return 0;
}
Вывод:
age=25 price=19.99 grade=A
В printf каждый спецификатор формата отвечает за свой тип: %d — целое, %f — дробное (%.2f — с двумя знаками после точки), %c — символ. Подробный разбор объявления, области видимости и типов переменных — в парной статье Переменные для языка программирования C.
Управляющие конструкции — циклы и условия — выглядят так:
#include <stdio.h>
int main(void) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
if (sum > 10) {
printf("sum = %d (bolshe 10)\n", sum);
} else {
printf("sum = %d\n", sum);
}
return 0;
}
Вывод:
sum = 15 (bolshe 10)
Цикл for складывает числа от 1 до 5, а if проверяет результат. Логика ветвления и циклов в C такая же, как в C++, — это одна из причин, почему C часто изучают первым.
Три частые ошибки новичка
Ошибка 1: забытая точка с запятой. Пропущенный ; в конце инструкции — самая частая опечатка:
printf("Hello, world!\n")
return 0;
gcc сообщает:
error: expected ';' after expression
Исправление — поставить ; в конце инструкции с printf.
Ошибка 2: вызов printf без подключения stdio.h. Функция printf объявлена в заголовке stdio.h; без него компилятор не знает, что это за функция:
int main(void) {
printf("Hello, world!\n");
return 0;
}
Современный clang (его и вызывает gcc на macOS) считает это ошибкой:
error: call to undeclared library function 'printf' with type 'int (const char *, ...)';
ISO C99 and later do not support implicit function declarations
Здесь важна оговорка про инструмент: старые версии настоящего GCC на это же выдают не ошибку, а предупреждение (implicit declaration of function 'printf') и все равно собирают программу. Исправление одно — добавить #include <stdio.h> в начало файла.
Ошибка 3: неверный спецификатор формата. Тип аргумента не совпадает со спецификатором — %d ждет целое, а передан double:
double price = 19.99;
printf("price = %d\n", price); // %d zhdet int, a peredan double
Компилятор предупреждает:
warning: format specifies type 'int' but the argument has type 'double' [-Wformat]
Если предупреждение проигнорировать, программа соберется, но выведет мусор (в моем прогоне — price = -1546188227). Это неопределенное поведение: конкретное число непредсказуемо и меняется от платформы и запуска. Исправление — взять спецификатор под тип: printf("price = %.2f\n", price);.
Выводы
- C — компилируемый процедурный язык общего назначения из начала 1970-х, близкий к аппаратуре и дающий ручной контроль над памятью.
- C и C++ — разные языки: C++ вырос из C, добавив классы, шаблоны и большую библиотеку (STL); в чистом C объектно-ориентированного программирования нет.
- Главные области C — операционные системы, встраиваемое ПО, драйверы и среды исполнения других языков.
- Минимальная программа — функция
mainсprintfизstdio.h; собирается командойgcc hello.c -o helloи запускается. - Синтаксис держится на инструкциях с точкой с запятой, блоках в фигурных скобках, статических типах и директивах препроцессора вроде
#include. - Частые ошибки новичка — забытая точка с запятой,
printfбез подключенногоstdio.hи спецификатор формата не под тип аргумента.
Где применяется / связь с практикой
C — фундамент, на котором стоит значительная часть системного и прикладного софта, и отправная точка для C++. Понимание того, как устроена память, компиляция и базовый синтаксис, дальше переносится и на другие языки семейства.
Освойте тему на практике
Разобрать синтаксис, работу с памятью и переход от C к объектно-ориентированному C++ на практике помогает курс cpp-basic в Otus. Посмотреть формат занятий и уровень, не оплачивая курс, можно на бесплатных вебинарах — там разбирают конкретные задачи и отвечают на вопросы.
Смежные темы: Основы Python для начинающих, Класс в программировании: что это такое и как использовать, Книги по программированию для начинающих.
FAQ
Что учить новичку первым — C или C++?
Зависит от цели. C меньше по объему и хорошо учит работе с памятью и близкому к железу мышлению; его берут для системного и встраиваемого направления. C++ шире и востребован в геймдеве и высоконагруженных сервисах, но осваивать его сложнее.
Нужно ли ставить компилятор, чтобы просто попробовать C?
Для первых экспериментов хватит онлайн-песочницы с компилятором C прямо в браузере. Но для реальной работы понадобится локальный компилятор — gcc или clang — и текстовый редактор либо IDE.
Чем gcc отличается от clang?
Это два разных компилятора C (и C++). На macOS команда gcc по умолчанию вызывает clang. Для учебных примеров разница незаметна; расходятся тексты предупреждений и ошибок, набор расширений и некоторые дефолты.



