
- •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.1 Загальні відомості
Комбінація знаків операцій і операндів, результатом якої є певне значення, називається виразом.
Операнд – це те, над чим виконуються операції. У мові С у якості операндів можуть виступати літерали, змінні, елементи масиву, результати виклику функції, вирази. Будь-який операнд, що має константне значення, називається константним виразом. Кожен операнд має тип.
Знаки операцій визначають дії, що повинні бути виконані над операндами. Кожен операнд у виразі може бути виразом. Значення виразу залежить від розташування знаків операцій і круглих дужок у виразі, а також від пріоритету виконання операцій. Пріоритет виконання операцій представлений у таблиці 2.1.
Таблиця 2.1 – Пріоритет виконання операцій
Пріоритет |
Операція |
Типи операції |
Порядок виконання |
1 |
() [] . |
Вираз |
Зліва направо |
2 |
->- ~ ! * & ++ -- sizeof |
Унарні |
Справа наліво |
3 |
приведення типу () |
Унарний |
Справа наліво |
4 |
* / % |
Мультиплікативні |
Зліва направо |
5 |
+ - |
Адитивні |
|
6 |
<< >> |
Зсув |
|
7 |
< > <= >= |
Відношення |
|
8 |
== != |
Відношення (рівність) |
|
9 |
& |
Порозрядне «І» |
|
10 |
^ |
Порозрядне виключне «АБО» |
|
11 |
| |
Порозрядне «АБО» |
|
12 |
&& |
Логічне «І» |
|
13 |
|| |
Логічне «АБО» |
|
14 |
?: |
Умовна |
|
15 |
= *= /= %= += -= &= |= >>= <<= ^= |
Просте і складене присвоєння |
Справа наліво |
16 |
, |
Послідовне обчислення |
Зліва на право |
Приклад 2.1. Пріоритет операцій.
int a = 2, b = 3, c = 4, d = 7, e, f;
e = a + b / c + d & a * b - d % a; /* e = 1 */
Порядок виконання операцій у виразі визначається пріоритетом операцій, для прикладу 2.1 зображений на рис. 2.1.
Рисунок 2.1 – Порядок виконання операцій у виразі
Спочатку будуть виконані операції з найвищим пріоритетом, тобто b/c (3/4 = 0) , a*b (2*3 = 6) та d%a (7%2 = 1). Вираз можна переписати, як:
e = a + 0 + d & 6 - 1;
Наступними виконаються адитивні операції a + 0 + d (2+0+7 = 9) та 6 - 1 (=5) і вираз можна переписати як:
e = 9 & 5;
Наступною виконається операція порозрядного «І» 9 & 5 (=1) і останньою операція присвоювання e = 1, в результаті якої змінна e буде містити число 1.
Так як операція «()» має найвищий пріоритет, для зміни пріоритету частини виразу його можна взяти у дужки, таким чином ця частина виразу виконається спочатку. У випадку вкладених дужок в першу чергу виконається вираз у внутрішніх дужках.
Приклад 2.2. Пріоритет операцій.
int a = 2, b = 3, c = 4, d;
d = a + b * c; /* спочатку виконається вираз b * c,
потім результат цього виразу буде до
даний до a, тобто d = 14 */
d = (a + b) * c; /* спочатку виконається вираз a + b, по-
тім результат цього виразу буде помно-
жений на с, тобто d = 20 */