Язык программирования С
KODИстория языков программирования С и С++
С — процедурный язык программирования, разработанный в 1969—1973 годах сотрудниками Bell Labs Кеном Томпсоном и Деннисом Макалистэйр Ритчи как развитие языка Би. С был создан для использования в операционной системе UNIX, ключевым разработчиком которой являлся Деннис Ритчи. С тех пор он был перенесён на многие другие операционные системы и стал одним из самых используемых языков программирования.
Деннис Ритчи (9 сентября 1941 — 12 октября 2011) также известен как соавтор классической книги «Язык программирования C», обычно сокращаемой как «K&R» (авторы Керниган и Ритчи).
C++ — объектно-ориентированное расширение языка Си, создан в начале 1980-х годов Бьерном Страуструпом, также сотрудником Bell Labs. Вначале он добавил к языку Си возможность работы с классами и объектами, а в 1983 году после добавления большого количества синтаксических конструкций получившийся язык был переименован из Си с классами в «C++». Его первый коммерческий выпуск состоялся в октябре 1985 года.
C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. С момента создания он стал широко использоваться для разработки программного обеспечения, став одним из самых популярных языков программирования. На С++ создают операционные системы, прикладные программы, драйверы, компьютерные игры.
В 1985 году вышло первое издание книги «Язык программирования C++» Б. Страуструпа, которое стало классическим.
C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.
Преимущества языка С
Язык программирования С — самый быстрый в мире высокоуровневый язык программирования.
Для языка С характерны лаконичность, стандартный набор конструкций управления потоком выполнения, структур данных и обширный набор операций.
С ценят за его эффективность. Он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ. Несмотря на то, что С не разрабатывался для новичков, он активно используется для обучения программированию. В дальнейшем синтаксис языка С стал основой для многих других языков.
Операторы +=, -=, *= и /= в С
В языке Си есть синтаксический сахар для операции присваивания.
Данные операции эквивалентны:
x += 2
x = x + 2x -= 2x = x - 2
x *= 2
x = x * 2
x /= 2x = x / 2
x %= 2x = x % 2
Кроме вышеперечисленных существуют также операции: x &= 2, x |= 2, x &&= 2, x ||= 2, x ^= 2, x <<= 2, x >>= 2.
Синтаксическая прелесть этой записи становится очевидной при использовании человекочитаемых идентификаторов переменных:
g_realProjectsSum += 2 g_realProjectsSum = g_realProjectsSum + 2
Инструкция цикла while в С
Инструкция цикла while называется циклом с предусловием и имеет следующий формат:
while (условие)
{
блок инструкций
}
В качестве выражения допускается использовать любое выражение языка С, а в качестве тела любая инструкция, в том числе пустая или составная (последовательность простых инструкций в фигурных скобках). Схема выполнения инструкции while следующая:
- Вычисляется выражение.
- Если выражение ложно, то выполнение инструкции while заканчивается и выполняется следующая за ней инструкция. Если истинно, то выполняется блок инструкции while.
- Процесс повторяется с пункта 1.
Инструкция цикла do while называется инструкцией цикла с постусловием и используется в тех случаях, когда необходимо выполнить тело цикла хотя бы один раз. Формат инструкции do while имеет следующий вид:
do
{
блок инструкций
}
while (условие);
Схема выполнения цикла do while :
- Выполняется тело цикла (которое может быть составной инструкцией).
- Вычисляется выражение.
- Если выражение ложно, то выполнение инструкции do while заканчивается и выполняется следующая инструкция. Если истинно, то выполнение цикла продолжается с пункта 1.
Управление выполнением цикла
В любой момент можно прервать выполнение цикла инструкцией break.
Если прервать нужно не цикл, а лишь текущую итерацию, продолжив выполнение со следующей итерации, нужно использовать инструкцию continue.
Обе инструкции могут использоваться только внутри инструкций цикла.
Пример вложенных циклов
int i, j, k;
…
i=0;
j=0;
k=0;
do
{
i++;
j--;
while (a[k] < i)
k++;
} while (i < 30 && j < -30);
Модель памяти приложения
Память процесса во время его исполнения состоит из четырех сегментов (в первом приближении):
- CODE — сегмент кода
- DATA — сегмент данных (статических)
- STACK — сегмент стека
- HEAP — сегмент "куча"
В сегменте кода хранятся команды на языке машинных кодов, предназначенные для исполнения на ЦПУ.
В сегменте данных хранятся статические переменные, чьи значения "подгружаются" в память вместе с загрузкой программы, т.е. инициализированы еще до включения процесса в работу. Эти переменные существуют все время работы программы, и сегмент очищается только с окончанием вычислительного процесса.
В сегменте стека хранятся локальные переменные, а также адреса возврата из функций.
В сегменте "куча" выделяется память для динамических переменных.
Функции в С
Существенная часть умения программирования — это умение проектировать программный продукт, в частности, разбивать задачу на подзадачи. В языке С нет деления подпрограмм на процедуры и функции, здесь вся программа состоит только из функций.
Функция — это совокупность объявлений и операторов, предназначенная для решения определенной задачи. Каждая функция имеет идентификатор — имя.
Даже «тело программы» — это функция с именем main, главная функция. В программе на С главная функция только одна, т. к. именно с нее, в каком бы месте она не находилась, начинается выполнение программы.
Имя (идентификатор) используется для вызова функции.
При вызове функции ей при помощи аргументов (формальных параметров) могут быть переданы некоторые значения (фактические параметры), используемые во время выполнения функции.
Функция может возвращать некоторое (одно!) значение. Это возвращаемое значение и есть результат выполнения функции, который при выполнении программы подставляется в точку вызова функции, где бы этот вызов ни встретился.
Допускается создание функций, не имеющих аргументов, а также функций, не возвращающих никаких значений. Действие таких функций может состоять в изменении значений глобальных переменных, выводе на печать текста или других побочных действиях.
Описание функции задает:
- тип возвращаемого значения;
- имя функции;
- типы и число формальных параметров;
- тело функции.
В определении функции также может быть указан класс памяти.
Пример
int digit(unsigned char c)
{
if (c >= '0' && c <= '9')
return 1;
else
return 0;
}
В данном примере определена функция с именем digit, имеющая один параметр с именем c и типом unsigned char. Функция возвращает целое значение, равное 1, если параметр функции является цифрой, или 0 в противном случае.
В языке С определение функции не обязательно предшествует ее вызову. Определения используемых функций могут находиться как перед местом вызова, так и ниже, или вообще находиться в другом файле.
Однако, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических параметров типам формальных параметров, до вызова функции нужно поместить объявление функции -— прототип.
Объявление функции похоже на определение функции, но тело функции отсутствует, а имена формальных параметров могут быть пропущены. Для функции, определенной в последнем примере, прототип может иметь вид.