Операції мови програмування С

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Кафедра: Автоматика та інформаційні технології
ОПЕРАЦІЇ МОВИ СІ

Зміст
ХАРАКТЕРИСТИКИ ОПЕРАЦІЙ
Таблиця пріоритетів операцій
Коментарі до операцій
Правила перетворень типів
У виразах
У присвоювання
ЛАБОРАТОРНІ ЗАВДАННЯ
Основні арифметичні операції
Операції присвоювання.
Логічні операції та операції інкремента.
Поразрядное операції.
Відносини та умови
Виконання операцій та їх пріоритети
Основні типи даних
Приведення цілих і речових типів
Приведення цілих і речових виразів
Відповіді до завдань
ДОДАТКОВІ ЗАВДАННЯ
СПИСОК

Характеристики операцій
Операція - це елементарна конструкція, яка повертає деякий результат. На відміну від операцій, оператори - синтаксичні конструкції, керуючі ходом виконання програми. Основні оператори: умовні переходи і цикли.
За кількістю аргументів операції бувають унарні, бінарні і є одна тернарних операція «Умова».
Якщо одна і та ж операція зустрічається у виразі кілька разів, то говорять про ліво-асоціативних і право-асоціативних операціях. У першому випадку дана операція виконується зліва направо, в другому - справа наліво.

Таблиця пріоритетів операцій

Операції, розташовані в таблиці вище, мають більший пріоритет.
Таблиця SEQ таблиця \ s 1 \ * MERGEFORMAT 1
№ операції
Група операцій
Позначення операції
Назва операції
Назва на сленгу
Асоціативність
1
первинні
()
круглі дужки
1. () [] ->::.
®
2
[]
індексація
Квадратні дужки
®
3
->
Звернення до елементу структури за вказівником на структурну змінну
стрілка
®
4
::
Дозвіл видимості
Четвероточіе
®
5
.
Звернення до елементу структури на ім'я структурної змінної
Точка
®
6
унарні
!
Логічне заперечення
Знак оклику

7
~
Побітове інвертування
Тільда

8
+ +
Автоматичний інкремент + + х;
Відкладений інкремент х + +
Плюс-плюс

9
-
Автоматичний декремент - х;
Відкладений декремент х -
Мінус-мінус

10
-
Звернення знака
Мінус

11
+
Підтвердження знака
плюс

12
(Тип)
Явна приведення типу

13
*
Разименованія покажчика
Зірочка

14
&
Взяття адреси
Амперсанд

15
sizeof
Розмір в байтах аргументу
sizeof

16
new
Операція виділення динамічної пам'яті
new

17
delete
Операція звільнення динамічної пам'яті
delete

18
мультиплікативні
*
множення
множення
®
19
/
поділ
поділ
®
20
%
Розподіл по модулю
відсоток
®
21
адитивні
+
-
Сума
різниця
Додавання
Різниця
®
22
зрушення
<<
Побітовий зсув вліво
Менше-менше
®
23
>>
Побітовий зсув вправо
більше-більше
®
24
відносини
<
<=
>
> =
Менше
Менше одно
Більше
Більше одно
®
25
Порівняння
==
Порівняння на рівність
®
26
! =
Порівняння на нерівність
3. .* -> *
®
27
поразрядное
&
Побітове «І»
амперсанд
®
28
^
Побітове взаємовиключне «АБО»
кришка
®
29
|
Побітове «АБО»
Побітове «АБО»
30
логічні
& &
Логічне «І»
«І»
31
| |
логічне «АБО»
«АБО»
32
Умова
?:
Умовний вираз
Знак питання

33
присвоювання
=
Присвоєння
Так само

34
*= / =% = + = -= & = ^ = | = <<=>> =
Комбіновані присвоювання
Помножити одно і т.д.

35
кома
,
кома
кома
®
Асоціативність «зліва направо» означає угруповання операцій таким чином: запис A1 @ A2 @ A3 означає ((A1 @ A2) @ A3).
Асоціативність «справа наліво» обробляє запис A1 @ A2 @ A3 як (A1 @ (A2 @ A3)).

Коментарі до операцій

1. () - Найсильніша операція. Вираз (2 * (4 +5)) дорівнює 18.
2. [] Індексує елементи масивів. А [3] [6] - в третьому рядку шостий елемент. Індексація починається з нуля, тобто А [0] [0] - початковий елемент масиву.
3. Операція -> використовується з покажчиками на структурні змінні і на об'єкти класів. Наприклад,
struct Pixel
{
int x, y;
char col;
};
Pixel A, * ptr;
ptr = &A;
ptr-> x = 100;
4. Операція:: застосуються для звернення до глобальних змінних, прихованим локальними змінними.
int x = 2;
void main ()
{
int x = 5;
printf ("% d", x +:: x); / / 7
}
5. Операція "точка" використовується з структурними змінними і над об'єктами класів. Наприклад,
Pixel A;
А.x = 100;
6. У мові Сі немає логічних констант true і false. Замість цього все, що не нуль вважається дійсним, а нуль будь-якого типу вважається брехнею. При цьому представником істини є 1.
Таблиця SEQ таблиця \ s 1 \ * MERGEFORMAT 2.
Таблиця істинності операції логічного заперечення
x
нуль
не нуль
! X
1
0
7. Побітове інвертування застосовується тільки до цілих аргументів. Для отримання результату аргумент необхідно перетворити в двійкову систему числення. Кількість розрядів повинно відповідати типу аргументу.
Таблиця SEQ таблиця \ s 1 \ * MERGEFORMAT 3.
Таблиця істинності
x
0
1
~ X
1
0
Приклад.
char x = 20, y;
y = ~ x;
Так як х = 20 = 000 101 002, то y = 11101011. Змінна y є знаковою, тому її вміст компілятор буде інтерпретувати як число із знаком, тобто негативне. Знайдемо це число зі схеми
y = 1110 1011
+
-Y = 0001 0101
= 0000 0000
Так як-y = 21, то y = -21.
8. Автоматичний інкремент збільшує аргумент на одиницю. Застосовується до будь-яких типів. Операція + + x еквівалентна оператору x = x + 1, але займає менше місця і зручніше в складних виразах. Відкладений інкремент x + + збільшує аргумент на одиницю при наступній зустрічі цієї змінної. Не враховується її використання в рядках і коментарях. Зауважимо, що назва мови Сі + + походить від цієї операції Автор Сі + + Б. Страустрап мабуть, припускав, що ця мова на порядок кращий за свого попередника, мови Сі.
9. Операція декремента аналогічно зменшує аргумент на одиницю.
Приклад. int x = 2, y = 4, z;
z = x + + + + + x + y - + - y;
У результаті x = 4, y = 2, z = 2 + 4 + 4 + 3 = 13.
10. Операція-x є стандартною, вона не змінює значення x.
11. Операція + x позбавлена ​​сенсу.
12. Явне перетворення типу не змінює типу свого аргументу і впливає тільки на тип результату. Запис (int) 2.1 поверне число 2. Використовується, як правило, при роботі з покажчиками. Для числових констант застосовується неявне перетворення типу.
13. Операція «зірочка» застосовується тільки до покажчика і повертає змінну, на яку вказує цей покажчик. Може перебувати в лівій частині операції привласнення (Lvalue) і в правій частині (Rvalue). У першому випадку результат операції - сама осередок, на яку вказує покажчик, У другому випадку - вміст цього осередку.
14. Взяття адреси застосовується до будь-якого ідентифікатору, з яким пов'язана область ОЗУ. Повертає логічний адресу самого лівого байта пам'яті, яку займає цей ідентифікатор. Це можуть бути змінні базових типів, інші покажчики, елементи масивів, структурні змінні. Для визначення типу результату цієї операції, треба додати до типу аргументу одну зірочку.
Приклад.
int x = 3, y, * px;
px = &x; / / покажчик px вказує на змінну x
y =* px; / / y = 3
* Px = y +1; / / x = 4
Типом вираження & y є int *, а тип запису & px це int **.
15. Операція sizeof повертає розмір «чого завгодно» в байтах. Наприклад, sizeof (float) = 4, sizeof (20) = 2, для дальніх адрес sizeof (float *) = 4.
16. Операція new виділяє динамічну пам'ять і введена в мові Сі + +. Її аналогом в Сі є функція malloc.
17. Операція delete звільняє динамічну пам'ять, виділену раніше операцією new. Її аналогом в Сі є функція free.
Приклад.
int * pi = new int;
* Pi = 100;
delete pi;
18. Множення * є звичайною операцією.
19. Розподіл / здійснюється звичайним чином, якщо один з аргументів має дійсний тип. Якщо обидва аргументи - цілі, то операція повертає тільки цілу частину результату.
20. Розподіл% застосовується тільки для двох цілих аргументів і повертає цілочисельний залишок від ділення.
Наприклад, 20.0 / 3 = 6.33333, 20 / 3 = 6, 20% 3 = 2.
Приклад. Має місце тотожність
b = a * (b / a) + b% a.
Приклад. Якщо m - тризначне ціле число abc, то a = m/100, c = m% 10, b = m% 100/10.
Мультиплікативні операції мають однаковий пріоритет.
21. Адитивні операції звичайні.
22. Бінарна операція зсуву використовується для двох аргументів тільки цілого типу. Лівий аргумент треба перетворити до бінарного вигляду. Правий аргумент вказує, на скільки біт необхідно зробити зрушення.
При зсуві вліво x <<y ліві біти числа x пропадають, нові біти праворуч заповнюються нулями. Операція x <<y рівносильна множенню x × 2 y.
23. При зсуві вправо x>> y праві біти числа x пропадають, нові біти зліва заповнюються знаком числа x. Якщо x негативно, то нові біти рівні 1, при позитивному х нові біти рівні 0. Операція x>> y рівносильна поділу без остачі x / 2 y.
Приклад.
char x = 20, y = -10;
unsigned char z = 20;
Тоді x>> 2 = 0001 01 002>> 2 = 0000 01 012 = 5
x <<2 = 0001 01 002 <<2 = 0101 00 002 = 80
x <<3 = 0001 01 002 <<3 = 1010 00 002 = 160 - 256 = -94 - логічна помилка виходу за діапазон типу char
y>> 3 = 1111 01 102>> 3 = 1111 11 102 = -2
z>> 3 = 0001 01 002>> 3 = 0000 00 102 = 2
24-26. Операції відносини і порівняння звичайні. У разі істини вони повертають 1, при порушенні повертають 0.
27-29. Побітові операції застосовуються для цілих аргументів.
Таблиця SEQ таблиця \ s 1 \ * MERGEFORMAT 4.
Таблиці істинності
&
0
1
^
0
1
|
0
1
0
0
0
0
0
1
0
0
1
1
0
1
1
1
0
1
1
1
Приклад.
7 & 9 = 0000 0111 & 0001 0001 = 0000 00012 = 1
7 ^ 9 = 0000 0111 ^ 0001 0001 = 0001 01102 = 22
7 | 9 = 0000 0111 | 0001 0001 = 0001 01112 = 23
30-31. Логічні операції повертають 1 (істину) або 0 (брехня).
Компілятор оптимізує логічні вираження таким чином, що якщо за результатом обчисленого подвираженія можна зробити висновок щодо результату всього висловлювання, то подальше обчислення виразу не виконується.
Приклад.
7 & & 9 = 1
32. Операція «Умова» дозволяє інколи замінити умовний оператор if-else на операцію.
Приклад. Максимальне з двох чисел дорівнює max = (x> y)? x: y;
Максимальне з трьох чисел дорівнює
max = (x> y)? (X> z? X: z): (y> z? Y: z);
33. Результатом присвоювання є значення того, що присвоєно лівому аргументу.
34. Комбіноване присвоювання x op = y є компактною записом оператора x = x op y. Однак компілятор цю замін не виробляє. Комбіноване присвоювання є окремою операцією.
35. «Кома» є, мабуть, самої екзотичної операцією мови Сі. Результатом виразу x, y є число y.
Приклад.
x = 2,5; / / x = 2, тому що присвоювання сильніше коми
x = (2,5); / / x = 5
Мабуть, тут хотіли написати x = 2.5

Правила перетворень типів

У виразах

Якщо операнд має тип не int і не double, то спочатку наводиться:
- Signed char -> int розширенням знакового біта (7)
- Unsigned char -> int доповненням нулями зліва
- Short -> int розширенням знакового біта (15)
- Unsigned short -> unsigned int доповненням нулями зліва
- Enum -> int порядковий номер у перераховуваній типі
- Float -> double дробова частина доповнюється нулями
Якщо який-небудь операнд має тип double, unsigned long, long або unsigned int то й інший операнд приводиться до того ж типу. Результат: того ж типу.
Якщо обидва операнди мають тип int, то результат теж типу int.
При виклику функцій їх аргументи - теж вираження, тому в них наводяться char, short до int і float до double. Це говорить про те, що аргументи (формальні параметри) функцій можна завжди оголошувати як int і double замість char, short і float відповідно.
Зате специфікатор unsigned є істотним.

У присвоювання

op = expr;
Тип вираження expr приводиться до типу лівій частині - op. При цьому можливі приведення більш "довгого" типу до більш "короткому" за допомогою усічення, на кшталт:
- Int -> char обрубуються старший байт.
- Long -> int обрубуються старше слово.
- Float -> int покидьок дробової частини
- Double -> int і обрубування мантиси, якщо не лізе.
- Double -> float округлення дробової частини.
Ось ще деякі приведення типів:
- Signed -> unsigned віртуально (просто знаковий біт
- Unsigned -> signed вважається значущим або навпаки).
- Unsigned int -> long додавання нулів зліва.
- Int -> long розширення знакового біта.
- Float -> int перетворення внутрішнього.
- Int -> float подання: машинно незалежно.
Деякі перетворення можуть йти в кілька стадій, наприклад:
- Char -> long це
- Char -> int -> long
char -> unsigned long це
- Char -> int -> unsigned long

Лабораторні завдання

Основні арифметичні операції

Що надрукує наступна програма?
# Include <stdio.h>
main ()
{
int x;
x = -3 + 4 * 5 - 6; printf ("% d \ n", x);
x = 3 + 4% 5 - 6; printf ("% d \ n", x);
x = -3 * 4% - 6 / 5; printf ("% d \ n", x);
x = (7 + 6)% 5 / 2; printf ("% d \ n", x);
return 0;
}

Операції присвоювання.

Що надрукує наступна програма?
# Include <stdio.h>
# Define PRINTX printf ("% d \ n", x)
main ()
{
int x = 2, y, z;
x *= 3 + 2; PRINTX;
x *= y = z = 4; PRINTX;
x = y == z; PRINTX;
x == (y = z); PRINTX;
return 0;
}

Логічні операції та операції інкремента.
Що надрукує наступна програма?
# Include <stdio.h>
# Define PRINT (int) printf ("% d \ n", int)
main ()
{
int x, y, z;
x = 2; y = 1; z = 0;
x = x & & y | | z; PRINT (x);
PRINT (x | |! Y & & z);
x = y = 1;
z = x + + - 1; PRINT (x);
PRINT (z);
z + = - x + + + + + y; PRINT (x);
PRINT (z);
z = x / + + x; PRINT (z);
return 0;
}

Поразрядное операції.

Що надрукує наступна програма?
# Include <stdio.h>
# Define PRINT (int) printf ("% d \ n", int)
main ()
{
int x, y, z;
x = 03; y = 02; z = 01;
PRINT (x | y & z);
PRINT (x | y & ~ z);
PRINT (x ^ y & ~ z);
PRINT (x & y & & z);
x = 1; y =- 1;
PRINT (! X | x);
PRINT (~ x | x);
PRINT (x ^ x);
x <<= 3; PRINT (x);
y <<= 3; PRINT (y);
y>> = 3; PRINT (y);
return 0;
}

Відносини та умови

Що надрукує наступна програма?
# Include <stdio.h>
# Define PRINT (int) printf ("% d \ n", int)
main ()
{
int x = 1, y = 1, z = 1;
x + = y + = z;
PRINT (x <y? Y: x);
PRINT (x <y? X + +: y + +);
PRINT (x);
PRINT (y);
PRINT (z + = x <y? X + +: y + +);
PRINT (y);
PRINT (z);
x = 3; y = z = 4;
PRINT ((z> = y> = x)? 1: 0);
PRINT (z> = y & & y> = x);
return 0;
}

Виконання операцій та їх пріоритети

Що надрукує наступна програма?
# Include <stdio.h>
# Define PRINT (x, y, z) printf ("x =% d \ ty =% d \ tz =% d \ n", x, y, z)
main ()
{
int x, y, z;
x = y = z = 1;
+ + X | | + + y & & + + z; PRINT (x, y, z);
x = y = z = 1;
+ + X & & + + y | | + + z; PRINT (x, y, z);
x = y = z = 1;
+ + X & & + + y & & + + z; PRINT (x, y, z);
x = y = z =- 1;
+ + X & & + + y | | + + z; PRINT (x, y, z);
x = y = z =- 1;
+ + X | | + + y & & + + z; PRINT (x, y, z);
x = y = z =- 1;
+ + X & & + + y & & + + z; PRINT (x, y, z);
return 0;
}

Основні типи даних

Що надрукує наступна програма?
# Include <stdio.h>
# Define PRINTd (x) printf ("% d \ n", x); / / десяткове число зі знаком
# Define PRINTc (x) printf ("% c \ n", x); / / символ з ascii-кодом x
# Define PRINTo (x) printf ("% o \ n", x); / / вісімкове число зі знаком
# Define PRINTs (x) printf ("% s \ n", x); / / рядкова константа
int integer = 5;
char character = '5 ';
char * string = "5";
main ()
{
PRINTd (string);
PRINTd (character);
PRINTd (integer);
PRINTs (string);
PRINTc (character);
PRINTc (integer = 53);
PRINTd ('5 '> 5);
{
int sx =- 8;
unsigned ux =- 8;
PRINTo (sx); PRINTo (ux);
PRINTo (sx>> 3); PRINTo (ux>> 3);
PRINTd (sx>> 3); PRINTd (ux>> 3);
}
return 0;
}

Приведення цілих і речових типів

Що надрукує наступна програма?
# Include <stdio.h>
# Define PRi (x) printf ("i =% .8 g \ t", (double) x)
# Define PRl (x) printf ("l =% .8 g \ t", (double) x)
# Define PRf (x) printf ("f =% .8 g \ t", (double) x)
# Define PRd (x) printf ("d =% .8 g \ t", (double) x)
# Define NL putchar ('\ n')
# Define PRINT4 (x1, x2, x3, x4) PRi (x1); PRl (x2); PRf (x3); PRd (x4); NL
main ()
{
double d;
float f;
long l;
int i;
i = l = f = d = 100 / 3; PRINT4 (i, l, f, d);
d = f = l = i = 100 / 3; PRINT4 (i, l, f, d);
i = l = f = d = 100 / 3.; PRINT4 (i, l, f, d);
d = f = l = i = (double) 100 / 3; PRINT4 (i, l, f, d);
i = l = f = d = (double) (100000 / 3); PRINT4 (i, l, f, d);
d = f = l = i = (double) 100000 / 3; PRINT4 (i, l, f, d); return 0;
}

Приведення цілих і речових виразів

Що надрукує наступна програма?
# Include <stdio.h>
# Define NL putchar ('\ n')
# Define PR (x) printf ("% g \ t", (double) x)
# Define PRINT1 (x1) PR (x1); NL
# Define PRINT2 (x1, x2) PR (x1); PR (x2); NL
main () {
double d = 3.2, x; int i = 2, y;
x = (y = d / i) * 2; PRINT2 (x, y);
y = (x = d / i) * 2; PRINT2 (x, y);
y = d * (x = 2.5 / d); PRINT1 (y);
x = d * (y = ((int) 2.9 + 1.1) / d);
PRINT2 (x, y);
return 0;
}

Відповіді до завдань

1. 11 1 0 1
2. 10 40 1 1
3. 1 1 2 0 3 0 1
4. 3 3 1 1 1 -1 0 8 -8 -1
5. 3 2 3 3 4 4 4 0 1
6. x = 2 y = 1 z = 1 x = 2 y = 2 z = 1
x = 2 y = 2 z = 2
x = 0 y =- 1 z = 0
x = 0 y = 0 z =- 1
x = 0 y =- 1 z =- 1
7. 175 - молодший байт адреси в десятковій формі 53 5 5 5 1
sx = 177770
ux = 177770
sx>> 3 = 177777 знак переноситься при зсуві
ux>> 3 = 17777 знак не переноситься при зсуві
-1
8191
8. i = 33 l = 33 f = 33 d = 33 i = 33 l = 33 f = 33
d = 33
i = 33 l = 33 f = 33.333332 d = 33.333333
i = 33 l = 33 f = 33 d = 33
i =- 32203 l = 33333 f = 33333 d = 33333
i =- 32203 l =- 32203 f =- 32203 d =- 32203
9. x = 2 y = 1 x = 1.6 y = 3
y = 2
x = 0 y = 0

Додаткові завдання

1. Напишіть вираз для визначення суми 0-го і 3-го бітів числа int x.
2. Напишіть вираз для визначення кількості одиниць у числі char х.
3. Встановити в одиницю третього і 5-ий біти змінної int x. Скинути в нуль дев'ятого і тринадцятого біти змінної int x.
4. Що надрукує фрагмент програми
int x = 100, y = 7, z;
z = (x / y)% 5 * 3;
printf ("% d", z);
5. Що надрукує фрагмент програми
int x = 10, y =- 70, z;
z = x <<3 + y>> 2;
printf ("% d", z);
6. Змінна int x містить чотиризначне натуральне число abcd. За допомогою операцій / і% знайдіть цифри a, b, c, d.
7. Знайдіть за допомогою операцій «умова» максимальна з трьох чисел. Використовувати тільки один оператор у вигляді max = ... ...;
8. Запишіть у вигляді одного логічного виразу приналежність точки (x, y) уpезанному одиничного квадpату


Рис.1.

Бібліографічний список

1. Керніган Б., Рітчі Д., Фьюер А. Мова програмування Сі: Завдання з мови Сі. М.: Фінанси і статистика, 1985. - 192с.
2. Керніган Б., Рітчі Д. Мова програмування Сі. М.: Фінанси і статистика, 1992. - 272с.
3. Подбельський В.В., Фомін С.С. Програмування на мові Сі. Учеб. посібник. М.: Фінанси і статистика, 2004. 600 с.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
61.6кб. | скачати


Схожі роботи:
Мови програмування 2
Мови програмування
Алгоритмічні мови програмування
Мови та системи програмування
Мови та технологія програмування 2
Мови та технологія програмування
Історія мови програмування Lisp
Мови програмування їх класифікація та розвиток
Основи програмування та алгоритмічні мови
© Усі права захищені
написати до нас