Порядок обчислення значення виразу базується на таких правилах:
1) з двох сусідніх операцій першою буде виконана та, пріоритет якої вищий;
2) операції однакового пріоритету виконуються зліва направо або з права наліво залежно від асоціативності, встановленої для даної групи операцій (табл. 4.1);
3) порядок виконання операцій можна змінити за допомогою круглих дужок – вираз у дужках обчислюється першим і розглядається як операнд зовнішньої операції.
Стандарт мови програмування С++ не встановлює порядку звертання до операндів в процесі виконання операції. Тобто, у виразі
w = (a + b) * (a - b);
операцію множення гарантовано буде виконано перед операцією присвоєння і після обчислення значень виразів у дужках. Але який з двох операндів – виразів (a+b) чи (a-b) буде обчислений першим – не визначено. В деяких випадках значення виразу залежить від порядку звертання до операторів. Наприклад
d = c + twice(&c);
Функція twice вдвічі збільшує значення змінної, адреса якої передана їй в якості параметра, і повертає нове значення. Нехай початкове значення змінної с дорівнює 5. Тоді значення виразу, що буде присвоєний змінній d, може дорівнювати 5+10=15, якщо першим буде вибраний лівий операнд, а потім – правий; або 10+10=20, якщо спочатку обчислюється правий операнд, тобто відбувається виклик функції, яка змінює значення с. Необхідно уникати виразів, результати обчислення яких можуть бути неоднозначними.
Арифметичні операції
До арифметичних належать такі операції (згідно з порядком старшинства операції):
1) - (зміна знака операнда, унарна операція);
2) * / % (множення, ділення, остача від ділення, бінарні операції);
3) + - (додавання, віднімання, бінарні операції).
Операції * / + - виконуються над операндами всіх числових типів (цілих і дійсних), операція % потребує двох цілочислових операндів. Результат виконання всіх арифметичних операцій над двома операндами цілого типу завжди є цілим.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int a = 7, b = 3; // 7 = 3 * 2 + 1
cout << a / b << endl; // 2
cout << a % b << endl; // 1
cout << (double)a / b << endl; // 2.3333
}