У Сі використовується той же набір операцій відношення, що і в Паскале. Слід лише звернути увагу на відмінність в записі операцій «рівно» і «не рівно».
< менше
<= менше або рівно
> більше
>= більше або рівно
= = рівно
! = не рівно.
Як вже говорилося раніше, в стандарті Сі немає логічного типу даних. Тому результатом операції відношення є ціле число: якщо відношення істинне — те 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 є саме операцією. Її пріоритет вищий, ніж у бінарних арифметичних операцій, логічних операцій і стосунків. Приклади використання операції :

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