M_CI_3
.pdfЛабораторна робота № 3.
(2 години)
Вирази. Оператори.
Мета роботи: здобуття знань та практичних навичок роботи з виразами різних типів: арифметичними, логічними та порозрядними.
3. Теоретичнi вiдомостi.
Оператори служать основними елементами, з яких будується програма на мові Сі, а більшу частину операторів складають вирази. Тому спочатку потрібно розглянути вирази.
Вирази представляють собою деяку комбінацію операцій та операндів. Операндами є ті елементи виразу, над якими виконуються операції. Ними можуть бути: константи, змінні (прості змінні, елементи масивів, поля структур та об’єднань, покажчики). Найпростіший вираз складається із одного операнда, і це може служити відправним пунктом для побудови більш складних виразів.
Всім змінним відповідають області пам`яті, з яких можна прочитати і в які можна записати їх значення. Ліводопустимим називається такий вираз, який дозволяє як зчитувати значення об`єкту, який він визначає, так і змінювати його. Назва походить від того, що ліводопустимий вираз може використовуватись в лівій частині виразу присвоєння. Відповідно, праводопустимий вираз може використовуватись тільки в правій частині виразу присвоєння.
Ліводопустимі вирази:
Імена змінних, описані як арифметичні, покажчики, перераховуючі або об`єднання;
Вирази в круглих дужках, причому тоді і тільки тоді коли вираз є ліводопустимим;
Вираз, який визначає поле (expr.field), причому якщо expr теж є ліводопустимим;
Вираз, який задає непрямий вибір поля (expr−>field);
Непрямий вираз *expr.
Наступні об`єкти ніколи не можуть бути ліводопустимими:
Ім`я функції;
Ім`я масиву (але елемент масиву або посилання на нього є ліводопустимим);
Константа перераховуючого типу;
Виклик функції.
Мова Сі має сім типів операцій. Далі ми розглянемо арифметичні і логічні операції, операції відношень, заперечення, інкременту та декременту а також порозрядні операції.
3.1. Арифметичні операції.
Операнди, які можуть брати участь в арифметичних операціях повинні мати скалярні типи (цілі та дійсні). Результат операції має той же тип.
|
|
|
|
Таблиця 3.1 Арифметичні операції |
|
||||
|
Операція |
|
Опис |
|
Приклад |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
(a + b) |
|
|
||
|
* |
|
Множення |
|
|
|
|
||
|
/ |
|
Ділення |
|
(a / b) |
|
|
|
|
|
+ |
|
Додавання |
|
(a + b) |
|
|
|
|
|
− |
|
Віднімання |
|
(a - b) |
|
|
|
|
|
% |
|
Залишок від ділення |
|
(a % b) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Приклад 3.1
1:#include <stdio.h>
2:#include <stdlib.h>
3:
29
4:main()
5:{
6:double fredegrees, credegrees;
7:char answer[128];
8:
9:printf("Перетворення градусів по Фаренгейту в градуси по Цельсію\n\n");
10:printf("Градуси по Фаренгейту?: ");
11:gets(answer);
12:fredegrees = atof(answer);
13:credegrees = ((fredegrees - 32.0) * 5.0) / 9.0;
14:printf("Градуси по Цельсію = %f\n ", credegrees);
15:return 0;
16:}
До пріоритетів ми повернемося після розгляду всіх операцій.
3.2. Операції відношень.
Операнди, які можуть брати участь в операціях повинні мати скалярні типи (цілі та дійсні). Результат операції має логічний тип. Логічними значеннями є Істина (True) та
Фальш (False).
Окремого логічного типу в мові Сі не існує. Замість нього використовується тип int, істини – 1, фальші – 0.
|
|
|
Таблиця 3.2 Операції відношень |
Знаки операцій |
Опис |
Приклад |
|
|
|
|
|
< |
|
Менше |
a < b |
<= |
|
Менше або дорівнює |
a <= b |
> |
|
Більше |
a > b |
>= |
|
Більше або дорівнює |
a >= b |
== |
|
Дорівнює |
a == b |
!= |
|
Не дорівнює |
a != b |
|
|
|
|
|
|
|
|
Примітка! |
|
|
|
|
|
|
|
Не плутайте операцію рівності == з операцією присвоєння = .
3.3. Логічні операції.
Операнди, які можуть брати участь в операціях повинні мати логічні типи. Результат операції має теж логічний тип.
|
|
Таблиця 3 Логічні операції |
Логічні операції |
Значення |
Приклад |
|
|
|
&& |
І |
a && b |
|| |
АБО |
a || b |
! |
НЕ |
!a |
|
|
|
Логічні операції && та || об`єднують вирази відношень у відповідності до правил логічних І та АБО. Приклади:
1:(A < B) && (B < C)
2:(A < B) || (B < C)
Складні логічні вирази обраховуються раціональним способом. Наприклад, якщо при обрахуванні виразу
1: (A <= B) && (B <= C)
30
виявилось, що А більше В, то подальші обрахунки не будуть проводитись, а значення всього виразу буде дорівнювати Фальші.
3.3.1. Операція заперечення.
Унарна операція заперечення використовується для інвертування значення будь-якого логічного виразу.
Вираз !(A < B) еквівалентний виразу (A > B).
Вираз !(A == B) еквівалентний виразу (A != B).
3.3.2. Операції інкременту та декременту.
Операція інкременту ++ додає до операнда одиницю, а операція декременту -- зменшує операнд на одиницю. Приведені нижче дві пари виразів є еквівалентними по результату (але не по ефективності):
1:і = і + 1;
2:і++;
3:і = і - 1;
4:і --;
Якщо знак операції йде за своїм операндом, то значення виразів і++ та і—-дорівнюють значенню і до модифікації. Іншими словами, операція
1: j = і++;
присвоює змінній значення змінної, яке вона мала до виконання операції інкременту. Наприклад, якщо значення і дорівнює 7, то після виконання операції значення і буде дорівнювати 8 , а значення j буде дорівнювати 7.
Якщо знак операції стоїть перед своїм операндом, то значення виразів ++і та –-і дорівнюють значенню і після модифікації. Іншими словами, операція
2: j = ++і;
присвоює змінній значення змінної, яке вона має після виконання операції інкременту. Наприклад, якщо значення і дорівнює 7, то після виконання операції значення і буде дорівнювати 8 , і значення j буде дорівнювати 8.
Рядок 1 еквівалентний такій послідовності виразів:
1:j = i;
2:i++;
арядок 2 еквівалентний такій послідовності виразів:
16:}
Якщо ви введете, наприклад, значення 8, то програма виведе:
v++ |
Перед |
Під час |
Після |
8 |
8 |
9 |
|
v-- |
8 |
8 |
7 |
++v |
8 |
9 |
9 |
--v |
8 |
7 |
7 |
3.4. Порозрядні операції.
Таблиця 3.4
Операція |
Опис |
Приклад |
|
|
|
& |
І (and) |
A & B |
| |
АБО (or) |
A | B |
^ |
Заперечення еквівалентності |
A ^ B |
<< |
Зміщення вліво |
A << B |
>> |
Зміщення вправо |
A >> B |
~ |
Заперечення |
~A |
|
|
|
3.4.1. Відображення значень у двійковому форматі.
Функції Сі (наприклад printf()) відображають значення в будь-яких форматах, але двійкового вони не підтримують. Приведена далі функція display_bits() (розміщена, наприклад, у файлі "SHOW_BIT.C") дозволяє виконати виведення значень у двійковому форматі:
Файл "SHOW_BIT.C"
|
|
|
|
|
|
1: |
void display_bits(unsigned n) |
6: |
bit_position >= 0; |
||
2: |
{ |
|
|
7: |
bit_position --) |
3: |
const int max_position = 15; |
8: |
printf("%d", n>>bit_position & 1); |
||
4: |
int bit_position; |
9: |
} |
||
5: |
for (bit_position = max_position; |
10: |
|
Програма, яка буде включати файл "SHOW_BIT.C ", повинна включати файл <stdio.h>.
3.4.2. Порозрядний операція І.
Приведений приклад програми пояснює дію операції І.
Приклад: 3.3
1:#include <stdio.h>
2:#include "Show_bit.c"
3:
4: void display_bits(unsigned n);
5:
6:main()
7:{
8:unsigned v1, v2, v3;
9:clrscr();
10:printf("Введіть два цілих числа: , (наприклад: 1021 15)");
11:scanf("%u%u ",&v1, &v2);
12:v3 = v1 & v2;
13: printf("\n |
%5u %5#06x ", v1 ,v1); to_bin(v1); |
14:printf("\nAND %5u %5#06x ", v2 ,v2); to_bin(v2);
15:printf("\n=================================\n");
16: printf("\n |
%5u %5#06x ", v3 ,v3); to_bin(v3); |
32
17:return 0;
18:}
Примітка: символ - це пробіл в тексті програми
В таблиці 3.5 приведено правила, за якими діє порозрядний операція І. . Зверніть увагу на директиву в другому рядку. За допомогою цього засобу можна підключити до своєї програми файл show_bit.c, в якому знаходиться функція display_bits().
Таблиця 3.5
A |
& |
B |
== |
C |
|
|
|
|
|
0 |
& |
0 |
== |
0 |
0 |
& |
1 |
== |
0 |
1 |
& |
0 |
== |
0 |
1 |
& |
1 |
== |
1 |
|
|
|
|
|
Примітка: А, В та С - значення розряду. Переносу в старший розряд немає.
Програма виведе:
1021 0x03fd 0000001111111101 AND 15 0x000f 0000000000001111
======================================
13 0x000d 0000000000001101
Число 15 в двійковому форматі дорівнює 1111 (без ведучих нулів). Це число (15) називається маскою, а те, що стоїть перед ним і з`єднане знаком порозрядної операції, - операндом. Розряди значення, які відповідають 1 в масці, попадають в результат, а розряди, які відповідають 0, обнуляються в результаті.
3.4.2.Порозрядна операція АБО.
Втаблиці 3.6 приведено дію порозрядної операції АБО.
Таблиця 3.6 Порозрядна операція АБО
A |
| |
B |
== |
C |
|
|
|
|
|
0 |
| |
0 |
== |
0 |
0 |
| |
1 |
== |
1 |
1 |
| |
0 |
== |
1 |
1 |
| |
1 |
== |
1 |
|
|
|
|
|
Примітка: А, В та С - значення розряду. Переносу в старший розряд немає.
Приведена нижче програма демонструє дію порозрядної операції АБО.
Приклад: 3.4
1:#include <stdio.h>
2:#include "show_bit.c"
3:
4: void display_bits(unsigned n);
5:
6:main()
7:{
8:unsigned v1, v2, v3;
9:printf("\nВведіть два цілих числа, наприклад: 1021 15\n");
10:scanf("%u%u",&v1,&v2);
11:v3 = v1 | v2;
12: printf("\n |
%5u %#06x ",v1, v1); display_bits(v1); |
13:printf("\nOR %5u %#06x ",v2, v2); display_bits(v2);
14:printf("\n=================================\n ");
15: printf("\n |
%5u %#06x ", v3 ,v3); display_bits(v3); |
33
16:return 0;
17:}
Результат роботи програми:
1021 0x03fd 0000001111111101 OR 15 0x000f 0000000000001111
=================================
1023 0x03ff 0000001111111111
Як видно, результат в двійковому форматі має всі встановлені в "1" розряди превинного числа (1021), плюс нові одиничні розряди із маски (15). Таким чином одиниці із маски будуть включені в значення результату для будь-якого значення операнда.
Нульові розряди маски дозволяють попасти в результат перевинним розрядам операнда.
3.4.2. Порозрядна операція заперечення еквівалентності (eXclusive OR).
Ця операція має такі назви: заперечення еквівалентності, додавання по модулю два. A XOR B істинне тоді і тільки тоді, коли значення A і B не співпадають.
В таблиці 3.7 приведено дію порозрядної операції XOR.
Таблиця 3.7. Порозрядна операція заперечення еквівалентності
A |
^ |
B |
== |
C |
|
|
|
|
|
0 |
^ |
0 |
== |
0 |
0 |
^ |
1 |
== |
1 |
1 |
^ |
0 |
== |
1 |
1 |
^ |
1 |
== |
0 |
|
|
|
|
|
Приклад: 3.5
1:#include <stdio.h>
2:#include "e:\c_pp\show_bit.c"
3:
4: void display_bits(unsigned n);
5:
6:main()
7:{
8:unsigned v1, v2, v3;
9:printf("\nВведіть два цілих числа, наприклад: 1021 15\n");
10:scanf("%u%u",&v1,&v2);
11:v3 = v1 ^ v2;
12: printf("\n |
%5u %#06x ",v1, v1); display_bits(v1); |
13:printf("\nXOR %5u %#06x ",v2, v2); display_bits(v2);
14:printf("\n=================================");
15: |
printf("\n |
%5u %#06x ", v3 ,v3); display_bits(v3); |
16: |
return 0; |
|
17: |
} |
|
Результат роботи програми після введення двох чисел 45000 і -1 буде мати вигляд (поскільки число -1, як знакове 16-ти бітне має вигляд : 0xffff, і такий же вигляд має і беззнакове v2, яке приймає значення 65535).
XOR |
45000 |
0xafc8 |
1010111111001000 |
65535 |
0xffff |
1111111111111111 |
|
===================================== |
|||
|
20535 |
0x5037 |
0101000000110111 |
При |
використанні числа 65535 (0xffff 1111111111111111) в якості маски, в |
двійковому представленні всі нулі операнда перетворяться в одиниці результату і навпаки.
34
Тобто, всі біти операнду перемкнуться на протилежні. Якщо тепер в якості операнда взяти
результат попередньої операції, то в результаті одержимо: |
|
|
|
|
|
||||||||||||||||||||
XOR |
20535 |
0x5037 |
|
0101000000110111 |
|
|
|
|
|
|
|||||||||||||||
65535 0xffff |
|
1111111111111111 |
|
|
|
|
|
|
|||||||||||||||||
====================================== |
|
|
|
|
|
||||||||||||||||||||
|
|
|
45000 0xafc8 |
|
1010111111001000 |
|
|
|
|
|
|
||||||||||||||
|
|
Це справедливо для будь-якої маски. Тобто, якщо виконуються дві рівності : |
|
|
|||||||||||||||||||||
|
|
С = A ^ B та D = C ^ B; |
|
|
|
|
|
|
|
|
|
|
|||||||||||||
то справедлива і рівність A = D. |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
7 |
6 |
|
|
5 |
4 |
3 |
2 |
|
1 |
0 |
|
|
|
|
|
|
|
|
3. 4.3 Зсув ліворуч. |
|
|
||||
|
|
|
|
|
|
|
|
|
|
Операція |
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
1 0 1 0 1 |
1 0 1 |
|
|
|
|
|
3 |
|
C = A << B; |
|
|
|
|||||||||||
|
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
присвоює змінній С значення змінної А, |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
зсунуте на В бітів ліворуч. Наприклад, |
|||||
|
|
|
|
7 |
|
6 |
5 |
4 |
3 |
|
2 |
1 |
|
0 |
|
|
якщо А = |
173, В |
= 3, то в результаті |
||||||
|
|
|
|
|
0 |
|
1 |
1 |
0 |
1 |
|
0 |
0 |
|
|
0 |
|
0 |
операції ми одержимо значення С |
= |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1384. Механізм дії операції зсуву бітів |
|||||
|
|
|
|
C |
|
|
|
C = A <<B; |
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
праворуч |
при |
вказаних |
значеннях |
|||||||||||
|
|
|
|
|
|
|
|
Рис. 3.1 |
|
|
|
|
|
|
|
|
|
операндів |
показано на |
рис. |
3.1. |
Код |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
програми |
і результат її |
дії |
приведено |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нижче.
Приклад: 3.6
1:#include <stdio.h>
2:#include "e:\c_pp\show_bit.c"
3:
4: void display_bits(unsigned n);
5:
6:main()
7:{
8:unsigned v1, v2, v3;
9:printf("\nВведіть два цілих числа, наприклад: 1021 15\n");
10:scanf("%u%u",&v1,&v2);
11:v3 = v1 << v2;
12: printf("\n |
%5u %#06x ",v1, v1); display_bits(v1); |
13:printf("\n<< %5u %#06x ",v2, v2); display_bits(v2);
14:printf("\n=================================");
15: |
printf("\n |
%5u %#06x ", v3 ,v3); display_bits(v3); |
16: |
return 0; |
|
17: |
} |
|
1730x00ad 0000000010101101
<<3 0x0003 0000000000000011
=================================
1384 0x0568 0000010101101000
В двійковому представлені зсув бітів вліво на В розрядів еквівалентно множенню первинного значення на 2В (це справедливо і для інших систем числення). Така операція множення є найшвидшою операцією множення на 2n, де n - ціле число.
35
|
|
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
|
|
|
|
3 |
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
C |
|
|
|
|
|
C = A >>B; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
Рис. 3.2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нижче.
3.4.4. Зсув праворуч.
Операція
C = A >> B;
присвоює змінній С значення змінної А, зсунуте на В бітів праворуч. Наприклад, якщо А = 89, В = 3, то в результаті операції ми одержимо значення С = 11. Механізм дії операції зсуву бітів праворуч при вказаних значеннях операндів показано на рис. 3.2. Код програми і результат її дії приведено
Приклад: 3.7
1:#include <stdio.h>
2:#include "e:\c_pp\show_bit.c"
3:
4: void display_bits(unsigned n);
5:
6:main()
7:{
8:unsigned v1, v2, v3;
9:printf("\nВведіть два цілих числа, наприклад: 1021 15\n");
10:scanf("%u%u",&v1,&v2);
11:v3 = v1 >> v2;
12: printf("\n |
%5u %#06x ",v1, v1); display_bits(v1); |
13:printf("\n>> %5u %#06x ",v2, v2); display_bits(v2);
14:printf("\n=================================");
15:printf("\n %5u %#06x ", v3 ,v3); display_bits(v3);
16:return 0;
17:}
Програма виведе:
89 0x0059 0000000001011001 >> 3 0x0003 0000000000000011
=================================
11 0x000b 0000000000001011
3.4.5. Доповнення до одиниці.
Операція порозрядного доповнення до одиниці, представлена символом ~ (в математиці - тильда), перемикає всі біти операнда з 1 на 0, і навпаки з 0 на 1. Доповнення до 1 - це унарна операція. Унарна операція ~ може використовуватись для порозрядного заперечення
двійкових значень. Приклад:
A = ~ B;
Приведена нижче програма демонструє дію операції ~.
Приклад: 3.8
1:#include <stdio.h>
2:#include "e:\c_pp\SHOW_BIT.C"
3:
4: void display_bits(unsigned n);
5:
36
6:main()
7:{
8:unsigned v1, v2;
9:printf("\nВведiть цiле число:\n");
10:scanf("%u",&v1);
11:v2 = ~ v1;
12: printf("\n
13:printf("\n================================== ");
14:printf("\nCOMP %5d %#06x ", v2 ,v2);display_bits(v2);
15:return 0;
16:}
Доповнення до одиниці є двійковою логічною операцією і має два основних призначення: інвертування значень "істина" та "фальш", а також перетворення від`ємних значень в додатні і навпаки. Якщо при виконанні програми ввести -45, то результат
виконання програми буде таким:
-45 0xffd3 1111111111010011
=====================================
COMP |
44 0x002c |
0000000000101100 |
Якщо тепер до результату 44 додати 1, то ми одержимо 45, тобто додатне число. При введенні числа 45 ми одержимо такий результат:
45 0x002d 0000000000101101
====================================
COMP -46 0xffd2 1111111111010010
Додавши 1 ми одержимо -45. Таким чином, для перетворення від`ємних чисел в додатні, і навпаки, необхідно до аргументу застосувати операцію доповнення до одиниці, а потім до результату додати 1 (звідси і назва операції). Дія цієї операції еквівалентна операції заперечення еквівалентності над операндом з використанням в якості маски значення 1111111111111111 (або 65535 в десятковій і FFFF В шістнадцятковій системах числення відповідно).
При введенні "0" ми одержимо:
0 0х0000 0000000000000000
==================================
COMP -1 0xffff 1111111111111111
При введенні "-1" ми одержимо:
-1 0xffff 1111111111111111
==================================
COMP |
0 0х0000 0000000000000000 |
|
При введенні "1" ми одержимо: |
||
1 |
0x0001 |
0000000000000001 |
================================== |
||
COMP -2 |
0xfffe |
1111111111111110 |
Як бачимо, ~0 є "істина" (будь-яке ненульове значення), але застосування цієї операції до довільного не нульового значення, не завжди дає "фальш" ("0").
3.5 Операції присвоєння.
Про праводопустимі та ліводопустимі вирази ми вже говорили. Два операнди: ліводопустимий та праводопустимий та знак операції "=", є виразом присвоєння. І цей вираз має значення. Тому вираз присвоєння є ліводопустимим. Тобто вираз:
C = A = B;
правильний. Так можна ініціювати кілька змінних однакового типу однаковими константами:
C = A = B = 45;
37
3.5.1. Скорочені операції присвоєння.
Звична операція присвоєння
A = A + 45;
не є раціонально побудованою. В цьому виразі є два звертання до змінної А, що потребує подвійного обчислення адреси змінної А (один раз для знаходження значення змінної, другий - для запису значення виразу А + В).
Попередній вираз можна записати так:
A += 45;
Такий запис операції присвоєння допоможе компілятору генерувати більш раціональний код. Скорочений запис вказує компілятору взяти значення 45 додати до нього значення змінної А і запам`ятати його знову таки в змінній А.
Далі приведено повний перелік операцій присвоєння:
*=, /=, +=, -=, %=, <<=, >>=, &=, ^= i |=.
Кожен з них дозволяє звести символічний запис виразу (псевдокод)
i = i op j; |
|
до більш короткого псевдокоду: |
|
i op= j; |
|
Приклади виразів: |
count = count + 10; |
count += 10; |
|
count *= 2; |
count = count * 2; |
count /= 3; |
count = count / 3; |
count %= 16; |
count = count % 16; |
3.6.Пріоритети операцій.
Вскладних виразах операції з більш високим пріоритетом виконуються раніше операцій
збільш низьким пріоритетом (таблиця 3.8). Одні операції виконуються зліва - направо, інші справа - наліво. Ця властивість називається асоціативністю.
Для того, щоб не запам`ятовувати пріоритети, потрібно використовувати круглі дужки. Їх кількість не впливає на швидкість виконання операцій, а програма стає більш зрозумілою.
Таблиця 3.8. Пріоритети операцій
|
Рівень |
|
|
|
|
Операції |
Порядок |
|
|
пріоритету |
|
|
|
|
|
|
обчислень |
|
|
|
|
|
|
|
|
|
|
1 |
() |
. |
[ |
] |
-> |
|
Зліва направо |
|
2 |
* |
& |
! ~ |
++ |
-- + |
- (тип)sizeof |
Справа наліво |
|
3 |
* |
/ |
% |
|
|
|
Зліва направо |
|
4 |
+ |
- |
|
|
|
|
Зліва направо |
|
5 |
<< |
>> |
|
|
|
|
Зліва направо |
|
6 |
< |
<= |
> |
>= |
|
|
Зліва направо |
|
7 |
== |
!= |
|
|
|
|
Зліва направо |
|
8 |
& |
|
|
|
|
|
Зліва направо |
|
9 |
^ |
|
|
|
|
|
Зліва направо |
|
10 |
| |
|
|
|
|
|
Зліва направо |
|
11 |
&& |
|
|
|
|
|
Зліва направо |
|
12 |
| | |
|
|
|
|
|
Зліва направо |
|
13 |
?: |
|
|
|
|
|
Справа наліво |
|
14 |
*=, /=, +=, -=, %=, <<=, >>=, &=, ^= i |= |
Справа наліво |
|||||
|
15 |
, |
|
|
|
|
|
Зліва направо |
|
|
|
|
|
|
|
|
|
Приклад використання круглих дужок: |
y = (a * x + b) / (x + c); |
|||||||
y = ((a * x) + b) / (x + c); |
38