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.
Dostępne operatory logiczne
Operatory logiczne udostępnione w językach komputerowych realizują następujące operacje logiczne:
Zapis operatorów logicznych
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:
- zapis za pomocą słów kluczowych, odpowiadających nazwom operacji przez nie wykonywanych, np.
and
,or
,xor
, itp., takie rozwiązanie dostępne jest m.in. w języku Pascal[1], Visual Basic[2][3] i innych, - zapis za pomocą symboli składających się ze znaku lub znaków innych niż litery, np.
&&
,||
, 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.
Stosowanie operatorów logicznych
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));
|
Implementacja operatorów logicznych
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:
- priorytet operatorów logicznych jest wyższy niż pozostałych operatorów,
- priorytet operatorów logicznych jest niższy niż pozostałych operatorów.
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 */
}
Operatory logiczne w językach programowania
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 |
Przypisy
- 1 2 3 4 5 Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, s. 370, 380–385, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
- 1 2 3 4 Logical/Bitwise Operators (Visual Basic). msdn.microsoft.com. [dostęp 2011-09-08]. (ang.).
- 1 2 3 4 Logical and Bitwise Operators in Visual Basic. msdn.microsoft.com. [dostęp 2011-09-08]. (ang.).
- 1 2 3 4 5 6 Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, s. 54, 65–66, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
- 1 2 3 4 5 Jan Bielecki: Encyklopedia języka C dla IBM PC. T. I: Opis języka. Warszawa: Wydawnictwa Komunikacji i Łączności, 1989, s. 98–99. ISBN 83-206-0919-4. (pol.).
- 1 2 3 4 5 6 7 8 Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, s. 60–61,69–70. ISBN 83-204-1332-X. (pol.).
- ↑ Combining Several Logical Expressions. [w:] ABAP Programming (BC-ABA) [on-line]. help.sap.com – SAP Library. [dostęp 2011-09-08]. (ang.).
- ↑ Michał Morawski, Antoni M. Zajączkowski: Wstęp do programowania w języku Ada’95. Wyd. drugie. Łódź: 2004, s. 41–45. [dostęp 2011-01-29]. (pol.).
- ↑ Wojciech Rogowski, Arkadiusz Serodziński: Clipper 5.0. Warszawa: Wydawnictwo PLJ, 1991, s. 58–59. ISBN 83-85190-20-1. (pol.).
- ↑ Eugeniusz Kurzydrem, Andrzej Macieliński, Urszula Szmidt, Eugeniusz Więcek: COBOL. Język programowania. Wyd. drugie. Warszawa: Państwowe Wydawnictwo Ekonomiczne, 1978, s. 113–115. (pol.).
- ↑ Jan Bielecki: Język FORTH. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, s. 26–27, 112,135,147, seria: Mikrokomputery. ISBN 83-204-0930-6. (pol.).
- ↑ Joanna Jonkisz, Jan Makuch, Stanisław Starzak: Programowanie w językach Algol 60 i Fortran 1900. Łódź: Wydawnictwo Politechniki Łódzkiej, Politechnika Łódzka, Ośrodek Elektronicznej Techniki Obliczeniowej, 1982, s. 207–209, seria: Skrypty dla szkół wyższych. (pol.).
- ↑ Ryszard K. Kott, Krzysztof Walczak: Programowanie w języku Fortran 77. Warszawa: Wydawnictwa Naukowo-Techniczne, 1991, s. 44–45. ISBN 83-204-1362-1. (pol.).
- ↑ Jerzy Bettek, Bronisław Rudak, Barbara Rudakowa: Język konwersacyjny JEAN. Wrocław: Wydawnictwo Politechniki Wrocławskiej, 1975, s. 89–92, seria: Skrypt wydany w serii Biblioteka WASC. (pol.).
- ↑ Kazimierz Orlicz: Język konwersacyjny JEAN z elementami programowania w Fortranie. Wrocław: Wydawnictwo Politechniki Wrocławskiej, 1977, s. 193, seria: Skrypt wydany w serii Biblioteka WASC. (pol.).
- ↑ Artur Tyloch: Kurs Java. Opis języka, składni. Polski podręcznik.. www.webdeveloper.pl. [dostęp 2011-09-08]. (pol.).
- ↑ Niklaus Wirth: Modula 2. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, s. 23–24, 40–42, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0828-8. ISSN 0867-6011. (pol.).
- ↑ Language reference > perlop. perl.org. [dostęp 2018-06-12]. (ang.).
- ↑ PHP Manual: Logical Operators. php.net. [dostęp 2018-04-09]. (ang.).
- ↑ Jan Bielecki: Rozszerzony PL/I i JCL w systemie OS/RIAD. Warszawa: Państwowe Wydawnictwo Naukowe, 1986, s. 100–101, seria: Biblioteka Informatyki. ISBN 83-01-06146-4. (pol.).
- ↑ Jan Bielecki: PL/M język programowania mikroprocesorów. Wyd. drugie uzupełnione. Warszawa: Wydawnictwa Komunikacji i Łączności, 1987, s. 17, seria: Elektronizacja. zeszyt 25. (pol.).
- ↑ Jan Bielecki: System operacyjny ISIS-II. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, s. 73, seria: Mikrokomputery. ISBN 83-204-0893-8. (pol.).
- ↑ The Python Language Reference 2.7. docs.python.org, August 04, 2011. [dostęp 2011-09-08]. (ang.).
- ↑ The REXX language. killbox.pl. [dostęp 2011-09-08]. [zarchiwizowane z tego adresu (2016-03-04)]. (ang.).
- ↑ Open Object Rexx™: Reference. www.oorexx.org. [dostęp 2011-09-08]. (ang.).
- ↑ Wyrażenia. [w:] Prezentacja języka VHDL [on-line]. home.elka.pw.edu.pl. [dostęp 2011-09-12]. (pol.).
- ↑ John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).
Bibliografia
- John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, s. 294–295, seria: Informatyka. ISBN 83-204-0246-8. (pol.).