Пріоритет виконання операцій у виразах. Арифметичні висловлювання та операції. Складні математичні висловлювання

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

Якщо операції мають однаковий пріоритет, то черговість виконання таких операцій визначається за якістю асоціативності.

Асоціативність- Напрямок виконання операцій у разі, якщо операції мають однаковий пріоритет.

У таблиці 1 показані основні операції С++, їх пріоритет виконання і асоціативність.

Таблиця 1 - Пріоритет операцій у С++
Пріоритет Операція Асоціативність Опис
1 :: зліва направо унарна операція дозволу області дії
операція індексування
() круглі дужки
. звернення до члена структури чи класу
-> звернення до члена структури чи класу через покажчик
2 ++ зліва направо постфіксний інкремент
постфіксний декремент
3 ++ справа наліво префіксний інкремент
префіксний декремент
4 * зліва направо множення
/ поділ
% залишок від ділення
5 + зліва направо додавання
віднімання
6 >> зліва направо зрушення вправо
<< зрушення вліво
7 < зліва направо менше
<= менше чи одно
> більше
>= більше чи одно
8 == зліва направо одно
!= не дорівнює
9 && зліва направо логічне І
10 || зліва направо логічне АБО
11 ?: справа наліво умовна операція (тернарна операція)
12 = справа наліво привласнення
*= множення із присвоєнням
/= поділ із присвоєнням
%= залишок від поділу з привласненням
+= додавання з присвоєнням
-= віднімання з присвоєнням
13 , зліва направо кома

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

// неправильне вираження int value = 5; cout<< value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3

Компілятор не зрозуміє виразу в рядку 3, оскільки операція зсуву вліво має більший пріоритет, ніж операція підсумовування з присвоєнням. У результаті програму з таким виразом навіть не можна буде запустити. Суть у тому, що компілятор розуміє цей вислів не так, як ми, а зовсім по-іншому. Як міркуватиме компілятор: «У виразі дві операції, причому перша операція<< имеет больший приоритет, чем вторая += , Отже передам спочатку в потік виведення значення змінної value , а потім додам 3 к?????? А ні до чого додати 3, оскільки змінна value передається в потік виведення.» Ось у цьому і полягає помилка, а щоб її не було потрібно просто поставити круглі дужки.

// правильне вираження int value = 5; cout<< (value += 3); // передаем в поток вывода значение переменной value + 3

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

І в команді присвоювання, і в команді writeln ми використовували арифметичні вирази, замість яких Паскаль підставляв результати їх обчислень. Арифметичний вираз складається з констант, змінних та функцій, з'єднаних знаками арифметичних операцій.

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

Звичайний знак розподілу ( / ) у Паскалі використовується як дробовий розподіл, тобто, ділить речові числа, і результат розподілу - речове число. Навіть якщо поділити 6 на 3, результат буде не 2, а 2.0, тобто речове число. Крім дробового поділу є ще поділ без залишку div. Воно працює лише з цілими числами, і результат розподілу – ціле число. Залишок ігнорується. Якщо ж, навпаки, потрібний залишок від поділу, використовується операція mod. Наприклад, вираз 20 div 6дає 3 , а результат висловлювання 20 mod 6дорівнює 2 . Прогалини у цих виразах пропускати не можна. Операція mod буде корисна щодо, чи ділиться одна величина в іншу. Якщо залишок від розподілу дорівнює нулю, значить, ділиться без залишку.

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

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

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

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

char< int < long < float < double

За кількістю операндів, що у конкретної операції, розрізняють три групи операцій:

Унарні (один операнд);

Бінарні (два операнди);

Тернарна (три операнди).

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

Арифметичні операції

Мова Сі підтримує стандартний набір бінарних арифметиків.

чеських операцій:

Додавання (+);

Віднімання (-);

множення (*);

Розподіл (/);

Взяття залишку від поділу цілих операндів (%).

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

double pow(double x, double y);

що обчислює значення x у ступені y.

Слід пам'ятати, що результатом поділу цілих чисел є також ціле число, яке не має дробової частини: 7/4 дає в результаті одиницю! Якщо ж потрібно отримати залишок від цілого розподілу, то використовується операція взяття по модулю, що позначається символом %:

7%4 дає в результаті 3,

21%2 дає в результаті 1,

10% 5 дає в результаті 0.

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

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

Операція присвоєння

У мові Сі привласнення позначається одним знаком рівності (=). Чисельне значення правої частини присвоюється змінної, зазначеної зліва, причому перед цим завжди автоматично виконується перетворення числа, що заноситься до типу цієї змінної:

В результаті буде отримано значення a = 19.0.

Строго кажучи, зліва може стояти навіть вираз (!), правий

так, що має сенс адреси. Так, цілком коректно писати:

Сі допускає багаторазове присвоєння, наприклад:

У разі обчислення проводиться справа наліво, тобто.

значення z буде надано змінної w і потім змінної sum.

У результаті всі три змінні отримають те саме значення.

Сі допускає також багатосимвольні знаки надання. До

ним слід віднести += , -= , *= , %= ряд аналогічних знаків,

а також знаки префіксних та постфіксних операцій інкременту ++ та

декременту -.

┌─────────────────────────────────────────────┐

│ Всередині багатосимвольних знаків операцій не │

│ повинно бути пробілів!! │

└─────────────────────────────────────────────┘

Наведемо приклади скороченого запису надання за допомогою

символів багатосимвольних операцій:

i += 1; означає i = i +1;

i -= k; означає i = i-k;

i * = k; означає i = i * k;

i / = k; означає i = i/k;

Префіксні та постфіксні операції ++ і - означають відповід-

ственно інкремент і декремент змінної (не обов'язково цілої):

K – збільшує значення змінної k на одиницю

пе ред його використанням у виразі;

k++ - те ж після використання;

K – зменшує значення змінної k на одиницю

пе ред використанням;

k-- - те ж після використання.

Підкреслимо, що мова Сі не вбачає суттєвої різниці між арифметичним виразом та оператором. Будь-який вираз мови, що закінчується крапкою з комою, є правильним оператором Сі, наприклад:

Зрозуміло, результат поділу не присвоєно жодної змінної і, отже, буде втрачено, проте наступний запис цілком розумний:

що в даному випадку рівносильно запису

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

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

Якщо малося на увазі право обчислення виразу виду a + (++ b), то компілятор насправді сприйме вираз як (a ++) + b. Для з'ясування цієї ситуації нагадаємо поняття лексеми, що існує в мовах програмування.

Лексема - це одиниця тексту програми, сприймається компілятором як єдина конструкція, що розпізнається, яка не може бути розділена на більш дрібні частини, що розпізнаються компілятором. У мові Сі лексемами є:

Службові слова;

Ідентифікатори;

Знаки операцій та пунктуації;

Константи.

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

Висновок: щоб уникнути можливої ​​неоднозначності, рекомендується

використовувати пробіли або круглі дужки для явного раз-

поділу лексем у сумнівних місцях.

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

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

Таблиця 1.5.Пріоритет арифметичних операцій у системі MATLAB.

Арифметичні вирази.

Центральним поняттям усіх математичних систем та відповідних мов програмування є арифметичний вираз (математичний вираз).

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

Таблиця 1.6.Деякі приклади найпростіших арифметичних виразів, записаних за правилами системи MATLAB та загальноматематичними правилами.

Різниця у записах, поданих у таблиці 1.6. досить очевидна. У системі MATLAB арифметичні вирази записуються у вигляді одного рядка, причому замість коми як роздільник цілої та дробової частин числа використовується крапка (а ніяк не кома!). Арифметичні вирази будуються на основі чисел, констант, змінних, операторів та різних спецзнаків. Специфіка системи MATLAB полягає в тому, що арифметичні вирази задаються як один рядок. Приміром, записується як 2^5. Знак «;» (точка з комою) в кінці рядка блокує виведення результату обчислень, проте системна змінна ans дозволяє вивести результат обчислень (в режимі командного рядка):

>> 2^5; >> ans ans =

приклад. Потрібно обчислити такі арифметичні вирази:

1) при

2) при

3) при

4) при

Текст М-файлу.



k=2;r=2;x=2;y=1; r1=abs(r)^(5*x*y)+tan(3*k) x=.5; r2=sqrt(log(x)^2+1)+3*x^(1/3) x=1; y=2; z=3; r3=(x+3*y)/(2*z)-3*abs(x)*exp(x+y)/(x+y)+1/(1+1/(1+1/x) ) x = 0.3; r4=sin(x/2)^3+cos(x^2)-2*cos(3*x)^(1/5)

Результати розрахунку у командному вікні:

Слід звернути увагу на те, що для перегляду результатів роботи оператора знак «;» не ставиться.

Вітаю вас, шановні читачі блог сайт! Минулого разу ми розглядали питання про вбудовану мову 1С:Підприємство 8. Сьогодні ми поговоримо про про пріоритети арифметичних операцій примітивних типів даних, а також розглянемо кілька підряд арифметичних операцій. Давайте подивимося!

З програми школи, ви знайомі з тим, що найвищим пріоритетом в арифметичних операціяхє круглі дужки "()".
Якщо вираз знаходиться у круглих дужках, то перш за все буде виконуватися саме воно. Наступним за пріоритетом йдуть унарні операції "+" і "-", унарна операція означає, що вказується операція та одне значення, наприклад "-5". Третіми виконуються операції множення і розподілу й у останню чергу додавання і віднімання. Давайте розглянемо як це працює:

99+15/5*8

У цьому випадку на початку 15 буде розділено на 5, отримане число помножено на 6 і третя операція: 99 додатись до отриманого числа. Далі такий простий вираз 10+5/2+1. Зрозуміло, що першим виконаються операція поділу, далі виконаються операція складання. Якщо використовувати дужки:

(90+30)/(7+5)

У цьому випадку на початку ми складемо 90 і 30 і поділимо все це на 7+5 і в цьому випадку вираз дорівнює 10. Розглянемо інші операції, які можливі в програмному коді 1С:Підприємство 8. Можливо, ви працювали в PHP, де можливий такий оператор i++;або i-;. Це інкремент чи декремент однією одиницю. Виконання таких операторів у 1С неможливе, але можливий оператор i++1;і j-1;. Давайте розберемо їх докладніше. Це цілком нормальний оператор. Відкриємо модуль будь-якого довідника у Конфігураторі:

Конфігурація -> Довідники -> Номенклатура, правою кнопкою миші викличемо пункт Відкрити модуль об'єкту.

Щоб не було помилки, оголосимо змінну в цьому програмному коді:

A=0; b=a++1;

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

A=0; b = a + 1;

Взагалі, переклади рядків не впливають на виконання операторів. Як працюватиме такий оператор? Компілятор мови 1С спочатку виконає унарну операцію плюса, тобто +1 дасть 1 і потім до aдодасть одиницю. Це те саме що скласти a з одиницею. Так само можна написати:

A=0; b=a+-1;

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

Отже, ми з'ясували, що система спокійно відпрацьовує операцію, де зустрічаються дві поспіль арифметичні операції, наприклад ++, +-, -+, а що буде, якщо ми напишемо кілька арифметичних операцій поспіль? Це можна перевірити. Для цього відкриємо 1С:Підприємство з Конфігуратора в режимі налагодження, клавіша F5. Поставимо крапку зупинки, клавіша «F9», в кінці нашого виразу і введемо простий вираз у табло. У Конфігураторі відкриємо пункт меню Налагодження -> Табло.

Запишемо в табло вираз 3+++5, зверніть увагу, на виході у нас виходить помилка у виразі. Платформа такого перетворення зробити не може. Вираз 3++5 спрацьовує, тоді як із трьома плюсами система не розуміє, чого саме від неї хочуть. Але якщо поставити дужки 1++(+2) , все це буде виконано коректно. Як бачимо, щоб правильно організувати роботу арифметичних операцій необхідно добре розуміти пріоритети їх виконання. У наступній статті ми розглянемо.

 

Будь ласка, поділіться цим матеріалом у соціальних мережах, якщо він виявився корисним!