Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Розділ 10. Базові засоби мови С++.docx
Скачиваний:
6
Добавлен:
01.05.2019
Размер:
366.53 Кб
Скачать

6. Операції порівняння (операції відношень).

Дамо в таблиці повний перелік операцій відношень мови С++.

Операція

Значення

<

Менше

<=

Менше або дорівнює

==

Дорівнює

>=

Більше або дорівнює

>

Дорівнює

!=

Не дорівнює

Операції відношень використовуються для побудови умовних виразів. Кожний умовний вираз отримує оцінку “істинний” або “хибний”. В мові Сі хибний вираз приймає значення 0, а істинний вираз - значення , відмінне від 0. Іншими словами, всі ненульові значення розглядаються , як “істина”, і тільки 0 вважається “хибою”.

Наведемо проклади умовних виразів з використанням операцій відношень:

number < 6

ch != ’s’

ch > ’v’

total == 100

Зауваження: не можна використовувати знак = замість знаку ==. Якщо

х = 10 - це операція присвоювання, яка значення 10 присвоює змінній х, то

х == 10 - це операція порівняння, яка перевіряє, чи рівні значення змінної х і числа 10.

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

В мові С++ є три логічні операції:

Операція

Значення

&&

і

||

або

!

ні

Якщо x1 i x2 – це два прості умовні вирази, то можна стверджувати слідуюче:

x1 && x2 - дорівнює істині тільки тоді, коли обидва вирази x1 i x2 - істинні.

x1 || x2 - дорівнює істині, коли один з виразів x1 або x2 дорівнює істині,

або обидва вирази істинні.

!x1 - дорівнює істині, коли вираз х1 хибний і дорівнює хибі, коли вираз

х1 істинний.

Наведемо кілька прикладів (врахуємо, що логічні операції && i || мають менший пріоритет, ніж операції відношень, а операція ! має більший приоритет, ніж операції відношень):

5>2 && 4>7 - хибний, бо істинний тільки один підвираз.

5>2 || 4>7 - істинний, бо істинний один з підвиразів.

!(4>7) - істинний, бо підвираз хибний.

!(5>2) - хибний, бо підвираз істинний.

8. Умовна операція.

Умовна операція має три операнди, кожний з яких являється виразом. Вони розташовані таким чином:

Вираз1 ? вираз2: вираз3

Значення всього виразу дорівнює виразу2, якщо вираз1 істинний, інакше значення всього виразу отримає значення виразу3.

Наприклад,

(5>3)?1:2 має значення 1,

(3>5)?1:2 має значення 2.

В наступному прикладі змінній max присвоюється більше з двох значень :

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

Самостійна робота. Правила узгодження типів

Невідповідність типів даних при роботі в С++ є однією з найбільш частих помилок на початковому етапі навчання. На жаль, компілятор не завжди може попередити такі неточності програміста. Як наслідок, програма виконує не ті дії, що потрібно.

При виконанні операцій відбувається неявне перетворення типів в наступних випадках:

- при виконанні операцій відбувається звичайне арифметичне перетворення;

- при виконанні операції присвоєння, якщо значення одного типу присвоюється змінній іншого типу;

- при передачі аргументів функції.

Крім того, в С є можливість явного перетворення між типами.

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

Для явного перетворення змінної з одного типу в інший перед іменем в дужках вказується новий тип:

#include <iostream.h>

int main()

{int integer = 54;

float floating=15.854;

integer = (int) floating;// явне перетворення типів

cout<<”New integer”;

cout<<Integer<<’\n’;

return 0;

}

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

Приклад неявного перетворення:

#include <iostream.h>

int main()

{ int integer = 0;

float floating=15.854;

integer = floating;//неявне перетворення типів

cout<<”New integer”;

cout<<Integer<<’\n’;

return 0;

}

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

Набір правил для автоматичного перетворення типів даних.

В операторах і виразах повинні використовуватись змінні і константи одного типу. Якщо ж ми все-таки змішуємо типи в одному виразі, то компілятор використовує набір правил для автоматичного перетворення типів:

  • Якщо операція виконується над даними двух різних типів, то обидві величини приводяться до вищого з двох типів. Цей процес називається підвищенням типу.

  • Послідовність типу від вищого до нижчого:

double

float

long

short

int

char

  • В операторі присвоєння кінцевий результат правої частини приводиться до типу змінної, що стоїть зліва.

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

Перетворення типів даних.

Перетворення типів даних може включати в себе наступні дії:

  • збільшення або зменшення розрядності машинного слова;

  • перетворення цілої змінної в змінну з плаваючою точкою і навпаки;

  • перетворення знакової форми представлення цілого в беззнакову і навпаки.

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

l ong d = 0x876543; d

int i;

i = d;

p rintf(“ %x \n ”, i); i

32767

Збільшення розрядності приводить до появи додаткових старших розрядів числа, які для беззнакових цілих заповнюються нулями, а для цілих зі знаком– заповнюються значенням знакового розряду.

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

double d1 = 855.666, d2 = 0.5E16;

i nt n1, n2; n1 + d1 +

n1 = d1;

n 2 = d2;

(max -32767) n2 + d2 +

Перетворення знакової форми в беззнакову не супроводжується зміною значення цілого числа і взагалі не приводить до виконання будь-яких дій в програмі. В таких випадках транслятор “запам’ятовує”, що форма представлення числа змінилась.

signed

знак

unsigned

Висновок для програміста: в мові Сі не передбачені засоби автоматичної реакції на помилки перетворення типів даних, тому “виловлювати” їх повинен сам програміст.

Операція явного перетворення типу (тип).

Ця операція перетворює тип слідуючого за нею опреанда в тип, означений ключевим словом в дужках. Наприклад, (float)9 перетворює ціле число 9 в число з плаваючою точкою 9.0. Ще один приклад,

int m;

m

1.6 + 1.7 = 3.3

m <- 3

= 1.6 + 1.7;

1 + 1 = 2

m <- 2

m = (int)1.6 + (int)1.7;