В мові програмування С++ застосовуються три логічні операції:
1) ! логічне заперечення, унарна операція;
2) && логічне І, бінарна операція;
3) || логічне АБО, бінарна операція.
Операндами логічних операцій є логічні дані – істина (true) і хибність (false). Результатом логічної операції є величина логічного типу. Операндами також можуть бути числові дані: будь яке не нульове значення – це істина, нуль – хибність. Цей підхід використовується в мові програмування С, в якій немає логічного типу даних bool.
Операція логічного заперечення змінює логічне значення на протилежне. Тобто,
#include <iostream>
using namespace std;
int main(){
bool a = true;
cout << a << endl; // 1
cout << !a << endl; // 0
}
Результат бінарної операції && буде істинним (не буде дорівнювати нулю), тільки в тому разі, коли обидва операнди є істинними (не дорівнюють нулю). Результат виконання операції || буде істинним, коли істинним є хоча б один з операндів.
Логічні вирази в С++ не обов’язково мають бути обчислені повністю. Як тільки значення виразу стає однозначним, подальші обчислення припиняються. При цьому, лівий операнд логічної операції обчислюється першим, а правий – другим. Це дає можливість записувати вирази, в яких одразу виконується зміна даних і перевірка. В деяких випадках це може призводити до некоректної роботи програми. Наприклад:
1 #include <iostream>
2 using namespace std;
3 int main(){
4 int a1 = 0, b1 = 1, c1 = 2;
5 int a2 = 0, b2 = 1, c2 = 2;
6 bool r;
7 r = b1 < c1 && ++a1 > 0; // r = true
8 cout << "a1 = " << a1 << endl; // a = 1
9 r = b2 > c2 && ++a2 > 0; // r = false
10 cout << "a2 = " << a2 << endl; // a = 0
11 }
В програмі обчислення значення змінної r виконується в рядках 7 і 9. В обох випадках використовують логічну операцію І. При виконанні операції І першим буде обчислене значення лівого операнда. Якщо це false, то незалежно від значення правого операнда результат виконання операції буде false, і вираз справа від знака операції І обчислений не буде. В прикладі в рядку 7 обчислюються вирази і зліва, і заправа від знака операції І, в рядку 9 – лише зліва. Таким чином, незважаючи на те, що пріоритет операції префіксного інкременту більший пріоритетів логічних операцій і операцій порівняння, в рядку 9 змінна а не буде збільшена на одиницю.