ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.12.2021

Просмотров: 976

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

У випадку префіксної форми запису зміна операнда відбувається до його використання у виразі і результатом операції є збільшене чи зменшене значення операнда.

У випадку постфіксної форми запису операнд спочатку використовується для обчислення виразу, а потім відбувається зміна операнда.


Приклад 9. Операції інкремента (постфіксна)

int f=1, d;

d = (f++)*5;


Спочатку відбувається множення f*5, а потім збільшення f на одиницю. У результаті вийде d=5, f=2.


Приклад 10. Операції інкремента (префіксна)

int f=1, d;

d=(++f)*5;


Спочатку значення f збільшується на одиницю, а потім використовується в операції множення. У результаті одержимо d=10, f=2.

У випадку, якщо операції збільшення чи зменшення використовуються не у виразі, а як самостійні оператори, префіксна і постфіксна форми запису стають еквівалентними.


f++; /* еквівалентно */ ++f;



4.6 Операції порівняння


Мова C підтримує 2 групи операцій порівняння – операції рівності та операції відношення. Відомості про операції порівняння зведені в таблиці.

Вирази в яких присутні операції порівняння як правило використовуються в операторах керування для задання умови. Для операторів розгалуження (if, if else) це умова по якій вибирається напрямок подальшого ходу програми. Для операторів циклів (for, while, do while) це умова при виконанні якої буде виконана чергова ітерація циклу (у випадку якщо значення виразу дорівнює 1) а при не виконанні якої буде здійснено вихід з циклу (у випадку якщо значення виразу дорівнює 0).


Таблиця 4.4– Операції порівняння

Алгебраїчний запис

Лексеми операцій

Приклад виразу у С

Смисл виразу

Операції рівності

=

=

x == y

x рівний y

!=

x != y

x не рівний y

Операції відношення

>

>

x > y

x більше y

<

<

x < y

x менше y

>=

x>=y

x більше чи рівне y

<=

x<=y

x менше чи рівне y



Приклад. 11. Операції порівняння

int a=1, b=4;

printf("%i \n", a<=b); /*результат : 1*/

printf("%i \n", a==b); /*результат : 0*/

printf("%i \n", a!=b); /*результат : 1*/

printf("%i \n", a>b); /*результат : 0*/



4.7 Операції зсуву


Порозрядні логічні операції зсуву вліво (<<) та вправо (>>) застосовуються до даних цілих типів. Результат операцій зсуву теж буде цілим і відповідає двійковому представленню числа, зміщеному вліво чи право на задане число біт. При цьому висунуті за межі представлення типу біти втрачаються.

Операції зсуву здійснюють зсув операнда вліво (<<) чи вправо (>>) на число бітів, що задається другим операндом.

Формат представлення цих операцій наступний:

Вираз 1 << Вираз 2,

Вираз 1 >> Вираз 2,

де Вираз 1 – дані цілого типу, Вираз 2 – константа або константний вираз цілого типу, який визначає кількість зсунутих біт.

Приклад 12.Операції зсуву

int a = 9; /* змінна a в двійковому представлені 1001 */

int b = a>>2; /* змінна b в двійковому представленні дорівнює 10, тобто в десятковому 2 */

int c = a<<2; /* змінна с в двійковому представленні дорівнює 100100, тобто в десятковому 36.*/




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


До порозрядних операцій відносяться: операція порозрядного логічного "І" (&), операція порозрядного логічного "АБО" (|), операція порозрядного "виключного АБО" (^). Таблиці істинності порозрядних операцій зображенні у таблиці 4.5


Таблиця 4.5 – Таблиці істинності порозрядних операцій

A

b

a & b

a | b

a ^ b

0

0

0

0

0

0

1

0

1

1

1

0

0

1

1

1

1

1

1

0


Операнди порозрядних операцій можуть бути будь-якого цілого типу. При необхідності над операндами виконуються перетворення за замовчуванням, тип результату - це тип операндів після перетворення.

Операція порозрядного логічного І (&) порівнює кожен біт першого операнда з відповідним бітом другого операнда. Якщо обидва порівнюваних біта одиниці, то відповідний біт результату встановлюється в 1, у протилежному випадку в 0.

Операція порозрядного логічного АБО (|) порівнює кожен біт першого операнда з відповідним бітом другого операнда. Якщо кожен з порівнюваних бітів дорівнює 1, то відповідний біт результату встановлюється в 1, у протилежному випадку результуючий біт дорівнює 0.

Операція порозрядного виключного АБО (^) порівнює кожен біт першого операнда з відповідними бітами другого операнда. Якщо один з порівнюваних бітів дорівнює 0, а другий біт дорівнює 1, то відповідний біт результату встановлюється в 1, у протилежному випадку, тобто коли обидва біти рівні 1 чи 0, біт результату встановлюється в 0.


Приклад 13. Операція порозрядного порівняння

int a=5, b=11, c;

c = a | b; /* с = 15 */

c = a & b; /* с = 1 */

c = a ^ b; /* с = 14 */


При обчиcленні порозрядних операцій кожен операнд представляється у двійковій формі. Так значення змінної a у двійковій формі буде 01012, значення змінної b –­­ 10112. Використовуючи таблиці істинності (табл. 4.5) для відповідної порозрядної операції, отримується результат у двійковій формі, який потім переводиться у десяткову форму. Приклад обчислення порозрядних операцій наведений на рис. 4.2.


Рисунок 4.2 - Приклад обчислення порозрядних операцій



4.9 Логічні операції


До логічних операцій відносяться операція логічного «І» (&&) та операція логічного «АБО» (||). В кожній операції можуть брати участь операнди різних типів. Результатом логічної операції є 0 чи 1, тип результату int.

Результатом застосування операції логічного «І» (&&) до операндів, що мають нульові значення, є 0. Якщо один з операндів дорівнює 0, то результатом операції є 0. Якщо обидва операнда мають ненульове значення результат операції дорівнює 1.

Результатом застосування операції логічного «АБО» (||) до операндів, що мають нульові значення, є 0. У випадку якщо один з операндів має не нульове значення результат операції дорівнює 1.

Таблиці істинності логічних операцій зображенні у таблиці 4.6.


Таблиця 4.6 – Таблиці істинності логічних операцій «І» та «АБО»


A

B

A && B

A || B

0

0

0

0

0

не «0»

0

1

не «0»

0

0

1

не «0»

не «0»

1

1


Приклад 14.Логічні операції

int A=10, B=0, C=4, D;

D = A && B; /* D = 0*/

D = A || B; /*D = 1*/

D = A && C; /* D = 1*/

D = A || C; /* D = 1*/


За допомогою логічних операцій «І» та «АБО» та операторів порівняння можна конструювати вирази, для перевірки входження в діапазон (діапазони) значень змінних. Такі вирази як правило використовують в операторах керування для конструювання складних умов. Приклад таких виразів представлений у таблиці 4.7.


Таблиця 4.7 – Приклади виразів представлення діапазону значень

Графічне представлення

Математичне представлення

Представлення в мові С

1

x<a && x>b

2

x>a || x<b

3

x<=a || x>b && x<c

4

x>a && x<b || x>=c && x<=d


У першому пункті табл. 4.7 представлений вираз який повертає 1 у випадку якщо значення змінної x входить у діапазон . У другому пункті таблиці представлений вираз який повертає 1 якщо значення змінної x входить у один з діапазонів чи . У третьому пункті таблиці представлений вираз який повертає 1, якщо значення змінної x входить у один з діапазонів або . У четвертому пункті таблиці представлений вираз який повертає 1, якщо значення змінної x входить у один з діапазонів або .


Задача 1. Написати програму, яка буде зчитувати з клавіатури символ і виводити на екран 1 якщо цей символ мала буква англійського алфавіту, і 0 в протилежному випадку.

Для рішення задачі потрібно скористатися таблицею кодів ASCII, в якій малі букви англійського алфавіту кодуються числами, а саме в діапазоні чисел від 97 до 122 закодовані літери від a до z. Для задання виразу який буде приймати значення 1 у випадку попадання значення введеного символу в потрібний діапазон доцільно використати вираз з пункту 1 таблиці 4.4.


#include <stdlib.h>

#include <stdio.h>


int main()

{

char x;

scanf("%c", &x);

printf("%i \n", x>=97 && x<=122);


system("PAUSE");

return 0;

}


Результат роботи програми, при введенні символу r”:


Результат роботи програми, при введенні символу R”:


Задача 2. Написати програму, яка буде зчитувати з клавіатури символ і виводити на екран 1 якщо цей символ мала чи велика буква англійського алфавіту, і 0 в протилежному випадку.

Для задання виразу який буде приймати значення 1 у випадку попадання значення введеного символу в потрібні діапазони доцільно використати вираз з пункту 4 таблиці 4.4.


#include <stdlib.h>

#include <stdio.h>


int main()

{

char x;

scanf("%c", &x);

printf("%i \n", x>=65 && x<=90 || x>=97 && x<=122);


system("PAUSE");

return 0;

}


Результат роботи програми, при введенні символу a”:


Результат роботи програми, при введенні символу A”:



4.10 Операція sizeof


За допомогою операції sizeof можна визначити розмір пам'яті, яка відповідає ідентифікатору чи типу. Операція sizeof має наступний формат:


sizeof ( Вираз ),

де у якості виразу може бути використаний ідентифікатор або ім'я типу.



Застосування операції sizeof до імені типу або до ідентифікатора, що має тип структури чи об'єднання, приводить до видачі фактичного розміру, що може включа­ти ділянки пам'яті, які використовуються для вирівнювання елементів структури або об'єднання.


Приклад 15 . Операції sizeof

int a = 2;

float b = 4;

double c = 6;


printf(“%i %i %i\n”, sizeof(a), sizeof(b), sizeof(c));

/* На екрані побачимо: 4 4 8, кількість байт які в пам’яті займають змінні a b та c */

printf(“%i %i\n”, sizeof(int), sizeof(double));

/* На екрані побачимо: 4 8, кількість байт які відповідають типам int та double */



4.11 Операція послідовного обчислення


Операція «,» операція послідовного обчислення для двох чи більш виразів там, де за синтаксисом припустимий тільки один вираз. Обчислення виконуються зліва на право. При виконанні операції послідовного обчислення перетворення типів не відбу­вається.



4.12 Операція умови (?:)


У мові С присутня одна тернарна операція – умовна операція, що має наступний формат:


Операнд-1 ? Операнд-2 : Операнд-3


Операнд-1 повинний бути цілого чи дійсного типу чи бути покажчиком. Він оцінюється з погляду його рівності 0. Якщо Операнд-1 не дорівнює 0, то обчислюється Операнд-2 і його значення є результатом операції. Якщо Операнд-1 дорівнює 0, то обчислюється Операнд-3 і його значення є результатом операції. Слід зазначити, що обчислюється або Операнд-2, або Операнд-3, але не обоє. Тип результату залежить від типів Операнда-2 і Операнда-3.


Приклад 16. Операція умови (?:)


int a=2, b=4, max;

max = (b<=a) ? a : b;


Результат виразу b<=a дорівнює нулю, тому змінній max присвоюється значення змінної b.



4.13 Адресні операції


Існує дві адресні операції: (&) - взяття адреси та (*) - та звернення по адресі.

Якщо перед ім'ям змінної чи елементу масиву стоїть &, це значить взяття їх адреси.

Ці операції найбільш частіше використовуються при роботі з покажчиками. Забігаючи наперед, відмітимо, що покажчик - це змінна, яка може приймати значення адреси іншої змінної певного типу.

Покажчик вказує на певний тип і описується у вигляді:


тип * ім'я_покажчика;


Приклад 17. Адресна операції: (*)


char *pch; /* Покажчик на тип char. */

int *pi; /* Покажчик на тип int. */

float *p1; /* Покажчик на float. */


Приклад 18. Адресна операції: (*)


double x=2.1, y, *p2; /* Опис змінних х, у типу double і

покажчику р2 на double. */

p2=&x; /* Покажчик р2 отримав значення адреси змінної х. */

y=*p2; /* Змінній у присвоєно значення іншої змінної,

адреса якої знаходиться в покажчику р2 . Тобто у=х;

*/

/* *р2 звернення по адресі, яка знаходиться в р2.*/



4. ПРОСТІ ТИПИ ДАНИХ


5.1 Оголошення змінних


Типи даних – це спеціальні конструкції мови, що розглядаються компілятором як зразки для створення таких елементів програми, як змінні, константи і функції. Будь-який тип визначає обсяг пам'яті, який виділяє компілятор для розміщення елемен­та; форму внутрішнього уявлення; множину допустимих значень, а також множину допустимих операцій, які програміст може виконувати над елементами даного типу.

Змінна – це іменована ділянка пам’яті, де зберігається значення, яке може бути змінено програмою. В мові С всі змінні, перед їх використанням повинні бути оголошені (declarate).

Під час оголошення змінної здійснюється виділення пам'яті. Оголошення задає ім'я змінної та її тип. Крім цього, може бути визначене початкове значення для змінної, таке визначення називають ініціалізацією (initialization). Повинно бути одне і тільки одне оголошення змінної в програмі.


Приклад 1. Синтаксис оголошення змінної

[ модифікатори ] тип ім’я_змінної;


де модифікатори – модифікатор const чи/або один з модифікаторів

класу пам’яті.

тип – тип даних;

ім’я_змінноїідентифікатор.


Мова C підтримує чотири класи пам'яті, які визначають такими модифікаторами: auto, static, register, extern. Клас пам’яті визначає область видимості і час життя змінної;

При використанні модифікатора const змінна, яку ще називають константною змінною або константою, не буде змінювати своє значення протягом виконання програми. Константи повинні бути ініціалізовані при оголошенні.


Приклад 2. Використання модифікатора const

int apples; /* оголошення змінної apples типу int без

використання модифікаторів */

auto int apples; /* використання модифікатора auto */

const auto int apples = 7; /*використання модифікаторів const та auto*/



5.2 Час існування та область видимості змінних


Кожна змінна, оголошена в програмі, має дві найважливіші характеристики:

- час існування;

- область видимості.

Ці характеристики взаємозалежні та істотно впливають на можливості використання змінної у програмі. Взаємозв'язок характеристик визначається способом виділення пам'яті для змінної.

Час існування, або час життя змінної, вимірюється у наступних двох відносних одиницях.

Локальний час життя це час існування змінної при виконанні блоку, у якому вона оголошена.

Глобальний час життя це час існування змінної при виконанні всієї програми.

Область видимості, або область дії змінної, також вимірюється в двох відносних одиницях:

1) до кінця блоку, у якому оголошена змінна.

2) до кінця файлу, у якому оголошена змінна.

Керувати цими характеристиками змінних програміст може двома шляхами:

1) зміною місця оголошення змінної у програмі;

2) використанням модифікаторів auto, register, static, extern.

Автоматична (auto) змінна або константа має локальну область дії і відома тільки всередині блоку, у якому вона визначена. Для автоматичної змінної виділяється тимчасова пам'ять. Пам'ять виділяється при вході в блок, а при виході з нього пам'ять, виділена для змінної, вважається вільною, тобто змінна знищується. Якщо специфікатор класу пам'яті не визначений, то зміна вважається автоматичною.