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

Популярность языка C обусловлена его универсальностью в сфере операционных систем, где изменения происходят не так быстро, как в среде десктопного и мобильного программного обеспечения, а также веб-приложений. C не является высокоуровневым языком, так как он ближе к архитектуре компьютера. Это позволяет создавать компактные и производительные программы.

В C отсутствует поддержка объектно-ориентированного программирования, что было введено в C++. Хотя последний был создан на базе C, он не является его «продолжением», а представляет собой самостоятельный язык, который можно изучать и без знания C. Тем не менее, освоение C перед изучением C++ предоставляет полезный опыт, так как синтаксис этих языков схож, и C помогает новичку освоить основные концепции программирования без усложнения избыточными функциями.

Является ли C хорошим выбором для начального изучения программирования? Если вы изучаете дисциплину, не связанную с IT, в вузе, то вряд ли. Язык C требует понимания архитектуры компьютера и работы с памятью, где указатели играют ключевую роль. Это сложная для начала тема, которая обычно изучается на более специализированных курсах.

Конечно, на C можно изучать основы программирования, избегая усложнений, связанных с указателями. Однако в этом случае возникает иллюзия знания C, без реального понимания его основ. Язык C был создан опытными программистами для разработки операционной системы UNIX и не предназначался для обучения новичков.

Среды и компиляторы для программирования на C

Пользователи GNU/Linux могут использовать любой текстовый редактор с подсветкой синтаксиса, дополненный GCC и терминалом.

Редактор и терминал для программирования на CСуществуют редакторы с дополнениями, такими как встроенный терминал и просмотр каталогов, например, Geany или Atom.

Программирование в Geany

C является компилируемым языком программирования. В GNU/Linux для создания исполняемых файлов применяется GCC — набор компиляторов, в который входит компилятор С. Чтобы преобразовать исходный файл (с расширением *.c) в исполняемый файл, вводится команда в терминале:

gcc -o hello hello.c

, где gcc — команда, запускающая программу компиляции и другие операции; -o – опция, указывающая на выбор имени создаваемого исполняемого файла; hello – это имя выходного исполняемого файла; hello.c – имя исходного файла. Указание имени исполняемого файла необязательно:

gcc hello.c

В этом случае исполняемый файл получит стандартное имя a.out.

Для Windows существует собственный набор компиляторов — MinGW. Хотя его можно использовать отдельно, он также входит в состав среды разработки Dev-C++, которая может быть полезной для изучения языков C и C++.

При сохранении файла выберите тип "C source files (*.c)". Компиляция и выполнение программы осуществляется по нажатию F9. Программа автоматически закрывается после завершения, и результат можно не успеть увидеть. Чтобы это исправить, в программу добавляются строки: #include <conio.h> и getch(). (Это может не требоваться для более новых версий Dev-C++.)

"Hello World" в GNU/Linux:

#include <stdio.h>
 
int main () {
	printf ("Hello World\n");
}

"Hello World" в Windows:

#include <stdio.h>
#include <conio.h>
 
int main () {
	printf ("Hello World\n");
 
	getch();
}

Существует множество кроссплатформенных сред разработки, таких как Eclipse с модулем CDT, KDevelop и CLion. Последняя предоставляется компанией JetBrains, лидером в производстве IDE, и предлагает 30-дневный пробный период, достаточно удобный для обучения. CLion отличается эргономичностью по сравнению с другими IDE.

"Hello World" на C

На примере простой программы рассмотрим специфические черты языка C.

В C ключевую роль играет функция main(). Она всегда должна присутствовать в программе, с нее начинается выполнение программы. Однако внутренние переменные main() не являются глобальными и действуют только в ее рамках. В C почти весь код помещен в функции, а main() является основной.

По умолчанию main() возвращает int, поэтому указание типа возврата не обязательно. Компилятор выдаст предупреждение в этом случае.

Функция printf() используется для вывода данных, аналогично процедуре write() в Pascal и функции print() в Python, но без автоматического перехода на новую строку. Для переноса используется \n. В C каждое законченное выражение оканчивается точкой с запятой.

В C функции ввода-вывода не являются частью языка. Например, в Python для использования print() и input() не требуются никакакие модули, в отличие от C, где printf() и другие функции подключаются через заголовочный файл stdio.h. Предваряя код строкой #include <stdio.h>, вы включаете нужные функции. Include по-английски означает "включить", а stdio — "стандартный ввод-вывод".

Объявления функций находятся в заголовочных файлах (*.h), которые не содержат кода функции, а только их описание, параметры и возвращаемые данные. Код функции находится в библиотеках, которые включаются препроцессором C во время компиляции программы, добавляя содержимое заголовков в начало файла программы.

Практическая работа

Закомментируйте1 первую строку программы HelloWorld и попробуйте скомпилировать ее. Был ли создан исполняемый файл? Какую ошибку выдал компилятор?

1 // - однострочный комментарий в C; /* … */ - многострочный комментарий в C.

Вопросы для самопроверки:

  1. Для каких типов приложений чаще всего используется язык программирования C?
  2. Какой компилятор используется в GNU/Linux для компиляции программ на C?
  3. Какие функции ввода-вывода должны быть подключены в C для работы с выводом текста?
  4. В какой части C программы начинается выполнение кода?
  5. Что произойдет, если закомментировать строку #include <stdio.h> в программе на C и попытаться скомпилировать ее?

Программа курса:

  1. Описание курса
  2. Введение в язык программирования C
  3. Типы данных в C и форматированный вывод
  4. Символьные типы и управляющие символы в C
  5. Операторы ветвления и switch в C
  6. Циклы и операторы в языке C
  7. Битовые операции в языке C
  8. Посимвольный ввод и вывод в C - буферизация
  9. Переменные, адреса и указатели в C
  10. Передача аргументов по ссылке и значению в C
  11. Форматированный ввод данных с использованием scanf
  12. Генерация псевдослучайных чисел на C
  13. Адресная арифметика в массивах C
  14. Передача массивов в функции и указатели
  15. Строки в языке C - особенности и функции работы
  16. Функции работы со строками в C
  17. Работа со структурами в C - создание и применение
  18. Динамические структуры данных в C
  19. Ввод и вывод данных из файлов в языке C
  20. Передача аргументов в C и работа с файлами
  21. Препроцессор в языке C - директивы и макросы
  22. Создание и компиляция многофайловых программ в C
  23. Использование статических и динамических библиотек в C