Operator logiczny

Z Wikipedii, wolnej encyklopedii

Operator logiczny w programowaniuoperator 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[edytuj | edytuj kod]

Operatory logiczne udostępnione w językach komputerowych realizują następujące operacje logiczne:

Zapis operatorów logicznych[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

Poniższe zestawienie zawiera dostępne operatory logiczne w wybranych językach komputerowych.

Operatory logiczne w językach komputerowych
język komputerowy jednoargumentowe dwuargumentowe
negacja koniunkcja alternatywa alternatywa rozłączna implikacja równoważność inne
ABAP[7] NOT AND OR N N N N
Ada[8] not and
and then
or
or else
xor N N N
C[4][5][6], C++[6] ! && || != N == N
Clipper[9] .not. .and. .or. N N N N
COBOL[10] NOT AND OR N N N N
Forth[11] N AND OR XOR N N N
Fortran 1900[12] .NOT. .AND. .OR. N N N N
Fortran 77[13] .NOT. .AND. .OR. .NEQV. N .EQV. N
JEAN[14][15] NOT AND OR IS N N N
Java[16] ! && || != N == N
Modula-2[17] NOT AND
&
OR N N N N
Pascal[1] not and or xor N N N
Perl[18] !
not
&&
and
||//
or
xor N N N
PHP[19] ! &&
and
||
or
xor N N N
PL/I[20] ¬ & | N N N N
PL/M[21][22] NOT AND OR XOR N N N
Python[23] not and or N N N N
REXX[24][25] \
¬
& | && N N N
VHDL[26] not and or xor N nxor nand
nor
Visual Basic[2][3], VBA[27] Not And
AndAlso
Or
OrElse
Xor Imp Eqv N

Przypisy[edytuj | edytuj kod]

  1. a b c d e 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.).
  2. a b c d Logical/Bitwise Operators (Visual Basic). msdn.microsoft.com. [dostęp 2011-09-08]. (ang.).
  3. a b c d Logical and Bitwise Operators in Visual Basic. msdn.microsoft.com. [dostęp 2011-09-08]. (ang.).
  4. a b c d e f 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.).
  5. a b c d e 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.).
  6. a b c d e f g h 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.).
  7. Combining Several Logical Expressions. [w:] ABAP Programming (BC-ABA) [on-line]. help.sap.com – SAP Library. [dostęp 2011-09-08]. (ang.).
  8. 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.).
  9. Wojciech Rogowski, Arkadiusz Serodziński: Clipper 5.0. Warszawa: Wydawnictwo PLJ, 1991, s. 58–59. ISBN 83-85190-20-1. (pol.).
  10. 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.).
  11. Jan Bielecki: Język FORTH. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, s. 26–27, 112,135,147, seria: Mikrokomputery. ISBN 83-204-0930-6. (pol.).
  12. 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.).
  13. 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.).
  14. 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.).
  15. 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.).
  16. Artur Tyloch: Kurs Java. Opis języka, składni. Polski podręcznik.. www.webdeveloper.pl. [dostęp 2011-09-08]. (pol.).
  17. 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.).
  18. Language reference > perlop. perl.org. [dostęp 2018-06-12]. (ang.).
  19. PHP Manual: Logical Operators. php.net. [dostęp 2018-04-09]. (ang.).
  20. 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.).
  21. 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.).
  22. Jan Bielecki: System operacyjny ISIS-II. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, s. 73, seria: Mikrokomputery. ISBN 83-204-0893-8. (pol.).
  23. The Python Language Reference 2.7. docs.python.org, August 04, 2011. [dostęp 2011-09-08]. (ang.).
  24. The REXX language. killbox.pl. [dostęp 2011-09-08]. [zarchiwizowane z tego adresu (2016-03-04)]. (ang.).
  25. Open Object Rexx™: Reference. www.oorexx.org. [dostęp 2011-09-08]. (ang.).
  26. Wyrażenia. [w:] Prezentacja języka VHDL [on-line]. home.elka.pw.edu.pl. [dostęp 2011-09-12]. (pol.).
  27. John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).

Bibliografia[edytuj | edytuj kod]

  • John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, s. 294–295, seria: Informatyka. ISBN 83-204-0246-8. (pol.).