
- •1 Основні елементи мови с
- •1.1 Алфавіт мови програмування
- •1.2 Лексеми
- •1.3 Ключові слова
- •1.4 Ідентифікатори
- •1.5 Класифікація типів даних
- •1.6 Літерали
- •1.7 Оператори
- •1.8 Коментарі
- •1.9 Директиви препроцесора
- •1.10 Організація програми
- •2 Операції та вирази
- •2.1 Загальні відомості
- •2.2 Арифметичні операції
- •2.3 Операції приведення типів
- •2.4 Операції присвоєння
- •2.5 Операції інкремента і декремента
- •2.6 Операції порівняння
- •2.7 Операції зсуву
- •2.8 Порозрядні операції
- •2.9 Логічні операції
- •2.10 Операція sizeof
- •2.11 Операція послідовного обчислення
- •2.12 Операція умови (?:)
- •2.13 Адресні операції
- •3 Прості типи даних
- •3.1 Оголошення змінних
- •3.2 Час існування та область видимості змінних
- •3.3 Цілі типи даних
- •3.4 Дійсні типи даних
- •4 Оператори керування
- •4.1 Оператор розгалуження if
- •4.2 Оператор розгалуження if-else
- •4.3 Оператор множинного розгалуження switch
- •4.4 Оператор циклу for
- •4.5 Оператор циклу while
- •4.6 Оператор циклу do while
- •4.7 Оператор break
- •4.8 Оператор continue
- •5 Функції
- •5.1 Основні поняття
- •5.2 Види виклику функцій
- •5.3 Область видимості
- •5.4 Порожній тип void
- •5.5 Передача аргументів у функцію
- •5.6 Рекурсивні функції
- •5.7 Прототипи функцій
- •6 Покажчики
- •6.1 Визначення та ініціалізація покажчиків
- •6.2 Визначення покажчиків
- •6.3 Масиви
- •6.4 Операції порівняння
- •6.5 Копіювання рядка
- •6.6 Покажчики на функцію
- •6.7 Покажчики на void
- •6.8 Арифметика покажчиків
- •7 Масиви
- •7.1 Загальні поняття
- •7.2 Одновимірні масиви
- •7.3 Багатовимірні масиви
- •8 Рядки в с
- •8.1 Рядки
- •8.2.Створення рядків
- •8.3 Прототипи
- •8.3 Функції перетворення буферів
- •8.4 Функції перевірки літер
- •8.5 Операції з рядками
- •9 Структури, об’єднання, перерахування
- •9.1 Структури
- •9.2 Бітові поля
- •9.3 Ключове слово typedef
- •9.4 Об’єднання
- •9.5 Перераховуваний тип
- •10 Введення та виведення даних
- •10.1 Функція виведення printf
- •10.2Функція введення scanf
- •10.3 Введення та виведення у файл
- •11 Динамічне виділення пам'яті
2.2 Арифметичні операції
До арифметичних операцій відносяться операції додавання (+), віднімання (-), множення (*), ділення (/) і визначення залишку від ділення (%).
Типи операндів арифметичних операцій, крім операції (%), можуть відрізнятися, і для них справедливі правила перетворення типів.
Операндами операції (%) повинні бути цілі числа. Типом результату є тип операндів після перетворення.
Арифметичні вирази мовою С записуються в рядок, так як в такому вигляді легше ввести програму в комп’ютер.
Операція множення (*) виконує множення операндів.
Відомості про арифметичні операції зведені в таблиці.
Таблиця 2.2 – Арифметичні операції
Дія |
Арифметична операція |
Алгебраїчний вираз |
Вираз мовою С |
Додавання |
+ |
t + 9 |
t + 9 |
Віднімання |
- |
r – f |
r – f |
Множення |
* |
ab |
a * b |
Ділення |
/ |
x/y чи x:y чи |
x / y |
Залишок від ділення |
% |
z mod w |
z % w |
Приклад 2.3. Множення операндів.
int k = 5;
float f = 0.2;
double g;
g = f * k;
Тип добутку f й k перетвориться до типу double, потім результат присвоюється змінній g.
Операція ділення (/) виконує ділення першого операнда на другий. Якщо ділене і дільник цілі, то за наявності залишку він відкидається. При спробі ділення на нуль видається повідомлення про помилку під час виконання.
Приклад 2.4. Операція ділення.
int a = 7, b = 5, c = 0, d;
d = a / b; /* d = 1, залишок відкинуто */
d = b / a; /* d = 0, залишок відкинуто */
Операція (%) – визначає залишок від ділення першого операнда на другий. Знак результату залежить від конкретної реалізації. Якщо другий операнд дорівнює нулю, то видається повідомлення про помилку.
Приклад 2.5. Визначення залишка від ділення операндів.
int a = 7, b = 5, c = 0, d;
d = a % b; /* d = 2 – залишок від цілого поділу 7/5 */
d = b % a; /* d = 5 – залишок від цілого поділу 5/7 */
d = b % c; /* повідомлення про помилку */
2.3 Операції приведення типів
У виразах мовою С допускається використання операндів різних типів. При обчисленні виразу тип кожного операнда може бути перетворений до іншого типу. Перетворення типів можуть бути неявними, при виконанні операцій і викликів функцій, чи явними, при виконанні операцій приведення типів.
Неявне перетворення здійснюється автоматично для приведення операндів виразів до загального типу чи для розширення коротких величин до розміру цілих величин, використовуваних у машинних командах. Виконання перетворення залежить від специфіки операцій і від типу операнда чи операндів. Існує загальне правило: при обчисленні виразів операнди перетворяться до типу того операнда, що має найбільший розмір.
У процесі обчислення виразу операнди різних типів приводяться до єдиного за таким правилом:
будь-яке char, short або enum перетворяться в int або unsigned;
якщо після першого кроку протиріччя в розходженні типів не усунені, то відбувається додаткове перетворення типів операндів відповідно до ієрархії типів:
int<unsigned<long< unsigned long<float<double<long double.
Оператор явного перетворення типу має вигляд:
(тип) ідентифікатор,
де тип – визначає тип даних до якого здійснюється перетворення.
Приклад 2.6. Операція приведення типів.
double f;
int a = 2, b = 3;
f = a/b; /* f=0 */
f = (double)a / b; /* f = 0,66666 */
В останньому виразі перед операцією ділення виконується операція перетворення типу змінної а. Спочатку а=2, а при явному перетворенні а=2.0. Тепер перший операнд (a) став типу double, а другий (b), типу int. Раніше говорилося про те, що перед виконанням операції обидва операнда приводяться до одного типу. При цьому тип, який має більш низький пріоритет, перетворюється до типу з пріоритетом більш високим. Тобто int перетворюється у double. Потім виконується ділення, в результаті якого f=0,66666.