Язык программирования C: основы для начинающих

Язык программирования C: основы для начинающих Полезное

Язык 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. Для учебных примеров разница незаметна; расходятся тексты предупреждений и ошибок, набор расширений и некоторые дефолты.

OTUS Журнал