Operator logiczny w programowaniu – operator dostępny w określonym języku programowania (a także w innych językach komputerowych), który działając na argumentach reprezentujących wartości logiczne, w wyniku zwraca również wartość logiczną, realizując podstawowe operacje algebry Boole’a.
To jakie operatory logiczne są dostępne w konkretnym języku programowania zależy od jego składni, a to jakie są zasady ich stosowania, w tym priorytet tych operatorów i kolejność opracowywania argumentów, od przyjętej przez autorów języka lub implementacji konwencji. Zróżnicowany jest również sposób zapisu operatorów logicznych w poszczególnych językach: stosuje się zapis, bądź w postaci słów kluczowych, bądź symboli (znaku lub znaków niebędących literami). Stosowane są operatory logiczne jednoargumentowe – operator negacji, oraz dwuargumentowe – np. suma logiczna, iloczyn logiczny i inne.
Operatory logiczne udostępnione w językach komputerowych realizują następujące operacje logiczne:
Jak wyżej zaznaczono zapis w kodzie źródłowym operatorów logicznych zależne jest od przyjętej w składni danego języka sposobu reprezentacji znakowej operatorów, przy czym stosowane są zasadniczo dwa rozwiązania:
and, or, xor itp., takie rozwiązanie dostępne jest m.in. w języku Pascal, Visual Basic i innych,&&, || itp. takie rozwiązanie dostępne jest m.in. w języku C, C++ i innych.W językach programowania oprócz operatorów logicznych występują także i inne, w tym operatory bitowe, realizujące odpowiednie operacje logiczne na pojedynczych bitach. W pewnych językach, np. C, C++, zapis tych operatorów jest różny, np. dla iloczynu bitowego jest to symbol: &, natomiast dla iloczynu logicznego jest to symbol: &&. W innych językach stosowany jest jednolity zapis tych operatorów, a to czy realizowana jest operacja logiczna czy bitowa zależne jest od typu argumentów, tak jest m.in. w języku Pascal, np. iloczyn bitowy oraz iloczyn logiczny realizowany jest za pomocą operatora reprezentowanego przez słowo kluczowe: and, co stanowi tzw. przeciążanie operatorów.
Operatory logiczne stosuje się w wyrażeniach, których rezultat jest typu logicznego, zarówno w przypisaniu, jak i w wyrażeniach reprezentujących określone warunki realizacji algorytmu, np. w instrukcji warunkowej, pętli repetycyjnej i inne. Dają one możliwość budowania złożonych warunków, badających spełnienie bądź niespełnienie wielu różnych kryteriów równocześnie.
Przykłady:
| język programowania | w przypisaniu | w instrukcji warunkowej | w pętli repetycyjnej |
|---|---|---|---|
| C |
{
int v, *pa;
v = !pv==v || v==0;
}
|
if(a<c && c>d)
{
/* instrukcje */
}
|
do
/* instrukcje */
while(!(v || c<b));
|
| Pascal |
var b : boolean;
…
begin
…
b:=(a<c) and (c>d);
…
end;
|
if (a<c) and (c>d) then
begin
{ instrukcje }
end;
|
repeat
{ instrukcje }
until not(v or (c<b));
|
Zagadnienie implementacji operatorów logicznych w językach komputerowych wiąże się jak wyżej zaznaczono ustalenie reguł ich stosowania obejmujących między innymi ich priorytet, łączność, zasady opracowywania argumentów i inne aspekty.
Z priorytetem operatorów logicznych wiąże się zagadnienie kolejności wykonywania obliczeń w wyrażeniach, co ma szczególne znaczenie przy budowaniu warunków złożonych w wyrażeniach reprezentujących określone warunki realizacji algorytmu. Istotne jest również, czy zawsze opracowywane są dla takich operatorów wszystkie argumenty, nawet wtedy, gdy już na podstawie jednego z nich można określić wynik operacji, oraz ich kolejność (np. w systemie programowania Turbo C argumenty operatorów logicznych opracowywane są zawsze od lewej do prawej, a drugi z argumentów nie jest opracowywany, gdy już na podstawie wartości pierwszego z nich można określić rezultat operacji, co stanowi optymalizację programu). Istnieją języki które posiadają w swoim repertuarze operatory, dla których zawsze opracowywane są wszystkie argumenty (np. w języku Visual Basic operatory And i Or), oraz odpowiadające im operatory realizację te same operacje logiczne, ale pomijające wykonywanie obliczeń dla drugiego argumentu, jeżeli rezultat operacji jest znany już po obliczeniu pierwszego z nich (np. w języku Visual Basic operatory AndAlso i OrElse). Ma to szczególne znaczenie w przypadku wykorzystywania przez programistę tzw. efektów ubocznych, których stosowanie jednak przez literaturę przedmiotu nie jest zalecanie, a wręcz jest krytykowane i negatywnie oceniane.
W zakresie priorytetów operatorów można wyróżnić między innymi przypadki krańcowe:
Jeżeli priorytet operatorów logicznych jest wyższy niż innych operatorów, wykonywane są przed nimi. Oznacza to, że w tym przypadku, aby prawidłowo zbudować warunek składający się z kilku badanych kryteriów połączonych odpowiednią funkcją logiczną, niezbędne jest ujęcie poszczególnych warunków łączonych operatorami logicznymi w nawiasy wymuszającymi określoną kolejność operacji. W przeciwnym razie wynik wyrażenie nie będzie zgodny z oczekiwaniami.
Przykład w języku Pascal (operatory logiczne mają najwyższy priorytet):
{ warunek złożony z dwóch kryteriów, pominięcie nawiasów
zmieni sposób obliczeń: w pierwszej kolejności
wykonana by została operacja bitowa
na wyrażeniu 2 and c, co jest niezgodne z oczekiwaniami }
if (a<b*2) and (c+1>d-2) then
begin
{ instrukcje }
end;
W językach, w których operatory logiczne mają niższy priorytet niż pozostałe stosowanie nawiasów nie jest konieczne.
Przykład w języku C (operatory logiczne mają niższy priorytet):
/* warunek złożony z dwóch kryteriów, pominięcie nawiasów
nie zmieni zgodnego z oczekiwaniami badania warunku złożonego */
if (a<b*2 && c+1>d-2)
{
/* instrukcje */
}
Poniższe zestawienie zawiera dostępne operatory logiczne w wybranych językach komputerowych.
| język komputerowy | jednoargumentowe | dwuargumentowe | |||||
|---|---|---|---|---|---|---|---|
| negacja | koniunkcja | alternatywa | alternatywa rozłączna | implikacja | równoważność | inne | |
| ABAP | NOT |
AND |
OR |
||||
| Ada | not |
andand then |
oror else |
xor |
|||
| C, C++ | ! |
&& |
|| |
!= |
== |
||
| Clipper | .not. |
.and. |
.or. |
||||
| COBOL | NOT |
AND |
OR |
||||
| Forth | AND |
OR |
XOR |
||||
| Fortran 1900 | .NOT. |
.AND. |
.OR. |
||||
| Fortran 77 | .NOT. |
.AND. |
.OR. |
.NEQV. |
.EQV. |
||
| JEAN | NOT |
AND |
OR |
IS |
|||
| Java | ! |
&& |
|| |
!= |
== |
||
| Modula-2 | NOT |
AND& |
OR |
||||
| Pascal | not |
and |
or |
xor |
|||
| Perl | !not |
&&and |
||//or |
xor |
|||
| PHP | ! |
&&and |
||or |
xor |
|||
| PL/I | ¬ |
& |
| |
||||
| PL/M | NOT |
AND |
OR |
XOR |
|||
| Python | not |
and |
or |
||||
| REXX | \¬ |
& |
| |
&& |
|||
| VHDL | not |
and |
or |
xor |
nxor |
nandnor | |
| Visual Basic, VBA | Not |
AndAndAlso |
OrOrElse |
Xor |
Imp |
Eqv |
|