C (мова програмування)
C | |
---|---|
Парадигма | імперативна (процедурна) |
Дата появи | 1972 |
Творці | Денніс Рітчі |
Розробник | Денніс Рітчі та Bell Labs |
Система типізації | статична, слабка |
Основні реалізації | GCC, MSVC, Borland C, Watcom C |
Діалекти | «K&R» C (1978) ANSI C (1989) C90 (1990) C99 (1999) C11 (2011) |
Під впливом від | B (BCPL,CPL), Algol68, Assembler, Pascal, FORTRAN |
Вплинула на | awk, csh, C , Objective-C, BitC, D, Concurrent C, Java, Javascript, Python |
Операційна система | Windows і UNIX-подібні операційні системи |
Звичайні розширення файлів | .c або .h |
Вебсайт | iso.org/standard/74528.html |
C (укр. Сі) — універсальна, процедурна, імперативна мова програмування загального призначення, розроблена у 1972 році Деннісом Рітчі у Bell Telephone Laboratories з метою написання нею операційної системи UNIX[1].
Хоча С і було розроблено для написання системного програмного забезпечення[2], наразі вона досить часто використовується для написання прикладного програмного забезпечення.
С імовірно, є найпопулярнішою у світі мовою програмування за кількістю вже написаного нею програмного забезпечення, доступного під вільними ліцензіями коду та кількості програмістів, котрі її знають[3][4]. Версії компіляторів для мови С існують для багатьох операційних систем та апаратних архітектур. C здійснила великий вплив на інші мови програмування, особливо на C , яку спочатку проєктували як розширення для С, а також на Java та C#, які запозичили у С синтаксис.
В 2023 році, у категорії найпопулярніших мов програмування серед IT-спеціалістів згідно рейтингу IEEE Spectrum, який охоплював 59 мов програмування, топ-5 виглядав так: Python, Java, C , C, JavaScript[5].
С — мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише кілька інструкцій машинної мови для кожного елементу мови і не вимагати великої динамічної підтримки. У результаті код С придатний для більшості системного програмного забезпечення, яке традиційно писали асемблером.
Попри її низькорівневі можливості, мову проєктували для платформонезалежного програмування. Сумісна зі стандартами та платформонезалежна написана мовою C програма може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ — від вбудованих мікроконтролерів до суперкомп'ютерів.
Мову С проєктували з розрахунком на те, щоб використовувати у системному програмуванні. Отже, вона не вимагає додаткового часу на виконання перевірок різноманітних умов, які ніколи не відбудуться у правильно написаній програмі, а забезпечує простий, прямий доступ до адреси будь-якого об'єкта (наприклад, карти пам'яті, пристрою контролю регістрів), і її початковий код компілюється у послідовність примітивних машинних операцій.
Б'ярн Страуструп якось написав про неї: «С робить так, щоб вам було легко вистрілити собі в ногу»[6] Іншими словами, С дозволяє здійснення низки операцій, котрі часто є небажаними, а тому чимало помилок у коді не виявляє компілятор, і вони не можуть бути очевидними під час виконання. Якщо під час програмування та підтримки програмного забезпечення не дотримуватися низки суворих правил, пізніше може виникнути немало проблем зі швидкодією, стабільністю та безпекою програмного забезпечення. (Хоча, виною подібних проблем найчастіше є програмісти, бо С сама по собі забезпечує низький рівень захисту).
З часом було розроблено багато утиліт для додаткових перевірок коду на наявність помилок перед компіляцією та під час його роботи. Ніщо не заважає компіляторові здійснювати додаткові перевірки коду, не передбачені специфікацією мови, однак для деякого системного програмного забезпечення вони є неприпустимими, бо зменшують швидкість виконання коду.
У відповідь на критику мови C як сильно типізованої мови Керніган та Рітчі послалися на основу філософії дизайну C: «З усім тим, C зберігає основний принцип, який передбачає, що програмісти добре знають, що вони роблять, і вимагає лише, щоб вони чітко давали компіляторові знати про свої наміри»[7][8].
Як і більшість імперативних мов, заснованих на традиції АЛГОЛ, C має можливості для структурного програмування і дозволяє здійснювати рекурсії, у той час, як система статичної типізації даних запобігає виникненню багатьох непередбачуваних операцій. У С увесь виконуваний код міститься у функціях. Параметри функції завжди передаються за значеннями. Передача параметрів за вказівником реалізовується шляхом передачі значення вказівника. Гетерогенні сукупності типів даних (структури) дозволяють пов'язаним типам даних бути об'єднаними і маніпулювати ними, як єдиним цілим.
C також має такі специфічні властивості:
- змінні можуть бути прихованими у вкладених блоках
- слабка типізація; наприклад, символи можуть використовуватися, як цілі числа
- низькорівневий доступ до оперативної пам'яті шляхом перетворення машинних адрес на вказівники
- вказівники на функції і дані підтримують динамічний поліморфізм
- індексація масивів як вторинне поняття, визначається у термінах арифметики вказівників
- стандартизований препроцесор C для макроозначення, включення файлу з джерельним кодом, умовної трансляції тощо.
- відсутність вбудованих операторів вводу-виводу, потоків, обробки рядків і чисел з рухомою комою. Вся ця функціональність реалізується у бібліотеках виконання.
- відносно невелика кількість зарезервованих слів (32 у С89, і 37 у C99)
- Лексичні структури, які нагадують B більше за ALGOL, наприклад:
{ ... }
на відміну від ALGOL'івськогоbegin ... end
- знак рівності для призначення (копіювання), як це робиться у мові Fortran
- два знаки рівності використовуються для перевірки рівності (подібно до
.EQ.
у Fortran'і або одного знаку рівності у BASIC) &&
та||
на відміну від ALGOL'івськихand
таor
(цим вона семантично відрізняється від бітових операторів&
та|
).- велика кількість арифметичних і логічних операторів, на кшталт
=
,&=
,……
С має брак наступних можливостей, які є в інших мовах програмування, (хоча далеко не завжди брак деяких можливостей, наявних в якихось мовах, є недоліком):
- Відсутність нескалярних операцій, на зразок копіювання масивів або рядків.
- Відсутність автоматичного керування пам'яттю (збір сміття)
- Відсутня перевірка меж масиву
- Відсутність напівдинамічних масивів аж до С99
- Відсутність синтаксису для масивів, на зразок А..В, котрі використовують, як старіші, так і новіші мови програмування
- Відсутність вкладених функцій (хоча, ця можливість є з деякими компіляторами, наприклад GCC). Однак знову ж, є суперечливою сама потреба вкладених функцій.
- Відсутність обробки винятків
- Відсутність рудиментарної підтримки модульного програмування
- Відсутність статичного поліморфізму у формі перевантаження функцій або операторів
- Відсутність підтримки об'єктноорієнтованого програмування
- Відсутність вбудованої підтримки багатозадачності та роботи з мережами, хоча ці можливості забезпечуються популярними бібліотеками
- Відсутність стандартних бібліотек для роботи з графікою та деяких інших бібліотек для прикладного програмування
Ці моменти абсолютно не завадили мові бути добре прийнятою спеціалістами. Швидко були створені компілятори для різних платформ. А значною мірою низькорівнева природа мови, надала програмістам можливість якісно контролювати роботу програм, дозволяючи оптимізувати їх під конкретні завдання. Це дозволило кодові ефективно працювати на дуже обмеженому апаратному забезпеченні, такому як вбудовані системи, що сьогодні мають таку високу функціональність завдяки початковому використанню мови С.
Можливості мови підвищуються у спосіб використання сторонніх бібліотек. Більшість об'єктноорієнтованих функцій включають спеціальний вказівник «цей»(this у C , Java), який посилається на поточний об'єкт. Передаючи цей вказівник як аргумент функції у С, ті ж функціональні можливості можуть бути використані у С. Для прикладу, у C можна написати:
stack->push(val);
у той час, як у С це виглядало б, приміром, так:
push(stack, val);
де аргумент stack у С є вказівником на структуру (struct), що є еквівалентною цьому вказівнику у С , який є вказівником на об'єкт.
У мові використовуються всі символи латинської абетки, цифри та деякі спеціальні символи.
Символи латинської абетки |
|
Цифри | 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
|
Спеціальні символи | , (кома), ; ,. (крапка), , - , * , ^ , & (амперсанд), = , ~ (тильда), ! , / , < , > , ( , ) , { , } , [ , ] , | , % , ? , ' (апостроф), " (лапки), : (двокрапка), _ (знак підкреслення), \ , #
|
З допустимих символів формуються лексеми — ідентифікатори, ключові слова, літерали (константи), знаки операцій та інші роздільники.
Ключові слова — це слова, значення яких зарезервовано для деяких потреб компілятора.
Ключові слова | Призначення | Стандарт |
---|---|---|
sizeof
|
Отримання розміру об'єкта чи типа на етапі компіляції | C89 |
typedef
|
Завдання альтернативного імені типу | |
auto , register
|
Підказки компілятору щодо місця зберігання змінних | |
extern
|
Вказівка компілятору шукати об'єкт поза поточним файлом | |
static
|
Оголошення статичного об'єкта | |
void
|
Маркер відсутності значення; у покажчиках означає довільні дані | |
char , short ,int , long
|
Цілочисленні типи та модифікатори їхнього розміру | |
signed , unsigned
|
Модифікатори цілих типів, що визначають їх як знакові чи беззнакові | |
float , double
|
Дійсні типи даних | |
const
|
Модифікатор, що унеможливлює зміну деякого значення | |
volatile
|
Вказівка компілятору на можливість зміни значення змінної ззовні | |
struct
|
Тип даних — структура з набором полів | |
enum
|
Тип даних, що зберігає одне з набору цілих значень | |
union
|
Тип даних, у якому можна зберігати дані одного з декількох обраних типів | |
do , for , while
|
Оператори циклу | |
if , else
|
Умовний оператор | |
switch , case , default
|
Оператор вибору за цілим параметром | |
break , continue
|
Оператори переривання циклу | |
goto
|
Оператор безумовного переходу | |
return
|
Повернення з функції | |
inline
|
Оголошення вбудовуваної функції | C99 |
restrict
|
Оголошення покажчика, який посилається на блок пам'яті, на який не посилається ніякий інший покажчик | |
_Bool [a]
|
Логічний тип даних | |
_Complex [b], _Imaginary [c]
|
Типи, використовувані у обчисленнях з комплексними числами | |
_Atomic
|
Модифікатор типу, який робить його атомарним | C11 |
_Alignas [d]
|
Явне завдання вирівнювання в байтах для даних | |
_Alignof [e]
|
Отримання вирівнювання для заданого типу даних на етапі компіляції | |
_Generic
|
Вибір одного з набору значень на етапі компіляції, виходячи з контрольованого типу даних | |
_Noreturn [f]
|
Вказівка компілятору, що функція неспроможна завершуватися нормально (тобто за допомогою оператора return )
| |
_Static_assert [g]
|
Вказівка тверджень, які перевіряються на етапі компіляції | |
_Thread_local [h]
|
Оголошення локальної для потоку змінної |
Початковий етап розробки Сі відбувся у стінах Bell Labs між 1969 та 1973 роками; Деніс Рітчі стверджує, що найбільш творчим був 1972 рік. Мову було названо «Сі» через те, що багато її можливостей було отримано від раніше створеної мови B.
Існує чимало легенд щодо походження мови Сі, і пов'язаної з нею операційної системи UNIX, серед них:
- Розробка Сі стала результатом того, що його майбутні автори любили комп'ютерну гру, схожу на популярну гру Asteroids (Астероїди). Вони вже давно грали у неї на головному сервері компанії, який був недостатньо потужним, і повинен був обслуговувати близько ста користувачів. Томпсон і Рітчі вирішилили, що їм не вистачає контролю над космічним кораблем для того, щоб уникати зіткнень з деякими каменями. Тому вони вирішили перенести гру на вільний PDP-7, що стоїть в офісі. Проте цей комп'ютер не мав операційної системи, що змусило їх її написати. Врешті-решт, вони вирішили перенести цю операційну систему ще й на офісний PDP-11, що було дуже важко, оскільки її код був цілком написаний на асемблері. Було винесено пропозицію використати якусь високорівневу портативну мову, щоб можна було легко переносити ОС з одного комп'ютера на іншій. Мова B, яку вони спершу хотіли використати, виявилася позбавленою функціональності, здатної використовувати нові можливості PDP-11. Тому вони й зупинилися на розробці мови С.
- Найперший комп'ютер, для якого була спочатку написана UNIX, призначався для створення системи автоматичного заповнення документів. Перша версія UNIX була написана на асемблері. Пізніше для того, щоб переписати цю операційну систему, була розроблена мова С.
До 1974 року мова С стала достатньо функціональною для того, щоб переписати на ній більшу частину ядра UNIX, котре спершу було написане на асемблері PDP-11. Це було перше ядро операційної системи реалізоване не на асемблері.
У 1978 році Браян Керніган та Денніс Рітчі опублікували першу редакцію книги «Мова програмування Сі». Ця книга, відома серед програмістів як «K&R». Описану у ній версію мови Сі, часто називають «K&R». Друга редакція цієї книги присвячена пізнішому стандарту ANSI C, описаному нижче.
K&R описує такі особливості мови:
- Тип даних
struct
- Тип даних
long int
- Тип даних
unsigned int
- Оператор
=-
було змінено на-=
, щоби позбутися семантичної двозначності створюваної конструкціями, на зразокi=-10
, яка могла інтерпретуватися, якi =- 10
абоi = -10
K&R часто вважають найголовнішою частиною мови, яку повинен підтримувати компілятор С. Багато років, навіть після виходу ANSI C, він вважався мінімальним рівнем, якого слід було дотримуватися програмістам, охочим добитися від своїх програм максимальної портативності, оскільки не всі компілятори тоді підтримували ANSI C, а код на K&R C був сумісним і з ANSI C.
У ранніх версіях C, лише функції, що повертають значення з типом відмінним від int повинні були бути оголошеними, якщо вони використовувалися перед визначенням функції; функції без попереднього оголошення повинні повертати лише ціле число.
Для прикладу:
long int SomeFunction();
int OtherFunction();
int CallingFunction()
{
long int test1;
int test2;
test1 = SomeFunction();
if (test1 > 0) test2 = 0;
else test2 = OtherFunction();
return test2;
}
У цьому прикладі, як SomeFunction, так і OtherFunction були оголошені перед своїм використанням. У K&R оголошенням OtherFunction можна було знехтувати.
Оскільки декларація функцій у K&R C не включає ніякої інформації про аргументи функції, перевірка типу параметрів не виконується, хоча деякі компілятори видають попереджувальне повідомлення, якщо до локальної функції звертаються із неправильним числом аргументів, або якщо багаторазові виклики до зовнішньої функції використовують різну кількість аргументів.
Наступні декілька років після публікації K&R C, до мови було додано декілька неофіційних можливостей (у той час, як офіційного нового стандарту не було), котрі підтримувалися компіляторами від AT&T та деяких інших постачальників. Серед них:
- функції з типом результату void;
- функції, що повертають значення типу struct або union (а не вказівник)
- присвоєння для типу struct
- Визначник const, котрий робив об'єкт доступним лише для читання
- Перелічувані типи даних
Велика кількість доповнень і відсутність стандартної бібліотеки, разом із великою популярністю мови, створили нагальну потребу у стандартизації.
Наприкінці 1970-х, мова C випередила BASIC, і стала найпопулярнішою мовою програмування для мікрокомп'ютерів. Протягом 1980-х, її прийняли для використання в IBM PC, і її популярність почала зростати досить стрімкими темпами. Разом з тим, Б'ярн Страуструп та інші працівники Bell Labs розпочали роботу над доданням об'єктноорієнтованих конструкцій до C, що призвело до виникнення C .
У 1983, Американський Національний Інститут Стандартів (ANSI) сформував комітет X3J11 для створення стандартної специфікації для мови C. У 1989, стандарт був ратифікований як ANSI X3.159-1989 «Мова Програмування C». Цю версію часто називають ANSI C, Стандартний C, або С89.
У 1990, стандарт (з декількома незначними модифікаціями) ANSI C ратифікувала Міжнародна Організація із Стандартизації (ISO), ISO/IEC 9899:1990. Цю версію іноді називають C90. Тому, терміни «C89» і «C90» по суті, позначають одну мову.
ANSI, як і інші інститути із стандартизації, більше самотужки не займається розвитком стандарту мови програмування С. Прийняття стандарту національними інститутами, як правило, відбувається протягом року після публікації стандарту ANSI.
Одна з цілей процесу стандартизації мови С полягала у розробці надмножини над K&R C, яка включала б чимало неофіційних можливостей. Комітети зі стандартизації також додали чимало додаткових функцій, як то прототипи функцій (запозичені в C ), вказівники void, підтримку міжнародних наборів символів та мов і локалей, а також низку розширень для препроцесора. Синтаксис декларації параметрів також було розширено використовуючи запозичення з С , хоча, інтерфейс K&R також допускається для збереження зворотної сумісності зі старим кодом.
C89 наразі підтримується усіма компіляторами С, і більшість теперішнього коду написано на базі даного стандарту. Будь-яка програма написана на стандартній С, і без використання апаратно залежних засобів може бути скомпільована і запущена на будь-якій операційній системі та апаратній архітектурі без будь-яких обмежень ресурсів.
Після процесу стандартизації ANSI, специфікація мови C протягом якогось часу залишилася відносно статичною, тоді як C продовжувала еволюціонувати, значною мірою завдяки своїм власним зусиллям зі стандартизації. Нормативна Поправка 1, створила новий стандарт для мови C у 1995 (ISO/IEC 9899/AMD1:1995, неформально відомий як C95)[9], але лише для того, щоб виправити деякі деталі стандарту C89 і додати просторішу підтримку міжнародних наборів символів. Проте, стандарт знову переглянули, опублікувавши версію ISO 9899:1999 у 1999 році. Цей стандарт зазвичай називають «C99». Він був прийнятий, як стандарт ANSI у березні 2000.
Стандарт C99 ввів декілька нових особливостей, багато з яких вже були реалізовані у декількох компіляторах:
- Вкладені функції
- Змінні можуть оголошуватися будь-де (як у C )
- Введено декілька нових типів даних, зокрема, long long int, явний логічний (булевий) тип даних, і комплексний тип для представлення комплексних чисел
- Масиви зі змінними довжинами
- Підтримка коротких, однорядкових коментарів, що починаються з
//
, як у BCPL та C - Нові бібліотечні функції, як наприклад
sprintf
- Нові заголовні файли, як то
stdbool.h
таinttypes.h
- Вдосконалена підтримка стандарту IEEE для роботи з рухомою комою
- Виправлено друкарські огріхи.
C99 сумісний з C90, однак, має деякі відмінності; зокрема, якщо в декларації
ідентифікатора не вистачає специфікатора типу, змінна чи функція надалі не сприймається оголошеною неявно як int
. Комітет стандартів вирішив, що важливіше, щоби компілятори діагностували неуважне упущення специфікатора типу, ніж мовчки обробляли код. На практиці, компілятори, ймовірно, діагностують упущення, але й приймають змінну оголошеною як int і продовжують переклад програми.
GNU Compiler Collection та інші[які?] компілятори C підтримують багато з нових можливостей C99. Проте, вони меншою мірою[коли?] підтримуються компіляторами таких компаній, як Microsoft і Borland, котрі зосередилися переважно на C , відтоді, як C забезпечує подібну функціональність.
Міжнародна організація зі стандартизації (ISO) у грудні 2011 опублікувала оновлений варіант стандарту для мови Сі — ISO/IEC 9899:2011,[10] що був створений під кодовим ім'ям C1X і прийшов на зміну стандарту C99. Оскільки стандарт розвивався досить тривалий час, пройшовши стадії випуску декількох чорнових редакцій, сучасні компілятори, такі як GCC 4.6 і LLVM 3.0, уже підтримують більшість описаних у специфікації можливостей.
У новій специфікації збільшена сумісність з мовою С і представлені деякі нові можливості, такі як
- підтримка багатонитковості,
- підтримка Unicode,
- вилучено функцію gets,
- інтерфейс для перевірки допустимих меж і діапазонів значень,
- анонімні структури та об'єднання (наприклад, можна вкласти блок union в struct),
- додаткова функція для миттєвого виходу з програми quick_exit,
- статичні твердження (Static assertions),
- залучення додаткових макросів для перевірки чисел з рухомою комою.
Фінальний текст стандарту не доступний для вільного завантаження (тільки платне завантаження), але можна завантажити останню чорнову редакцію (PDF, 3.6 Мб, 701 стор.) [Архівовано 25 грудня 2021 у Wayback Machine.], яка майже не відрізняється від затвердженої специфікації.
Одним із наслідків значного поширення та ефективності С є те, що компілятори, бібліотеки та інтерпретатори багатьох інших високорівневих мов програмування реалізуються на С.
С використовується як проміжна мова деякими високорівневими мовами програмування. Це здійснюється одним із двох наступних способів:
- Продукується текст програми мовою C паралельно з іншим вихідним кодом: машинним, об'єктним та/або двійковим. Наприклад, така поведінка характерна для деяких діалектів мови Lisp (Lush).
- Продукується виключно текст на С. Приклади: Eiffel[11], Sather, Esterel.
Вихідний текст програми на С передається компілятору С, який видає кінцевий машинний або двійковий код. Це зроблено задля платформонезалежності (компілятори мови С існують майже для усіх платформ) і уникання необхідності розвитку специфічних для машини генераторів команд.
Завдяки величезній популярності мови програмування C, останні стандарти мови Фортран ввели механізм сумісності, що дозволяє просту і стандартизовану взаємодію між програмами на Фортран та C. Сумісність досягається на майже усіх основних рівнях: вбудованих і похідних типів, вказівників, змінних, функцій та процедур.
Мова програмування С використовує бібліотеки, як основний засіб свого розширення. У С, бібліотека — набір функцій, котрі містяться в одному файлі. Кожна бібліотека зазвичай має заголовний файл, в якому містяться прототипи функцій, присутніх у бібліотеці, а також декларації спеціальних типів даних і макросимволів, що використовують ці функції. Для того, щоб програма використовувала бібліотеку, заголовний файл цієї бібліотеки має бути оголошений вгорі файлу із сирцевим кодом, і бібліотека має бути злінкованою з програмою, що у багатьох випадках вимагає спеціальної опції для компілятора (наприклад, -lmath).
Загальною бібліотекою С є стандартна бібліотека С stdlib.h, що вказана в ISO та ANSI C стандартах, і розповсюджується з кожним сучасним компілятором мови С.
Іншим загальним набором функцій стандартної бібліотеки С є той, що використовується застосунками. Проєктувалися вони для UNIX-подібних систем, у першу чергу, для забезпечення інтерфейсу до ядра. Ці функції деталізуються у різноманітних стандартах, на кшталт POSIX та Single UNIX Specification.
Відтоді, як С набула великої популярності, для неї було написано чимало інших бібліотек. Бібліотеки часто пишуться на С, оскільки компілятори C генерують ефективний об'єктний код; пізніше програмісти створюють інтерфейси до бібліотек таким чином, що ті можуть використовуватися високорівневими мовами, на кшталт Java, Perl та Python.
Попри її велику популярність, С часто критикується. В основному критика зосереджена на тому, що, використовуючи C, важко здійснити деякі бажані дії, і на тому, що, використовуючи C, дуже легко здійснити деякі небажані дії. Коротко кажучи, ефективне використання С вимагає від програміста більше навичок, досвіду та зусиль, ніж це потрібно для деяких інших мов програмування.
Коли об'єктноорієнтовані мови стали популярними, C і Objective-C були двома різними продовженнями C, які забезпечували об'єктноорієнтовані можливості. Обидві мови спочатку функціонували, як препроцесори — написаний на них код спочатку переводився на C, а потім компілювався компілятором C.
Мову програмування C , розроблену на основі С, було отримано унаслідок додавання Б'ярном Страуструпом до неї об'єктноорієнтованої функціональності із C-подібним синтаксисом.
Objective-C — дуже «тонка» надбудова над С, яка дозволяє об'єктноорієнтоване програмування використовуючи гібрид динамічної/статичної парадигми типів. Основу синтаксису Objective-C склав синтаксис мови С, однак, синтаксис для його об'єктноорієнтованих можливостей був запозичений у Smalltalk. Objective-C та C відрізняються своєю філософією — для більшої інформації, читайте відповідні статті.
Мова програмування C# заснована на строгій компонентній архітектурі і реалізує передові механізми забезпечення безпеки коду. C# об'єднала найкращі риси цілого ряду попередників.
- ↑ Макрос
bool
із заголовного файлуstdbool.h
є обгорткою над ключовим словом_Bool
. - ↑ Макрос
complex
із заголовного файлуcomplex.h
є обгорткою над ключовим словом_Complex
. - ↑ Макрос
imaginary
із заголовного файлуcomplex.h
є обгорткою над ключовим словом_Imaginary
. - ↑ Макрос
alignas
із заголовного файлуstdalign.h
є обгорткою над ключовим словом_Alignas
. - ↑ Макрос
alignof
із заголовного файлуstdalign.h
є обгорткою над ключовим словом_Alignof
. - ↑ Макрос
noreturn
із заголовного файлуstdnoreturn.h
є обгорткою над ключовим словом_Noreturn
. - ↑ Макрос
static_assert
із заголовного файлуassert.h
є обгорткою над ключовим словом_Static_assert
. - ↑ Макрос
thread_local
із заголовного файлуthreads.h
є обгорткою над ключовим словом_Thread_local
.
- ↑ Stewart, Bill (7 січня 2000). History of the C Programming Language. Living Internet. Архів оригіналу за 22 червня 2013. Процитовано 31 жовтня 2006.
- ↑ Patricia K. Lawlis, c.j. kemp systems, inc. (1997). Guidelines for Choosing a Computer Language: Support for the Visionary Organization. Ada Information Clearinghouse. Архів оригіналу за 22 червня 2013. Процитовано 18 липня 2006.
- ↑ Programming Language Popularity. 2009. Архів оригіналу за 27 травня 2012. Процитовано 16 січня 2009.
- ↑ TIOBE Programming Community Index. 2009. Архів оригіналу за 22 червня 2013. Процитовано 16 січня 2009.
- ↑ IEEE Spectrum опублікувала рейтинг найпопулярніших мов програмування 2023 року. // Автор: Артем Житкевич. 30.08.2023
- ↑ Bjarne Stroustrup. FAQ (англ.). Архів оригіналу за 17 червня 2008. Процитовано 8 січня 2009.
- ↑ Ritchie, Dennis. The Development of the C Language. Архів оригіналу за 22 червня 2013. Процитовано 26 липня 2006.
- ↑ Brian W. Kernighan and Dennis M. Ritchie: The C Programming Language, 2nd ed., Prentice Hall, 1988, c. 3
- ↑ ISO/IEC 9899:1990/Amd 1:1995. ISO (англ.). Процитовано 23 лютого 2024.
- ↑ Опубликован новый международный стандарт для языка Си (C1X/C11). Архів оригіналу за 7 січня 2012. Процитовано 22 грудня 2011.
- ↑ Eiffel Language. Eiffel Software - The Home of EiffelStudio. Процитовано 23 лютого 2024.
- Сі // Універсальний словник-енциклопедія. — 4-те вид. — К. : Тека, 2006.