Елементи мови Сі
Історія виникнення
Трохи про історію виникнення мов програмування, та мови Сі зокрема. У 1949 році у Філадельфії (США) під керівництвом Джона Мочлі був створений "Стислий код" - перший примітивний інтерпретатор мови програмування. У 1951 році у фірмі Remington Rand американська програмістка Грейс Хоппер розробила першу транслюючи програму, що називалася компілятором (compiler - компоновщик). У 1957 році у штаб-квартирі фірми IBM на Медісон-авеню у Нью-Йорку з'явилася перша повна мова Фортран (FORmula TRANslation - трансляція формул). Групою розробників керував тоді відомий 30-річний математик Джон Бекус. Фортран - це перша із "дійсних" мов високого рівня.
Далі, у 1972 році 31-літній фахівець із системного програмування фірми Bell Labs Денніс Рітчі розробив мову програмування Сі. У 1984 році французький математик та саксофоніст Филип Кан засновує фірму Borland International. Далі з'явився діалект мови Сі фірми Borland.
На початку Сі була розроблена як мова для програмування в операційній системі Unix. Незабаром він став поширюватися для програмістів-практиків. Наприкінці 70-х були розроблені транслятори Сі для мікроЕОМ операційної системи СР/M. Після появи IBM PC стали з'являтися і компілятори мови Сі (для таких комп'ютерів їх зараз декілька десятків). У 1983 р. американський Інститут Стандартів (ANSI) сформував Технічний Комітет X3J11 для створення стандарту мови Сі. На сьогодні мова Сі++, що з'явилася як послідовник Сі, підпорядковується більшості вимог стандарту.
За своїм змістом Сі, перш за все, є мовою функцій. Програмування на Сі здійснюється шляхом опису функцій і звертання до бібліотек (бібліотечних функцій). Більшість функцій повертають деякі значення, що можуть використовуватися в інших операторах.
Серед переваг мови Сі потрібно відзначити основні:
• універсальність (використовується майже на всіх існуючих ЕОМ);
• компактність та універсальність коду;
• швидкість виконання програм;
• гнучкість мови;
• висока структурованість.
Будь-яка мова (українська, російська, англійська, французька та інші) складається з декількох основних елементів - символів, слів, словосполучень і речень. В алгоритмічних мовах програмування існують аналогічні структурні елементи, тільки слова називають лексемами, словосполучення - виразами, а речення - операторами.
Лексеми в свою чергу утворюються із символів, вирази - із лексем і символів, оператори - із символів, лексем і виразів.
• Алфавіт мови, або її символи - це основні неподільні знаки, за допомогою яких пишуться всі тексти на мові програмування.
• Лексема, або елементарна конструкція - мінімальна одиниця мови, яка має самостійний зміст.
• Вираз задає правило обчислення деякого значення.
• Оператор задає кінцевий опис деякої дії.
1.2.1 Алфавіт
Алфавіт мови Сі включає :
• великі та малі літери латинської абетки;
• арабські цифри;
• пробільні символи : пробіл, символи табуляції, символ переходу на наступний рядок тощо;
• символи , . ; : ? ' ! | / \ ~ ( ) [ ] { } < > # % ^ & - + * =
1.2.2 Ідентифікатори
Ідентифікатори використовуються для іменування різних об'єктів : змінних, констант, міток, функцій тощо. При записі ідентифікаторів можуть використовуватися великі та малі літери латинської абетки, арабські цифри та символ підкреслення. Ідентифікатор не може починатися з цифри і не може містити пробілів.
Компілятор мови Сі розглядає літери верхнього та нижнього регістрів як різні символи. Тому можна створювати ідентифікатори, які співпадають орфографічно, але відрізняються регістром літер. Наприклад, кожний з наступних ідентифікаторів унікальний :
Sum sum sUm SUM sUM
Слід також пам'ятати, що ідентифікатори не повинні співпадати з ключовими словами.
1.2.3 Константи
Константами називають сталі величини, тобто такі, які в процесі виконання програми не змінюються. В мові Сі існує чотири типи констант : цілі, дійсні, рядкові та символьні.
1. Цілі константи можуть бути десятковими, вісімковими або шістнадцятковими.
Десяткова константа - послідовність десяткових цифр (від 0 до 9), яка починається не з нуля якщо це число не нуль. Приклади десяткових констант : 10, 132, 1024.
Вісімкові константи починаються з символу 0, після якого розміщуються вісімкові цифри (від 0 до 7). Наприклад : 023. Запис константи вигляду 08 буде сприйматися компілятором як помилка, так як 8 не є вісімковою цифрою.
Шістнадцяткові константи починаються з символів 0х або 0Х, після яких розміщуються шістнадцяткові цифри (від 0 до F, можна записувати їх у верхньому чи нижньому регістрах). Наприклад : 0ХF123.
2. Дійсні константи складаються з цілої частини, десяткової крапки, дробової частини, символу експоненти (e чи E) та показника степеня. Дійсні константи мають наступний формат представлення :
[ ціла_частина ][ . дробова_частина ][ Е [-] степінь ]
У записі константи можуть бути опущені ціла чи дробова частини (але не обидві разом), десяткова крапка з дробовою частиною чи символ E (e) з показником степеня (але не разом). Приклади дійсних констант : 2.2 , 220е-2, 22.Е-1, .22Е1.
Якщо потрібно сформувати від'ємну цілу або дійсну константу, то перед константою необхідно поставити знак унарного мінуса.
3. Символьні константи. Символьна константа - це один або декілька символів, які заключені в апострофи. Якщо константа складається з одного символу, вона займає в пам'яті 1 байт (тип char). Двосимвольні константи займають в пам'яті відповідно 2 байти (тип int).
Послідовності символів, які починаються з символу \ (обернений слеш) називаються керуючими або escape-послідовностями (таблиця 1.1).
Таблиця 1.1. Escape-послідовності |
Спеціальний символ | Шістнадцятковий код | Значення |
\a | звуковий сигнал | |
\b | повернення на 1 символ | |
\f | 0C | переведення сторінки |
\n | 0A | перехід на наступний рядок |
\r | 0D | повернення каретки |
\t | горизонтальна табуляція | |
\v | 0B | вертикальна табуляція |
\\ | 5C | символ \ |
\' | символ ' | |
\" | символ " | |
\? | 3F | символ ? |
\0 | нульовий символ | |
\0ddd | - | вісімковий код символу |
\0xddd | ddd | шістнадцятковий код символу |
4. Рядкові константи записуються як послідовності символів, заключених в подвійні лапки.
"Це рядковий літерал!\n"
Для формування рядкових констант, які займають декілька рядків тексту програми використовується символ \ (обернений слеш):
"Довгі рядки можна розбивати на \
частини"
Загальна форма визначення іменованої константи має вигляд :
const тип ім'я = значення ;
Модифікатор const попереджує будь-які присвоювання даному об'єкту, а також інші дії, що можуть вплинути на зміну значення. Наприклад:
const float pi = 3.14l5926;
const maxint = 32767;
char *const str="Hello,P...!"; /* покажчик-константа */
char const *str2= "Hello!"; /* покажчик на константу */
Використання одного лише модифікатору const еквівалентно const int.
1.2.4 Коментарі
Текст на Сі, що міститься у дужках /* та */ ігноруватиметься компілятором, тобто вважатиметься коментарем до програми. Такі коментарі можуть розміщуватися в будь-якому місці програми.
Коментарі здебільшого використовуються для "документування програм" та під час їх відлагодження. В програму бажано вміщувати текст, що хоч якось пояснює її роботу та призначення. Проте не слід надто зловживати коментарями, а використовувати більш розумні форми найменування змінних, констант, функцій тощо. Якщо, наприклад, функція матиме назву add_matrix, очевидно не зовсім раціональним буде включення у програму після її заголовної частини коментар про те, що:
/*функція обчислює cуму матриць */
У цьому випадку ім'я функції пояснює її призначення. У більш сучасних версіях Сі широко застосовується так званий угорський запис імен, коли ім'я змінної містить в собі інформацію про її призначення і тип.
1.2.5 Ключові слова
Ключові слова - це зарезервовані ідентифікатори, які мають спеціальне значення для компілятора. Їх використання суворо регламентоване. Імена змінних, констант, міток, типів тощо не можуть співпадати з ключовими словами.
Наводимо перелік ключових слів мови Сі :
auto | continue | float | interrupt | short | unsigned |
asm | default | for | long | signed | void |
break | do | far | near | sizeof | volatile |
case | double | goto | pascal | static | while |
cdecl | else | huge | switch | struct | |
char | enum | if | register | typedef | |
const | extern | int | return | union |