C
Язык C с нуля для школьников и студентов: компилятор gcc, переменные, ввод и вывод, условия, циклы, массивы, функции, указатели, строки, структуры, память и файлы.
C (читается «си») — язык программирования, который создал Деннис Ритчи в Bell Labs в начале 1970-х годов для операционной системы Unix. С тех пор на C написаны ядра операционных систем (Linux, большие части Windows и macOS), базы данных (SQLite, PostgreSQL), интерпретаторы других языков (основная версия Python), прошивки микроконтроллеров, драйверы и программы для роутеров, принтеров и бытовой техники.
Программа на C переводится компилятором прямо в машинный код (команды, которые процессор выполняет сам), поэтому работает быстро и требует мало памяти. Зато язык почти ничего не делает за программиста: память выделяется и освобождается вручную, выход за границы массива никто не проверяет, строка — это просто массив символов. Именно поэтому C хорошо учит тому, как программа на самом деле работает с памятью, — его часто дают первым языком на первом курсе.
Стандарты языка
Язык описан международным стандартом, который время от времени обновляется: C89 (он же ANSI C), C99, C11, C17 (исправленный C11, его ещё называют C18) и C23. Курс написан на C17: его поддерживают все распространённые компиляторы, а почти всё из курса работает и в C99. Каждая программа с показанным результатом проверена сборкой gcc -std=c17 -Wall.
Что нужно для начала
- Компьютер с Windows, Linux или macOS — подойдёт любой, даже старый.
- Компилятор — программа, которая превращает текст программы в исполняемый файл. В курсе — gcc (GNU Compiler Collection). В Linux он ставится одной командой, в Windows — в сборке MinGW-w64 (через MSYS2 или вместе с Code::Blocks). Подойдёт и Visual Studio с компилятором MSVC, а в macOS команда
gccна самом деле запускает компилятор clang — для курса разницы нет. - Редактор кода: Code::Blocks, VS Code, Visual Studio или любой текстовый редактор.
Как всё поставить, рассказывает первый урок, а подробно про Windows — справка Как установить gcc в Windows.
Как пройти курс
Уроки идут по порядку: от первой программы до указателей, структур, динамической памяти и файлов. Каждый урок опирается на предыдущие, поэтому лучше не перескакивать. Набирайте примеры сами и собирайте их с ключом -Wall: предупреждения компилятора в C часто указывают на настоящую ошибку. После каждого урока — несколько вопросов для проверки, в конце — итоговый тест.
В справочнике — короткие ответы на частые вопросы: почему scanf пропускает ввод, чем %f отличается от %lf, что значит segmentation fault и implicit declaration of function, как сравнить строки и получить случайное число.
Язык C++ вырос из C и во многом на него похож; чем они отличаются, рассказывает справка Чем C отличается от C++, а сам C++ — в отдельной теме C++.
Курс с нуля
- 1.Установка компилятора и первая программаКак установить компилятор gcc в Linux, Windows и macOS, написать первую программу на C, собрать её командой gcc и запустить. Разбор каждой строки.
- 2.Переменные, типы, printf и scanfЧто такое переменная в C, какие бывают типы (int, long long, double, char), как считать, выводить числа через printf и читать их через scanf — с форматами %d, %f, %lf, %c.
- 3.Условия: if, else и switchКак в C выполнить действие по условию: if, else, else if, сравнения и логические операции, ошибка = вместо ==, оператор switch и тернарный оператор.
- 4.Циклы: for, while и do whileКак в C повторять действия: циклы while, for и do while, break и continue, вложенные циклы, чтение чисел до конца ввода и частые ошибки с границами и точкой с запятой.
- 5.МассивыМассивы в C: объявление и заполнение, индексы с нуля, чтение n чисел, сумма и максимум, переворот, двумерные массивы, sizeof и выход за границы массива.
- 6.ФункцииКак написать свою функцию в C: параметры и return, void, объявление до main (прототип), передача по значению, массив в параметре, рекурсия и функции из math.h.
- 7.УказателиЧто такое указатель в C: адрес переменной, взятие адреса и разыменование, функция swap, указатели и массивы, арифметика указателей, NULL и типичные ошибки.
- 8.СтрокиКак устроены строки в C: массив char с нулём на конце, ввод слова и строки с пробелами, перебор символов, функции strlen, strcpy, strcat, strcmp и русские буквы в UTF-8.
- 9.СтруктурыСтруктуры в C: как объединить данные в struct, typedef, массив структур, передача структуры в функцию по значению и по указателю, оператор стрелка ->.
- 10.Динамическая память и файлыКак в C выделить память нужного размера через malloc, calloc и realloc, освободить её free, и как записать и прочитать файл: fopen, fprintf, fscanf, fgets, fclose.
Справочник
- scanf пропускает ввод: пробел перед %cПочему scanf("%c") и fgets после scanf не ждут ввода в C и как это исправить: пробел перед %c, очистка остатка строки, проверка результата scanf при вводе букв вместо числа.
- Segmentation fault: почему программа падаетЧто значит segmentation fault в C: выход за границы массива, scanf без &, непроверенный fopen и malloc, изменение строки-литерала, большой массив в стеке — и как найти место ошибки.
- undefined reference to main и другие undefined referenceЧто значит ошибка undefined reference в C: нет функции main или опечатка в ней, не сохранён файл, не подключена библиотека math (-lm), своя функция в другом файле или без тела.
- warning: format specifies type — формат не совпал с типомЧто значат предупреждения format '%d' expects argument of type и format specifies type в C, почему вывод становится мусором и какой формат printf и scanf нужен для каждого типа.
- Как найти длину строки: strlen и sizeofДлину строки в C даёт strlen из string.h, а sizeof — размер массива в байтах. Чем они отличаются, почему sizeof у указателя равен 8 и что учесть с fgets и русскими буквами.
- Как округлить число в CКак округлить число в C: вывод с нужным числом знаков через printf, функции round, floor, ceil и trunc из math.h, округление до двух знаков и отбрасывание дробной части.
- Как отсортировать массив в CСортировка массива в C: функция qsort из stdlib.h с функцией сравнения, по убыванию, массив строк и структур по полю, а также сортировка пузырьком для учебных задач.
- Как прочитать строку с пробеламиСтроку с пробелами в C читает fgets: как убрать перевод строки, почему fgets после scanf возвращает пустую строку, чем плохи gets и scanf("%s") и как читать файл по строкам.
- Как сравнить строки: strcmp, а не ==Строки в C сравнивают функцией strcmp из string.h: 0 — равны, меньше или больше нуля — порядок по алфавиту. Почему == не работает, strncmp и сравнение без учёта регистра.
- Как установить gcc в WindowsЧетыре бесплатных способа писать на C в Windows: Code::Blocks с MinGW, gcc из MSYS2, Visual Studio Community и WSL — по шагам, с проверкой и частыми проблемами.
- Ошибка implicit declaration of functionЧто значит implicit declaration of function в C и как её убрать: забытый #include, функция ниже main без прототипа, опечатка в имени или нестандартная функция.
- Переполнение int: отрицательный или странный ответПочему в C сумма или произведение больших чисел даёт отрицательный или странный ответ: границы int, INT_MAX, long long и %lld, приведение типа перед умножением, unsigned.
- Почему 5 / 2 равно 2: деление целых чиселПочему в C деление 5 / 2 даёт 2, а 1 / 2 — ноль, как получить дробный результат приведением (double), где ставить приведение и как работают / и % с отрицательными числами.
- Русские буквы в консоли Windows: непонятные символы вместо текстаПочему программа на C выводит в консоли Windows непонятные символы вместо русских букв и как это исправить: chcp 65001, SetConsoleOutputCP(CP_UTF8) и ключ /utf-8 в Visual Studio.
- Случайные числа: rand и srandКак получить случайное число в C: rand и srand из stdlib.h, srand(time(NULL)), число в диапазоне от a до b, случайное дробное число и почему числа повторяются при каждом запуске.
- Утечка памяти: как найти и исправитьЧто такое утечка памяти в C, как она появляется (забытый free, потерянный указатель, realloc, ранний return) и как найти её с помощью valgrind и -fsanitize=address.
- Чем %f отличается от %lf в scanf и printfВ scanf формат %f читает float, а %lf — double, путать их нельзя. В printf оба формата выводят double. Таблица форматов для дробных чисел и частые ошибки.
- Чем C отличается от C++Чем язык C отличается от C++: классы, string, vector и STL против массивов, malloc и printf; где код на C не собирается как C++ и какой язык учить первым.
Официальная документация
- Справочник по языку C и стандартной библиотеке (cppreference) — https://en.cppreference.com/w/c
- Документация компилятора GCC — https://gcc.gnu.org/onlinedocs/