Розуміння типів даних, приведення типів та структур у C

1

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. Пропустіть один тип, і вся програма зламається. Зробите все правильно, і вона працюватиме швидко.