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

Обновлено: 05.07.2024

Язык программирования С (си) является одним из самых популярных и распространенных языков. Он представляет компилируемый язык программирования общего назначения со статической типизацией, разработанный в 1969—1973 годах в компании Bell Labs программистом Деннисом Ритчи (Dennis Ritchie).

Язык С нередко называют языком программирования "среднего уровня" или даже "низкого уровня", так как он сочетает элементы языков высокого уровня с функциональностью и производительностью ассемблера и работает близко к аппаратной части компьютера. В итоге мы можем манипулировать данными на низком уровне и при этом использовать высокоуровневые конструкции для управления работы программы.

Первоначально язык С предназначался для написания операционной системы Unix. Впоследствии Си стал одним из популярных языков, а его основной сферой применения стало системное программирование, в частности, создание операционных систем, драйверов, различных утилит, антивирусов и т.д. К слову сказать, Linux большей частью написан на Си. Однако только системным программированием применение данного языка не ограничивается. Данный язык можно использовать в программах любого уровня, где важны скорость работы и производительность. Так, мы можем писать с помощью Си и прикладные приложения, и даже веб-сайты (используя технологию CGI - Common Gateway Interface). Но, конечно, для создания графического интерфейса и веб-приложений, как правило, выбираются более подходящие инструменты и технологии, но тем не менее круг использования Си довольно широк. Это в немалой степени определило популярность языка. Например, в известном рейтинге языков программирования TIOBE язык С долгое время уверенно удерживает второе место.

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

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

Основные особенности Си

Универсальность - один и тот же код может быть скомпилирован на почти каждой платформе (при наличии для нее компилятора)

Высокая скорость выполнения

Компактность, небольшой размер выходных скомпилированных файлов

Основные этапы развития

В 1978 году Брайан Керниган и Деннис Ритчи опубликовали первое издание своего знаменитого труда "Язык программирования Си". Долгое время эта книга служила неформальной спецификацией языка Си. Однако быстрое распространение Си привело к необходимости выработки общих стандартов. И в 1983 году организация ANSI (Американский национальный институт стандартов) создала комитет для разработки спецификации Си. А в 1989 году спецификация была утверждена. Эту версию языка принято называть ANSI C или C89. В 1990 году спецификация ANSI C была немного дополнена Международной организацией по стандартизации (ISO). Новый стандарт стал называться ISO/IEC 9899:1990 или сокращенно С90.

В конце 1990-х годов стандарт подвергся пересмотру, что привело к выходу нового стандарта в 1999 году, который принято называть C99 (официальное название ISO 9899:1999).

И в декабре 2011 был опубликован новый и последний на данный момент стандарт для языка Си - С11 (официальное название ISO/IEC 9899:2011).

Здравствуй, мир

Выходные данные программы создаются в методе WriteLine класса Console из пространства имен System . Этот класс предоставляется библиотеками стандартных классов, ссылки на которые компилятор по умолчанию добавляет автоматически.

Типы и переменные

        : , short , int , long : , ushort , uint , ulong : , представляющие блок кода UTF-16 : , double :
      • Логический: bool , используется для представления логических значений, которые могут иметь значение true или false .
      • Пользовательские типы в формате enum E . Тип enum является отдельным типом со списком именованных констант. Каждый тип enum имеет базовый тип, в роли которого выступает один из восьми целочисленных типов. Набор значений типа enum аналогичен набору значений его базового типа.
      • Пользовательские типы в формате struct S
      • Расширения других типов значений, допускающие значение null
      • Пользовательские типы в формате (T1, T2, . )
        • Исходный базовым классом для всех типов: object : , представляющие последовательность единиц кода UTF-16
        • Пользовательские типы в формате class C
        • Пользовательские типы в формате interface I
        • Одномерные, многомерные массивы и массивы массивов. Например, int[] , int[,] и int[][] .
        • Пользовательские типы в формате delegate int D(. )
        • Тип class определяет структуру данных, которая содержит данные-члены (поля) и функции-члены (методы, свойства и т. д.). Классы поддерживают механизмы одиночного наследования и полиморфизма, которые позволяют создавать производные классы, расширяющие и уточняющие определения базовых классов.
        • Тип struct похож на тип класса тем, что он представляет структуру с данными-членами и функциями-членами. Но, в отличие от классов, структуры являются типами значений и обычно не требуют выделения памяти из кучи. Типы структуры не поддерживают определяемое пользователем наследование, и все типы структуры неявно наследуют от типа object .
        • Тип interface определяет контракт в виде именованного набора открытых элементов. Объект типа class или struct , реализующий interface , должен предоставить реализации для всех элементов интерфейса. Тип interface может наследовать от нескольких базовых интерфейсов, а class или struct могут реализовывать несколько интерфейсов.
        • Тип delegate (делегат) представляющий ссылки на методы с конкретным списком параметров и типом возвращаемого значения. Делегаты позволяют использовать методы как сущности, сохраняя их в переменные и передавая в качестве параметров. Делегаты аналогичны типам функций, которые используются в функциональных языках. Их принцип работы близок к указателям функций из некоторых языков. В отличие от указателей функций, делегаты являются объектно-ориентированными и типобезопасными.

        Типы class , struct , interface и delegate поддерживают универсальные шаблоны, которые позволяют передавать им другие типы в качестве параметров.

        Типы, допускающие значение NULL, не требуют отдельного определения. Для каждого обычного типа T , который не допускает значение NULL, существует идентичный тип T? , который отличается только тем, что может содержать дополнительное значение null . Например, int? является типом, который может содержать любое 32-разрядное целое число или значение null , а string? — любое значение string или null .

        Если значение типа назначается ссылке object , для хранения значения выделяется упаковка. Эта упаковка является экземпляром ссылочного типа, и в нее копируется значение. И наоборот, если ссылка типа object используется для типа значения, для соответствующего object выполняется проверка, является ли он упаковкой правильного типа. Если эта проверка завершается успешно, копируется значение этой упаковки.

        • Тип значения, не допускающий значения Null
          • Значение такого типа
          • Значение null или значение такого типа
          • Ссылка null , ссылка на объект любого ссылочного типа или ссылка на упакованное значение любого типа значения
          • Ссылка null , ссылка на экземпляр такого типа класса или ссылка на экземпляр любого класса, производного от такого типа класса
          • Ссылка null , ссылка на экземпляр типа класса, который реализует такой тип интерфейса, или ссылка на упакованное значение типа значения, которое реализует такой тип интерфейса
          • Ссылка null , ссылка на экземпляр такого типа массива или ссылка на экземпляр любого совместимого типа массива
          • Ссылка null или ссылка на экземпляр совместимого типа делегата

          Структура программы

          В качестве небольшого примера рассмотрим сборку, содержащую следующий код:

          Полное имя этого класса: Acme.Collections.Stack . Этот класс содержит несколько членов: поле с именем _top , два метода с именами Push и Pop , а также вложенный класс с именем Entry . Класс Entry , в свою очередь, содержит три члена: свойство с именем Next , свойство с именем Data и конструктор. Stack Является Stack классом. Он имеет параметр одного типа T , который замещается конкретным типом при использовании.

          Стек — это коллекция типа FILO (прибыл первым — обслужен последним). Новые элементы добавляются в верх стека. Удаляемый элемент исключается из верхней части стека. В предыдущем примере объявляется тип Stack , который определяет хранилище и поведение для стека. Можно объявить переменную, которая ссылается на экземпляр типа Stack для использования этой возможности.

          Для компиляции программы вам потребуется создать ссылку на сборку, содержащую класс стека, определенный в примере выше.

          Содержание

          Си — компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но, впоследствии, был перенесён на множество других платформ.

          История Си

          К 1973 году язык С стал достаточно силён, и большая часть ядра UNIX, первоначально написанная на ассемблере, была переписана на Си. Это было одно из самых первых ядер операционных систем, написанное на языке, отличном от ассемблера.

          K&R ввёл следующие особенности языка:

            (тип данных struct);
          • длинное целое (тип данных long int);
          • целое без знака (тип данных unsigned int);
          • оператор += и подобные ему.

          После публикации K&R C в язык было добавлено несколько возможностей:

          • функции, не возвращающие значение (с типом void), и указатели, не имеющие типа (с типом void *);
          • функции, возвращающие объединения и структуры;
          • имена полей данных структур в разных пространствах имён для каждой структуры;
          • присваивания структур;
          • спецификатор констант (const);
          • стандартная библиотека, реализующая большую часть функций, введённых различными производителями;
          • перечислимый тип (enum);
          • дробное число одинарной точности (float).

          ISO C

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

          ANSI C сейчас поддерживают почти все существующие компиляторы. Любая программа, написанная только на стандартном Си, гарантированно будет правильно выполняться на любой платформе, имеющей соответствующую реализацию Си.

          Новые особенности C99:

          • подставляемые функции (inline);
          • объявление локальных переменных в любом операторе программного текста
          • новые типы данных, такие, как long long int, булевый тип данных bool и тип complex для представления комплексных чисел; переменной длины;
          • поддержка ограниченных указателей (restrict);
          • именованная инициализация структур;
          • поддержка однострочных комментариев, начинающихся на //;
          • новые библиотечные функций, такие, как snprintf;
          • новые заголовочные файлы, такие, как stdint.h.
          • поддержка многопоточности;
          • улучшенная поддержка Юникода; и объединения;
          • управление выравниванием объектов;
          • статичные утверждения;
          • удаление опасной функции gets (в пользу безопасной gets_s);
          • функция quick_exit;
          • спецификатор функции _Noreturn;
          • новый режим эксклюзивного открытия файла.

          Введение в Си

          Язык программирования С отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, чтобы каждой элементарной составляющей программы после компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад к уже обработанному тексту. Поэтому использованию функций и переменных должно предшествовать их объявление. Код на С можно легко писать на низком уровне абстракции, почти как на ассемблере. С часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реальным устройствам. Однако, в строгой классификации, он является языком высокого уровня.

          С (как и ОС UNIX, с которой он долгое время был связан) создавался программистами и для программистов, круг которых был бы ненамного шире круга разработчиков языка. Несмотря на это, область использования языка значительно шире задач системного программирования.

          Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилам процедурного программирования, не добавляя на итоговый код программ лишних накладных расходов для компилятора, как это всегда делают языки очень высокого уровня. С этой стороны С предлагает следующие важные особенности:

          • простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами;
          • ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
          • систему типов, предохраняющую от бессмысленных операций;
          • использование препроцессора для, например, определения макросов и включения файлов с исходным кодом;
          • непосредственный доступ к памяти компьютера через использование указателей;
          • минимальное число ключевых слов;
          • передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей);
          • указатели на функции и статические переменные;
          • области действия имён;
          • структуры и объединения — определяемые пользователем собирательные типы данных, которыми можно манипулировать как одним целым;

          В то же время в С отсутствуют

          а также средства:

          После появления язык С был хорошо принят, потому что он позволял быстро создавать компиляторы для новых платформ, а также позволял программистам довольно точно представлять, как выполняются их программы. Благодаря этому программы, написанные на Си, эффективнее написанных на многих других языках.

          Одним из последствий высокой эффективности и переносимости С стало то, что многие компиляторы, интерпретаторы и библиотеки других языков высокого уровня часто написаны на языке Си.

          Элементы Си

          Типы данных

          В С имеются типы целых чисел различных размеров (short int, long int), со знаком (signed) и без (unsigned), чисел с плавающей запятой (float, double), символов, перечисляемых типов (enum), записей-структур (struct) и объединений (union).

          • целочисленные
          • вещественные
          • символьные
          • логические
          • массивы
          • строки
          • структуры и объединения
          • перечислимый тип

          В языке возможно преобразование типов, но оно не всегда происходит автоматически. Только некоторые типы числовых данных полностью совместимы друг с другом.

          Хранение данных

          В С есть три разных способа выделения памяти (классы памяти) для объектов:

          • Статическое выделение памяти: пространство для объектов создаётся в сегменте данных программы в момент компиляции.
          • Автоматическое выделение памяти: объекты можно хранить в стеке; эта память затем автоматически освобождается и может быть использована снова, после того, как программа выходит из блока, использующего его.
          • Динамическое выделение памяти: блоки памяти нужного размера могут запрашиваться во время выполнения программы с помощью библиотечных функций из области памяти, называемой кучей. Эти блоки освобождаются и могут быть использованы снова после вызова для них функции free .

          Все три этих способа хранения данных пригодны в различных ситуациях и имеют свои преимущества и недостатки. Например, статическое выделение памяти не имеет накладных расходов по выделению, автоматическое выделение — лишь малые расходы при выделении, а вот динамическое выделение потенциально требует больших расходов и на выделение, и на освобождение памяти. С другой стороны, память стека гораздо больше ограничена, чем статическая или память в куче. Только динамическая память может использоваться в случаях, когда размер используемых объектов заранее неизвестен. Большинство программ на С интенсивно используют все три этих способа.

          Там, где это возможно, предпочтительным является автоматическое или статическое выделение памяти: такой способ хранения объектов управляется компилятором, что освобождает программиста от трудностей ручного выделения и освобождения памяти, как правило, служащего источником трудно отыскиваемых ошибок утечек памяти и повторного освобождения в программе. Многие структуры данных имеют переменный размер во время выполнения программы, поэтому из-за того, что автоматически и статически выделенные области должны иметь известный фиксированный размер во время компиляции, очень часто требуется использовать динамическое выделение. Массивы переменного размера — самый распространённый пример такого использования памяти.

          Библиотеки

          В языке программирования Си, как основной метод расширения функционала, используются библиотеки. Библиотека - набор функций, "собранных в файл". Каждая библиотека имеет заголовочный файл, который содержит прототипы всех функций, типов данных конкретной библиотеки. Для использования библиотеки необходимо подключить заголовочный файл данной библиотеки, и тогда библиотека "сликуется" к программе.

          Примеры на Си

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

          Язык программирования Си многие новички считают устаревшим и ненужным, тогда как программисты со стажем полагают, что именно с него нужно начинать любое обучение в этой сфере. Мы же считаем, что обе стороны и правы, и не правы одновременно.

          Несмотря на свой возраст (язык придумали еще в 70-х годах), язык Си не утратил актуальности, однако число сфер его применения довольно ограничено. В нашей статье мы расскажем, какие особенности имеет данный язык, разберем его ключевые элементы и поговорим, где и как он может быть востребован сегодня.

          Ключевые характеристики языка программирования Си

          Пожалуй, ключевая характеристика языка программирования Си – его минималистичность. Авторы задумывали его, как простой инструмент для написания программ, которые будут легко компилироваться с использованием однопроходного компилятора. При этом чтобы в результате для каждого элемента программы было задействовано как можно меньше машинных команд, и чтобы примененные базовые составляющие языка никак не касались библиотеки времени выполнения.

          Суть работы однопроходного компилятора заключается в том, что он не возвращается к тексту, который уже прошел компиляцию. Поэтому сначала идет объявление функции, а затем уже следует ее использование. Код в языке программирования Си пишется примерно как на ассемблере, то есть, уровень абстракции довольно низкий.

          Ключевые характеристики языка программирования Си

          Ключевые характеристики языка программирования Си

          Итак, это язык сравнительно низкого уровня с небольшим (можно сказать) набором элементов, и выстраивать компиляторы Си относительно не сложно. Поэтому использовать его можно на очень разных платформах (в их количестве, пожалуй, все другие языки уступают данному). При этом тут есть возможность писать переносимые программы. А если они разработаны в соответствии со стандартом языка, то компилируется на любом компьютере.

          Ваш Путь в IT начинается здесь

          Подробнее

          По сути Си (вместе с ОС UNIX, они довольно долго использовались во взаимодействии) писался разработчиками как бы для самих себя и еще для довольно небольшого круга своих коллег, а между тем язык теперь применяется довольно широко, не только в системном программировании.

          Си разрабатывался в первую очередь для того, чтобы можно было легко и просто писать большие программы по всем правилам процедурного программирования и с наименьшим числом возможных ошибок. Важно еще было, чтобы в ходе работы компилятора с итоговым кодом не появлялись дополнительные расходы (как это происходит с Бейсиком и другими высокоуровневыми языками).

          Значимые отличительные черты языка программирования Си:

          • понятная языковая база, отдельные библиотеки с математическими функциями, с функциями управления файлами и т.п.;
          • направленность на процедурное программирование, что очень удобно с точки зрения использования структурного подхода к процессу программирования;
          • система типов, исключающая появление бессмысленных операций;
          • процессор задействуется для определения макросов, или, например, для запуска файлов, содержащих исходный код;
          • есть специальные указатели, дающие доступ к памяти компьютера;
          • ключевых слов – по минимуму;
          • параметры передаются в функцию по значению, не по ссылке. А для передачи по ссылке используются указатели;
          • указатели для функций и статических переменных. Благодаря этому доступно выполнение замыкания и простого полиморфизма;
          • обозначены области действия имен;
          • записями (имеются в виду собирательные типы данных, формируемые самим пользователем) можно управлять как единой структурой.

          Ниже перечислены особенности, которыми не обладает язык программирования Си (но в других языках они есть):

          • управление памятью в автоматическом режиме;
          • работа с объектно-ориентированным программированием. Тут стоит упомянуть, что код программы в первых версиях С++ генерировался именно на Си;
          • использование вложенных функций;
          • функции и операторы, работающие с разнотипными данными (полиморфизм);
          • многозадачность, поддержка сети.

          Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.

          Читайте также: