Когда разговор заходит о программировании, многие вспоминают про язык C и про то, какие фантастические возможности есть у тех, кто умеет на нём программировать. Давайте разберёмся, что же такого особенного в этом языке и почему программировать на C сложнее, чем на современных языках.
Немного важной истории
Сам язык C придумал Деннис Ритчи в 1972 году — в то время было чёткое разделение языков программирования:
- ассемблеры — для системного программирования, операционных систем и драйверов;
- языки высокого уровня для остальных прикладных задач.
Ритчи захотел сделать такой язык, чтобы он по сути был максимально приближен к ассемблерам по эффективности и быстродействию, но имел в то же время адекватный и понятный человеку синтаксис.
У него получился эффективный и мощный язык, который на то время получил лучшее от двух миров: скорость и мощь ассемблера и понятный синтаксис языков высокого уровня. Даже почти 50 лет спустя C — самый быстрый и эффективный язык для системного программирования.
В чём сила языка С
На C можно написать программу, которая сможет дотянуться до любого железа на компьютере и использовать его в своих целях. Вы получаете полный контроль над всей памятью и аппаратным устройством компьютера.
Вот что делает C таким мощным языком:
- работа с любой областью памяти;
- явные области видимости имён — то, что вы объявляете внутри функции, доступно только внутри этой функции, если явно не задать обратное;
- простой базовый синтаксис, из которого можно собрать конструкцию любой сложности;
- простая система типов данных — она может показаться сложной, но для системного языка это действительно простая система;
- полная вседозволенность компилятора — он ругается только на грубые синтаксические ошибки, а что происходит во время выполнения программы, его не касается;
- можно подключать любые готовые модули для расширения возможностей языка и встроенных команд;
- есть компиляторы для любой операционной системы, что позволяет писать относительно кроссплатформенный код.
Получается, что на C можно написать программу, которая может делать с железом, памятью и процессором что угодно, если в самом коде нет синтаксических ошибок. Но это часто оборачивается минусами, о них сейчас и поговорим.
Минусы программирования на С
Если бы всё было так просто, у C не было бы репутации одного из сложных языков программирования. Штука в том, что все минусы C — это обратная сторона его плюсов. Смотрите сами:
- Так как компилятор следит только за самыми грубыми ошибками в синтаксисе, то ему неважно, что происходит с рабочей памятью. Из-за этого легко обратиться не к той области памяти. В лучшем случае это нарушит работу самой программы, а в худшем — сломает другие программы и операционную систему (память-то на всех общая).
- Нет встроенных средств очистки памяти, всё нужно делать вручную. Если про это забыть, программа может занять всю свободную оперативную память.
- Изначальная ориентированность только на процедурное программирование не позволяет реализовать ООП-подход в программах. Есть способы обойти это ограничение через указатели, но это сложные конструкции.
По сути, единственная основная современная претензия к C в том, что там нет полноценной реализации ООП. Все остальные минусы — побочный эффект того, что программист должен сам предусматривать все нештатные ситуации и следить за памятью и поведением программы.
👉 Можно провести такую аналогию: программировать на C — это как ездить на гоночном болиде Формулы 1. Это очень мощно, быстро и эффектно, но без опыта и абсолютного знания о том, как управлять этим болидом, пилот сразу вылетит за ограждение. Механика вместо автомата, отсутствие умных помощников типа курсовой устойчивости и помощи при заносах — всё вручную, но взамен пилот получает абсолютный контроль над машиной и ставит рекорды.
Синтаксис — коротко
Комментарии. Классика — делать их вот так:
/* это комментарий */
Но с 1999 года можно оформлять их с начала строки:
// это тоже комментарий
Фигурные скобки. Это важная часть языка — внутри таких скобок язык воспринимает команды как одно целое. Ими задаются границы в циклах, функциях и в любых местах, где нужно сгруппировать несколько команд.
Математические и логические операторы. Тут всё стандартно и выглядит точно так же, как в Python или JavaScript (которые как раз и позаимствовали многое из С). Но в C список таких операторов намного шире: здесь есть и поразрядные операторы, и побитовые, и даже тернарный оператор ? :
(это краткая форма условного оператора).
Условные операторы. Самый простой — классический if:
if ((условие)) (команда_1)
else (команда_1)
Ещё есть множественный условный оператор switch
, который позволяет выбирать несколько возможных значений по условию.
Циклы. C ними всё просто — обычные while-do, do-while и for. Сюрпризов в описаниях нет, просто задаём условие цикла и ставим фигурные скобки в теле цикла.
Пример программы
Давайте напишем код, который считает сумму чисел от единицы до введённого числа:
#define _CRT_SECURE_NO_WARNINGS // чтобы компилятор не ругался на scanf
#include <stdio.h> // подключаем стандартный модуль ввода-вывода
int main() { // начало главной функции
int k; // объявляем целую переменную key
int i = 1; // сразу объявляем переменную со значением
int sum = 0; // на старте сумма равна нулю
printf("k = "); // выводим строчку на экран, но пока без значения суммы
scanf("%d", &k); // ждём ввода числа и записываем его в переменную k
while (i <= k) // делаем цикл — пока i меньше или равно k
{ // как раз те самые фигурные скобки для тела цикла
sum = sum + i; // добавляем значение i к сумме
i++; // увеличиваем i на 1
} // закончилось тело цикла
printf("sum = %d\n", sum); // выводим значение суммы, оно получится на той же строке, что и первая строчка
getchar(); // ждём нажатия любой клавиши, чтобы пользователь мог успеть прочитать ответ
return 0; // знак того, что программа завершилась без ошибок
} // конец программы
Где применяется С
Многие думают, что на C пишут только драйвера и программы для микропроцессоров, но область применения C намного шире. Сейчас на C пишут:
- операционные системы — большинство ОС в мире написаны на C или С++;
- драйверы — то же самое, конкуренцию составляет только ассемблер;
- программы для микроконтроллеров, умных гаджетов, систем охраны и всяких датчиков;
- сервисы и фрагменты кода в прикладных программах там, где важно быстродействие.Например, у вас есть сервер, который работает с базой данных, и вам нужно, чтобы он эти данные получал как можно быстрее. В этом случае проще реализовать этот сервис на С, и тогда он будет работать так быстро, насколько это вообще возможно.
С чего начать
Если вы ещё учитесь в школе (или недавно закончили), почитайте Константина Полякова — у него целая авторская подборка по обучению программированию на С.
«Язык программирования С» — книга от самих авторов языка. Классика учебной литературы.
Онлайн-компилятор языка C — пригодится тем, кто хочет перейти от теории к практике.