Материал: ООП (2.Початкові відомості мови С)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

У Сі використовується той же набір операцій відношення, що і в Паскале. Слід лише звернути увагу на відмінність в записі операцій «рівно» і «не рівно».

<      менше

<=     менше або рівно

>      більше

>=     більше або рівно

= =     рівно

! =     не рівно.

Як вже говорилося раніше, в стандарті Сі немає логічного типу даних. Тому результатом операції відношення є ціле число: якщо відношення істинне — те 1, якщо помилково — те 0.

Приклади відношень:

а<0, 101>=105, 'а'=='А', 'а"='А'

Результатом другого і третього стосунків буде 0 — брехня; результат четвертого відношення дорівнює 1 — істина; результат першого відношення залежить від значення змінної а.

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

Три основні логічні операції в мові Сі записуються інакше, ніж в Паскале.

!                  операція заперечення (НЕ)

&&              кон'юнкція, логічне множення (И)

| |                 диз'юнкція, логічне складання (ЧИ).

Правила їх виконання визначаються таблицею істинності.

Наприклад, логічний вираз, що відповідає системі нерівностей 0 < х < 1 в програмі на Сі запишеться у вигляді наступного логічного виразу:

х>0 && х<1

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

!

> <   >=   <=

== !=

&&

||

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

&     порозрядна кон'юнкція (И)

|       порозрядна диз'юнкція (ЧИ)

^     що порозрядне, що виключає АБО

~     порозрядне заперечення (НЕ).

Бітові логічні операції разом з операціями порозрядного зрушення вліво (<<) і управо (>>) дозволяють дістатися до кожного біта внутрішнього коду. Найчастіше такі дії доводиться виконувати в системних програмах. У цьому посібнику ми їх розглядати не будемо.

Операція привласнення.

Те, що привласнення в Сі є операцією, а не оператором, виявляється, напевно, найбільшою несподіванкою для знавців Паскаля. А тим часом це дійсно так! Знак операції привласнення =. Наслідком відміченого факту є те, що привласнення, як будь-який інший знак операції, може кілька разів входити у вираження. Наприклад:

а=b=з=х+у;

Привласнення має найнижчий пріоритет (нижче тільки у операції «кома»). Крім того, операція привласнення — правоассоціативна. Це означає, що дещо підряд розташованих привласнень виконуються справа наліво. Тому в приведеному вище вираженні першої виконається операція складання, потім змінною з привласниться значення суми, потім це значення привласниться змінній b і у кінці — змінній а.

У мові Сі є додаткові операції привласнення, що поєднують привласнення з виконанням інших операцій. Серед них: +=, -=, /=, *=, %=. Пріоритет у них такий же, як і у простого привласнення. Приклади використання цих операцій :

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

Операція явного перетворення типу (операція «тип»). Застосування цієї операції має наступний формат:

(Ім'я_типу) операнд

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

(long) 8, (float) 1, (int) x%2

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

Наступний фрагмент програми ілюструє одну з практичних ситуацій, в якій потрібно було використовувати перетворення типу :

float с;

int a=l, b=2;

с=(float) а/b;

В результаті змінна з отримає значення 0,5. Без перетворення типу її значення дорівнювало б 0.

Операція sizeof. Ця операція має дві форми запису :

Sizeof(тип) і sizeof (вираження)

Результатом операції є ціле число, рівне кількості байтів, яка займає в пам'яті величина явно вказаного типу або величина, отримана в результаті обчислення вираження. Остання визначається також за типом результату вираження. Хоча за формою запису це схоже на функцію, проте sizeof є саме операцією. Її пріоритет вищий, ніж у бінарних арифметичних операцій, логічних операцій і стосунків. Приклади використання операції :

Операція «кома». Ця незвичайна операція використовується для зв'язування декількох виразів в одно. Декілька виразів, розділених комами, обчислюються послідовно зліва направо. Як результат такого поєднаного вираження приймається значення найправішого вираження. Наприклад, якщо змінна X має тип int, то значення вираження (X=3, 5*Х) дорівнюватиме 15, а змінна X набуде значення 3.

Операція «умова ?:». Це єдина операція, яка має три операнди. Формат операції :

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

Ця операція реалізує алгоритмічну структуру галуження. Алгоритм її виконання наступний: першим обчислюється значення вираження 1, яке зазвичай є деякою умовою. Якщо воно істинне, т. е. не рівне 0, то обчислюється вираження 2 і отриманий результат стає результатом операції. Інакше в якості результату береться значення вираза 3.

Приклад 1. Обчислення абсолютної величини змінною Х можна організувати за допомогою однієї операції:

Х<0 ? - X: X;

Приклад 2. Вибір більшого значення з двох змінних а і b:

mах=(а<=b)?b :а;

Приклад 3. Замінити більше значення з двох змінних а і b на одиницю:

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

Правила мови в даному випадку дозволяють ставити умовну операцію зліва від знаку привласнення.

Операції ( ) і [ ]. У мові Сі круглі і квадратні дужки розглядаються як операції, причому ці операції мають найвищий пріоритет. Їх сенс буде розкритий пізніше.

Підведемо підсумок усій розмові про операції Сі/Сі++, звівши їх в загальну таблицю. 2 і розташувавши по рангах. Ранг операції — це порядковий номер у ряді пріоритетів. Чим більше ранг, тим нижче пріоритет. У таблиці відбита ще одно властивість операцій — асоціативність. Якщо одна і та ж операція, що повторюється у вираженні кілька разів, виконується в порядку розташування зліва направо, то вона називається левоассоциативной; якщо виконується справа наліво, то операція правоассоциативная. У таблиці ці властивості відображені стрілками вліво і управо. Деякі операції, присутні в таблиці, поки не обговорювалися.

Таблиця 2

Пріоритети (ранги) операцій

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

• усі символи, що становлять вираження, записуються в рядок (немає надрядкових і підрядкових символів);

• у вираженні проставляються усі знаки операцій;

• при записі вираження враховуються пріоритети операцій;

• для впливу на послідовність операцій використовуються круглі дужки.

Деякі специфічні особливості запису виразів на Сі були описані вище при розгляді операцій мови.

В процесі обчислення виразів з різнотипними операндами проводиться автоматичне перетворення типів величин. Знання програмістом правил, по яких відбуваються ці перетворення, попереджає деякі помилки в записі виразів. Суть правил перетворення при виконанні бінарних операцій зводиться до наступного:

• перетворення не виконується, якщо обидва операнди мають однаковий тип;

• при різних типах операндів відбувається приведення величини з молодшим типом до старшого типу (окрім операції привласнення);

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

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

char→shot→int→long

Порядок старшинства речових типів наступний:

float→double→long double

Слід мати на увазі, що при перетворенні цілої величини до плаваючого типу може статися втрата точності (замість 1 вийде 0,999).

Наступний приклад ілюструє порядок виконання операцій і перетворення типів, що відбуваються, при обчисленні вираження (рис. 1, цифри вгорі — порядок операцій).

char ch; int i; float f;

double d; long double r;

(рис. 1)

Вправи

1. Визначити тип константи :

а) 315; б) - 32.4; в) 102408; г) 3.7Е57; д) 0315;

е) 0х24; ж) 2.6L; з) 70700U; и) ' 5'; к) '\121'.

2. У програмі оголошена змінна: int n=10. Визначити результати обчислень наступних виразів :

а) n++; б)++n; в) n%2; г) n/3; д) n/3.;

е) ++n+5; ж) 5+n++; з) (float) n/4;

и) sizeof(n); к) sizeof(l.*n).

3. Координати точки на площині задані змінними Х і Y. Записати наступні умови у формі логічних виразів:

а) точка лежить в першій чверті координатної площини;

б) точка лежить на осі X;

в) точка лежить на одній з осей;

г) точка лежить в першій або другій чверті усередині одиничного кола;

д) точка лежить на одиничному колі в третій або четвертій чверті;

е) точка лежить усередині кільця з внутрішнім радіусом 1 і зовнішнім радіусом 2 в другій або четвертій чверті.

4. У програмі оголошена змінна: float х=2. Яке значення отримає змінна х в результаті обчислення наступних виразів?

а) х+=2; б) х/=10; в) х*=(х+1); г) х+=х+=х+=1.

5. Визначити значення виразів для трьох варіантів оголошення змінної х : 1) float x=l.; 2) float x=10.; 3) int x=l.

a) x>i?2*x: x; б) x/5==2?5: x/10; в) х>0&&х<=1?1:0.

17