Twitter VK
Заметки

Ничего не знаю: язык C, часть 1

Язык программирования C

Как всегда, самое сложное — собрать мысли «в кучу» (написать какие-то вступительные слова). В этот раз вышло многословно, но позже, надеюсь, я буду более лаконичен. А пока так:

Вероятно, немного есть людей, не знающих о существовании языка программирования C. Это довольно старый, но тем не менее популярный и актуальный инструмент. Язык C — язык системного программирования.

Не буду здесь рассказывать историю его создания — хотя это очень интересно, но другие источники расскажут об этом более компетентно. Читайте в интернете 🙂 Отмечу только, что на языке C пишут всякие там драйверы, ядра операционных систем и прочие нужные и важные вещи, близкие к «железу».

На текущий день существует множество новых — сложных и продвинутых — языков программирования, как общего назначения, так и специализированных. Но C — это своего рода «база», язык, повлиявший на возникновение и развитие множества других языков. Лет 20 назад в школах и университетах будущие программисты знакомились с языками программирования в основном на примере Pascal и С (иногда и Assembler). И если Pascal («Паскаль») был почти идеальным языком для обучения структурному программированию, то C предлагал большую сложность и меньшую очевидность. Но вместе с тем обеспечивал реальный «старт» для решения не только учебных, но и прикладных (профессиональных) задач. Сейчас язык C востребован — как практичный инструмент системного программирования и как инструмент обучения программированию (…а еще на нем изучают классические алгоритмы).

Посмотрим же на него глазами неискушенного человека. Кстати, многие вещи в части изучения языков программирования и собственно разработки (так это по-умному называется…) много удобнее делать на компьютере с операционной системой семейства Linux (если только разработка не для Windows). Почему — поинтересуйтесь сами у знающих людей, узнаете много интересного 🙂

Короче — хватит слов, приступим к делу. Возьмем в руки, скажем, ноутбук с замечательной и дружелюбной Linux Mint. Текст нашей первой пробной программы на языке C будем набирать в каком-нибудь удобном для наших целей текстовом редакторе — редакторе кода (любом с подсветкой синтаксиса языка C). Выбор редактора в нашем случае большого значения не имеет, чем проще — тем лучше, но если стремиться к максимальному комфорту, то могу порекомендовать один из следующих трёх: Geany (очень понятный, выглядит как игрушечный, но умеет «почти всё» для «старта», в том числе и подключение внешнего компилятора — словом, для начинающего самое то; а еще он уже находится в официальном репозитории Linux Mint — то есть «идет в комплекте»), Atom («гламурный» и настраиваемый — для эстетов и «поэтов») и Visual Studio Code (бесплатная «крутотень» от Microsoft).

Итак, создаем отдельную папку (название выберите по своему усмотрению), внутри этой папки создаем новый файл с именем proj01.c (сокр. от слова Project — «проект», так будет понятнее). «01» в имени файла будет означать, что это «наша первая программа». А расширение «.c» — стандартное расширение имени файла исходного кода на языке C.

Далее открываем этот файл в редакторе кода и набираем следующий текст (или наоборот — создать файл в редакторе кода, набрать текст и сохранить файл с придуманным ранее именем):

#include <stdio.h>

int main() {
  printf("Поздравляю, это Ваша первая программа на языке C!");
  return 0;
}

Такие программы обычно называются «Hello, world!» — когда предполагается, что программа выводит на экран именно эту фразу. А мы выведем другую — думаю, из текста ясно, какую именно 🙂

Сохранив файл, мы получили… вот именно — текстовый файл, он же «исходный код». А нам нужна работающая программа — исполняемый файл (само собой, в формате, подходящем нашей операционной системе). Поэтому на наш исходный код «натравим» компилятор, который проверит корректность нашего текста и создаст исполняемый файл. В «нашем» Linux уже установлен компилятор gcc, его и используем.

Внутри папки с нашим файлом запустим терминал («консольку»). В Linux Mint — правая кнопочка «мыши» и «открыть в Терминале» 🙂 И в строке ввода набираем команду (после символа $): gcc -Wall -o proj01 proj01.c

username ~/Папка_с_программой $ gcc -Wall -o proj01 proj01.c

Тут всё просто: «gcc» — компилятор, «-Wall» — ключ компилятора, указывающий, чтобы предупреждения выводились «по максимуму», «-o» позволяет задать имя будущего исполняемого файла (следующий за ключом «proj01»), и в конце — имя файла с исходным кодом «proj01.c». Если всё прошло успешно, в той же папке появился файл с именем «proj01» — это и есть исполняемый файл (в Windows он назывался бы, например, «proj01.exe»), который можно «запустить» и увидеть результат работы нашей программы. Так запустим же его (в терминале):

username ~/Папка_с_программой $ ./proj01

И там же, в терминале, увидим, что делает наша программа:

username ~/Папка_с_программой $ ./proj01
Поздравляю, это Ваша первая программа на языке C!username ~/Папка_с_программой $ 

Как говорится, congratulations! Программа выводит некий текст (строку).

Всё почти здорово. Почти, так как «приглашение» — имя пользователя в системе и название папки с программой — выводится в терминале впритык к результату работы нашей программы. Это «некрасиво». Сейчас исправим. В четвертой строке нашего исходного кода (см. наш исходный код) внесем небольшую правку — перед закрывающей двойной кавычкой добавим текст «\n». И теперь наша программа выглядит так (внимание на 4-й строке):

#include <stdio.h>

int main() {
  printf("Поздравляю, это Ваша первая программа на языке C!\n");
  return 0;
}

Файл исходного кода нужно сохранить и снова «обработать» компилятором, чтобы обновился исполняемый файл proj01. Поэтому повторяем команду gcc -Wall -o proj01 proj01.c в терминале.

И снова запускаем. И получаем результат:

username ~/Папка_с_программой $ ./proj01
Поздравляю, это Ваша первая программа на языке C!
username ~/Папка_с_программой $ 

Несложно заметить, что «приглашение к вводу» появляется на новой строке. Потому что «\n» — это «управляющий символ», который интерпретируется как «перевод строки» (или, другими словами, «новая строка»). И вообще — в языке C есть некоторый «традиционный» набор управляющих символов, которые активно используются для форматирования вывода текстовых данных «на экран».

Ну а теперь опишем всю «анатомию» этой элементарной программы. В первой строке #include — директива подключения модуля стандартного ввода/вывода, заголовочный файл которого именуется stdio.h (от Standard Input/Output). Это нужно, чтобы мы могли использовать функцию printf(). Вторая строка пустая — никакого смысла в этом нет и на работоспособность кода никак не влияет, но так программу проще читать 🙂 Просто логическое разбиение текста. В третьей строке объявляется так называемая главная функция программы (что очевидно из её имени — «main»): int main() { }.

int main() {

}

Она же описывает «тело» программы, или, другими словами, «точку входа» в программу. И смотрим на все её части: int — тип возвращаемого этой функцией значения (знаковое целое), main() — так объявляется любая функция в C (но конкретно слово «main» — служебное, только для главной функции), а пустые круглые скобки означают, что функция не принимает никаких аргументов, фигурные скобки {} — они же «операторные скобки» — обозначают и ограничивают «тело функции» (всё, что выполняется «внутри» функции, как раз обрамлено этими скобками). Такими фигурными скобками в C принято обозначать любые блоки кода. Идем дальше — следующие две строки с отступами. Эти отступы ни на что не влияют, но обычно ставятся для логического выделения фрагментов кода. Так программу легче читать, так «подсвечивается» логическая структура текста программы. И вообще — это считается «правилом хорошего тона». В четвертой строке мы вызываем функцию printf() — это функция форматированного вывода в консоль (в терминал, «на экран»…). Кстати, называется она так от слов «Print» — «печать/печатать» и «format» — «формат/форматировать». И с её помощью мы выводим строку, заключенную в двойные кавычки (так в C обозначаются строки). Напомню, в конце текста строки стоит управляющий символ «\n», который никак не отображается, но заставляет текстовый «курсор» перейти на новую строку (позицию) в консоли. Надеюсь, все понимают разницу между «строковым значением в языке C» и «новой строкой в консоли» 🙂 Там и там «строка», а вещи это совершенно разные. В пятой строке с помощью оператора return указываем, что наша главная функция должна вернуть значение 0, причем указанного ранее типа int (что-то же нужно вернуть операционной системе, так сказать, послать какое-нибудь сообщение). Нулевое значение — «всё в порядке, программа завершилась без ошибок». И обратите внимание, что строки кода завершаются (разделяются) символом «точка с запятой». Собственно, на return выполнение главной функции заканчивается, это «выход». Не забываем закрыть фигурную скобку — на любую открывающую скобку должна быть закрывающая 🙂

Итак, ничего сложного. А еще мы можем писать в тексте программы комментарии. Компилятором они игнорируются и на работоспособность программы не влияют, а для нас могут быть полезны — в качестве заметок и объяснений. Строчные комментарии (игнорируются до конца строки в редакторе) обозначаются символом // (он же двойной слеш), а блочные (произвольное количество строк) — парой /* */ (слеш-звёздочка — звёздочка-слеш). Добавим в наш текст для иллюстрации сказанного комментарии:

/*
  Это наша первая программа.
  Выглядит она, быть может, не ахти,
  но тем не менее работает...
*/
#include <stdio.h> // Подключаем стандартный ввод/вывод

// Далее объявим главную функцию без аргументов
int main() {
  printf("Поздравляю, это Ваша первая программа на языке C!\n");
  return 0; // Завершаем выполнение функции со значением 0 ("Ok")
}

Если откомпилировать и запустить этот новый вариант, то увидим, что результат работы программы будет идентичен предыдущему. Так и должно быть. Как говорится, «всё красиво, всё работает». До следующего раза…

Leave a Reply

Your email address will not be published. Required fields are marked *