Loading AI tools
Z Wikipedii, wolnej encyklopedii
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[1], Visual Basic[2][3] i innych,&&
, ||
, itp. takie rozwiązanie dostępne jest m.in. w języku C[4][5][6], C++[6] 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[4][5][6], C++[6], 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[1], 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[4][5][6] |
{
int v, *pa;
v = !pv==v || v==0;
}
|
if(a<c && c>d)
{
/* instrukcje */
}
|
do
/* instrukcje */
while(!(v || c<b));
|
Pascal[1] |
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[4] 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[2][3] 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[2][3] 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[1] (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[4][5][6] (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[7] | NOT |
AND |
OR |
![]() |
![]() |
![]() |
![]() |
Ada[8] | not |
and and then |
or or else |
xor |
![]() |
![]() |
![]() |
C[4][5][6], C++[6] | ! |
&& |
|| |
!= |
![]() |
== |
![]() |
Clipper[9] | .not. |
.and. |
.or. |
![]() |
![]() |
![]() |
![]() |
COBOL[10] | NOT |
AND |
OR |
![]() |
![]() |
![]() |
![]() |
Forth[11] | ![]() |
AND |
OR |
XOR |
![]() |
![]() |
![]() |
Fortran 1900[12] | .NOT. |
.AND. |
.OR. |
![]() |
![]() |
![]() |
![]() |
Fortran 77[13] | .NOT. |
.AND. |
.OR. |
.NEQV. |
![]() |
.EQV. |
![]() |
JEAN[14][15] | NOT |
AND |
OR |
IS |
![]() |
![]() |
![]() |
Java[16] | ! |
&& |
|| |
!= |
![]() |
== |
![]() |
Modula-2[17] | NOT |
AND & |
OR |
![]() |
![]() |
![]() |
![]() |
Pascal[1] | not |
and |
or |
xor |
![]() |
![]() |
![]() |
Perl[18] | ! not |
&& and |
|| // or |
xor |
![]() |
![]() |
![]() |
PHP[19] | ! |
&& and |
|| or |
xor |
![]() |
![]() |
![]() |
PL/I[20] | ¬ |
& |
| |
![]() |
![]() |
![]() |
![]() |
PL/M[21][22] | NOT |
AND |
OR |
XOR |
![]() |
![]() |
![]() |
Python[23] | not |
and |
or |
![]() |
![]() |
![]() |
![]() |
REXX[24][25] | \ ¬ |
& |
| |
&& |
![]() |
![]() |
![]() |
VHDL[26] | not |
and |
or |
xor |
![]() |
nxor |
nand nor |
Visual Basic[2][3], VBA[27] | Not |
And AndAlso |
Or OrElse |
Xor |
Imp |
Eqv |
![]() |