C суворо контролює те, що зберігається у пам’яті. Він не здогадується. Ви повинні точно вказати, які дані ви зберігаєте. Це не просто прискіпливість. Це впливає на те, як працює ваша програма, скільки пам’яті вона використовує і чи будуть ваші обчислення коректними чи безглуздими.
Стандартні типи змінних
У C є три стандартні типи змінних.
Ціле число: int
Це 4-байтове ціле число. Воно працює з цілими числами.
Кількість з плаваючою точкою: float
Це 4-байтове число з плаваючою точкою. Воно працює з десятковими дробами.
Символ: char
Це один-байтовий одиночний символ. Наприклад, “a” або “3”. Рядок у C – це просто масив таких символів.
Потім є похідні типи. Їх використовують, коли трьох стандартних типів недостатньо.
double: 8-байтове число з плаваючою точкою. Вища точність.short: 2-байтове ціле число. Менше пам’яті, менший діапазон значень.unsigned shortабоunsigned int: Ці типи працюють тільки з позитивними цілими числами. Без битого знака. Якщо вам потрібно відстежувати кількість населення або розміри пакетів, це часто є правильним вибором.
Оператори та пріоритет операторів
Оператори C виглядають звично.
+додавання-віднімання/розподіл*множення%залишок від розподілу
Але будьте обережні з поділом. Оператор / виконує цілий поділ, якщо обидва операнда є цілими числами. Інакше виконується поділ із плаваючою точкою.
Подивіться цей код:
`
Він виводить значення з плаваючою точкою, тому що a оголошений як тип float. Але значення a дорівнюватиме 3.0. Чому? Тому що код спочатку виконав цілий поділ. 10, ділене на 3, дорівнює 3. Результат дорівнює 3. Потім це 3 перетворюється на 3.0 за збереження в a. Точність була втрачена ще до того, як значення потрапило до змінної.
Пріоритет операторів у C дотримується стандартних правил. Множення та розподіл виконуються перед складанням та відніманням.
Результат вираження 5+3*4 дорівнює 17. А не 32. Оператор * має більш високий пріоритет, ніж +. Ви можете перевизначити це за допомогою дужок. (5+3)*4 дорівнює 32. Спочатку обчислюється 5+3.
Пріоритет стає заплутаним пізніше. Коли з’являються покажчики, все ускладнюється. Але поки що пам’ятайте: множте і діліть перед тим, як складати і віднімати.
Приведення типів (Typecasting)
C дозволяє перетворювати типи на льоту. Це часто робиться із вказівниками. Також воно відбувається автоматично при присвоєнні певних типів.
У наведеному вище прикладі цілий результат 10/3 був автоматично перетворений на float. Але що, якщо вам потрібна дрібна частина?
Приведення типів виконується шляхом розміщення імені типу у дужках перед значенням.
Замініть a=10/3; на a=(float)10/3;.
Тепер a дорівнює 3.33333. Число 10 перетворюється на число з плаваючою точкою до розподілу. Поділ відбувається у тих чисел з плаваючою точкою. Результат зберігає свої десяткові розряди.
typedef
Ви можете оголошувати іменовані типи, що визначаються користувачем, C за допомогою оператора typedef. Це поширене в коді на C.
`
Це дозволяє оголошувати логічні типи (Boolean). У старих стандартах C немає вбудованого типу bool, тому це обхідний шлях.
Якщо вам не подобається слово “float”, ви можете написати:
`
Потім пізніше:
`
Розміщуйте інструкції typedef у будь-якому місці програми. Просто переконайтеся, що вони перед першим використанням.
Структури
Структури C групують змінні в один пакет.
`
Щоразу, коли ви хочете оголосити структуру типу rec, ви повинні писати struct rec. Це легко забути. Якщо ви опустите слово struct, компілятор видасть помилки.
Ви можете скоротити код:
`
Тут оголошення типу та змінна r оголошуються в одному операторі.
Або використовуйте typedef для імені структури. Якщо вам набридло щоразу писати struct rec r :
`
Потім оголошуйте записи, вказуючи:
`
Звертайтеся до полів за допомогою точки. r.a = 5;.
Масиви
Масиви оголошуються шляхом вказівки розміру після звичайного оголошення.
`
Масиви є безперервними блоками пам’яті. Доступ до індексу за межами допустимого діапазону є невизначеною поведінкою. Програма може завершитись з помилкою. Дані можуть бути пошкоджені. Може здатися, що все працює, поки раптом не перестане.
Інкремент та декремент
C є скорочення для поширених операцій.
i = i + 1;стаєi++;i = i - 1;стаєi--;i=i+3;стаєi+=3;i=i*j;стаєi*=j;
Це не просто синтаксичний цукор. Вони часто компілюються в ефективніший машинний код. Використовуйте їх.
Помилки в C, яких слід уникати
Оператор / із двома цілими числами – це пастка. Він відкидає десяткову частину. Завжди перевіряйте свої типи перед поділом. Якщо вам потрібна точність, спочатку приведіть один з операндів до float або double.
Думайте про це щоразу, коли використовуєте цей оператор. А якщо ні, то ваші числа будуть невірними. А налагодження проблем, пов’язаних з цілим розподілом, — це болісно.
Спробуйте самі
- Експериментуйте з наведенням типів. Спробуйте
int,char,float. Подивіться, що відбувається, коли ви змішуєте їх. - Створіть масив записів. Напишіть код для сортування цього масиву по одному цілому полю. Це навчить вас працювати з покажчиками, компонуванням пам’яті та керуванням потоком виконання.
Деталі мають значення C. Пропустіть один тип, і вся програма зламається. Зробите все правильно, і вона працюватиме швидко.














































