Rozdzia³ 6 - Edition 2000

Transkrypt

Rozdzia³ 6 - Edition 2000
Rozdzia³
6
Operatory porównañ i logiczne
Cele
l Zrozumienie operatorów porównañ
l Ró¿nice pomiêdzy porównywaniem liczb, obiektów i stringów
l Operatory logiczne oraz sposób w jaki umo¿liwiaj¹ ³¹czenie
porównañ
142
Visual Basic .NET - KURS PODSTAWOWY
J
ak dot¹d wykonywanie programów odbywa³o siê po wzglêdnie prostej linii. Program
podejmowa³ z góry okreœlon¹ akcjê w oparciu o wybór u¿ytkownika. Jednak¿e,
w miarê jak programy bêd¹ stawa³y siê coraz bardziej wyszukane, czêsto bêd¹ musia³y
rozga³êziaæ siê na dwa lub wiêcej kierunków w zale¿noœci od tego, czy warunek jest
prawd¹ (True) czy fa³szem (False). Na przyk³ad w programie kalkulator Twój program
musi okreœliæ, czy u¿ytkownik wybra³ dodawanie, odejmowanie, mno¿enie lub dzielenie,
zanim bêdzie mo¿na przeprowadziæ wybrane dzia³anie. Twój kod okreœli to porównuj¹c
wybór u¿ytkownika z ró¿nymi alternatywami. Porównanie zostanie dokonane przy
u¿yciu operatorów porównania.
Porównania s¹ tak¿e czêsto stosowane dla zapobiegniêcia b³êdom. Na przyk³ad
w programie kalkulator, zanim przeprowadzimy dzielenie, program powinien sprawdziæ,
czy dzielnik nie jest zerem, poniewa¿ dzielenie przez zero jest nieprawid³owe, i je¿eli
wyst¹pi, spowoduje to b³¹d. Je¿eli dzielnik jest równy zero, wtedy u¿ytkownik powinien
zostaæ o tym poinformowany, a dzielenie nie powinno byæ wykonane. W innym
wypadku mo¿emy przeprowadziæ dzielenie.
Operator porównania mo¿e wykonaæ tylko jedno porównanie naraz. Czasami
trzba po³¹czyæ kilka porównañ. Aby okreœliæ, czy ktoœ mo¿e g³osowaæ, musisz
porównaæ jego wiek z dopuszczalnym wiekiem oraz obywatelstwo z obywatelstwem
polskim. W takim przypadku, aby ktoœ móg³ byæ dopuszczony do g³osowania, obydwa
operatory musz¹ daæ w wyniku True. Jednak¿e w innych porównaniach mo¿e wystarczyæ
spe³nienie tylko jednego warunku. Na przyk³ad mo¿esz byæ wpuszczony za darmo na
seans filmowy w kinie, je¿eli jesteœ dzieckiem lub emerytem.
Aby po³¹czyæ kilka porównañ u¿yjesz operatorów logicznych. Operatory te to And
(daje w wyniku True, gdy obydwa porównania dadz¹ True), a tak¿e Or (wystarczy tylko
jedno True, aby zosta³a podjêta akcja).
Porównania oraz operatory logiczne daj¹ podstawy dla nastêpnych rozdzia³ów:
Rozdzia³ 7 na temat struktur kontrolnych i Rozdzia³ 8 na temat pêtli, w których korzysta
siê z tych operatorów w celu okreœlenia, czy warunek lub po³¹czenie warunków daje
w wyniku True lub False.
Operatory porównania
Twoje programy bêd¹ czêsto musia³y porównaæ dwie wartoœci. Porównanie mo¿e
udzielaæ odpowiedzi na pytanie, czy wartoœci te s¹ sobie równe, lub czy jedna jest
wiêksza od drugiej (lub mniejsza). Niezale¿nie od typu porównania, mo¿e ono daæ tylko
jeden spoœród dwóch mo¿liwych wyników, True lub False.
Oto sk³adnia porównania:
ROZDZIA£ 6: Operatory porównañ i logiczne
143
[Wyra¿enie1] [operator porównania] [Wyra¿enie2]
Dwa wyra¿enia mog¹ byæ czymkolwiek, co tylko posiada wartoœæ, która mo¿e byæ
porównana: litera³ami, sta³ymi, zmiennymi lub odczytywalnymi w³asnoœciami. Tabela 6-1
przedstawia i opisuje operatory porównania oraz okolicznoœci, w jakich daj¹ wynik True
i False:
Operator
Znaczenie
True (prawda)
je¿eli
False (fa³sz)
je¿eli
<
Mniejsze ni¿
wyra¿enie1 <
wyra¿enie2
wyra¿enie1 >=
wyra¿enie2
<=
Mniejsze lub równe
wyra¿enie1 <=
wyra¿enie2
wyra¿enie1 >
wyra¿enie2
>
Wiêksze niæ
wyra¿enie1 >
wyra¿enie2
wyra¿enie1 <=
wyra¿enie2
>=
Wiêksze lub równe
wyra¿enie1 >=
wyra¿enie2
wyra¿enie1 <
wyra¿enie2
=
Równe
wyra¿enie1 =
wyra¿enie2
wyra¿enie1 <>
wyra¿enie2
<>
Nie równe
wyra¿enie1 <>
wyra¿enie2
wyra¿enie1 =
wyra¿enie2
ls
Czy dwie zmienne
obiektu odwo³uj¹ siê
do tego samego
obiektu?
Czy string pasuje
do okreœlonego
wzorca
Obydwie zmienne
obiektu odwo³uj¹ siê
do tegosamego
obiektu
String pasuje do
okreœlonego wzroca
Dwie zmienne obiektu nie
odwo³uj¹ siê do tego
samego obiektu
Like
Tab. 6-1
Operatory porównania
Nastêpuj¹ce wyra¿enia daj¹ w wyniku prawdê (True):
l 4=4
l 4<5
l 4 <= 5
l 4>3
l 4 >= 3
l 4 <> 3
String nie pasuje do
podanego wzorca
6
144
Visual Basic .NET - KURS PODSTAWOWY
Nastêpuj¹ce wyra¿enia dadz¹ w wyniku fa³sz (False):
l 4 <> 4
l 4=5
l 4>5
l 4 >= 5
l 4<3
l 4 <= 3
Wskazówka
Podobnie jak w przypadku innych operatorów, powinieneœ uwa¿aæ na to, aby
porównywaæ wartoœæ tego samego typu. Na przyk³ad, gdy wyra¿enie typu
Decimal jest porównywane z wyra¿eniem typu Single lub Double, wyra¿enie
Decimal zostanie skonwertowane do typu Single lub Double. Efektem mo¿e
byæ to, ¿e u³amkowa czêœæ mniejsza ni¿ 1E-28 zostanie stracona. W takim
wypadku dwie wartoœci mog¹ zostaæ uznane za równe chocia¿ nie s¹.
Z tego powodu trzeba uwa¿aæ stosuj¹c operator sprawdzenia równoœci (=)
do porównania dwóch zmiennych zmiennoprzecinkowych.
Operator porównania na wypadek równoœci (=) jest prze³adowany, s³u¿y tak¿e jako
operator przypisania omawiany w Rozdziale 5. Kompilator mo¿e okreœliæ, kiedy
u¿ywasz operatora = w celu przypisania lub porównania w oparciu o kontekst, w jakim
operator jest u¿yty. Operator = bêdzie stosowany w porównaniach w Rozdziale 7
dotycz¹cym struktur kontrolnych oraz w Rozdziale 8 omawiaj¹cym pêtle.
Porównywanie obiektów
Operator porównania Is s³u¿y do okreœlenia, czy jedna zmienna obiektu odwo³uje siê do
tego samego obiektu co druga zmienna, zwraca True, je¿eli tak, w przeciwnym razie
False.
Nastêpuj¹cy kod, który mo¿esz umieœciæ w procedurze zdarzeñ Form_Load zwyk³ej
aplikacji Windows, ilustruje jak dzia³a operator Is:
Dim frm1 As New Form1()
Dim frm2 As New Object()
Dim frm3 As New Object()
frm2 = frm1
ROZDZIA£ 6: Operatory porównañ i logiczne
145
Debug.Write(frm2 Is frm1) ‘wypisuje True
Debug.Write(frm3 Is frm1) ‘wypisuje False
W pierwszej linii kodu Dim frm1 As New Form1() tworzy zmienn¹ obiektu frm1,
która odwo³uje siê do domyœlnej formy (Form1) wygenerowanej podczas tworzenia
programu Windows. Nastêpne dwie linie kodu tworz¹ dwie zmienne obiektów, frm2
i frm3, które odwo³uj¹ siê do jakichœ obiektów w pamiêci.
Uwaga
Zmienne obiektu frm2 i frm3 nie musz¹ byæ tworzone przy u¿yciu s³owa New,
poniewa¿ s³u¿¹ do odwo³ywania siê do istniej¹cego obiektu. St¹d instrukcje
Dim frm2 As Object() i Dim frm3 As Object() by³yby wystarczaj¹ce.
Czwarta linia kodu frm2 = frm1 korzysta z operatora przypisania inaczej ni¿
dotychczas. Poprzednio korzystaliœmy z operatora przypisania w celu przypisania
wartoœci wyra¿enia z prawej strony instrukcji przypisania do zmiennej lub zapisywalnej
w³asnoœci z lewej strony. Tutaj operator przypisania posiada inny efekt. Zmienna obiektu
z lewej strony instrukcji przypisania bêdzie odwo³ywa³a siê na ten sam obiekt co zmienna
obiektu z prawej strony instrukcji przypisania. W rezultacie frm2 teraz tak¿e odwo³uje siê
do domyœlnej formy Form1. Tak wiêc instrukcja:
Debug.Write(frm2 Is frm1)
wypisze True, poniewa¿ dwie zmienne obiektu odwo³uj¹ siê do tego samego
obiektu. Jednak¿e instrukcja:
Debug.Write(frm3 Is frm1)
wypisze False, poniewa¿ frm3 nie odwo³uje siê do Form1 tak jak frm1.
Wyra¿enie TypeOf ... Is jest powi¹zane z operatorem Is, ³¹czy w sobie operator Is
wraz ze s³owem kluczowym TypeOf. Wyra¿enie TypeOf ... Is s³u¿y do sprawdzenia, czy
zmienna obiektu odwo³uje siê do okreœlonego typu obiektu, zwraca True, je¿eli tak, w
przeciwnym razie False. Sk³adnia jest nastêpuj¹ca:
TypeOf [zmienna obiektu] Is [typ obiektu]
Nastêpuj¹cy kod okreœla, czy zmienna obiektu o nazwie Ctrl odwo³uje siê do
obiektu, który jest (lub dziedziczy) kontrolk¹ Button:
TypeOf Ctrl Is Button
6
146
Visual Basic .NET - KURS PODSTAWOWY
Czêsto mo¿esz wiedzieæ, ¿e obiekt jest kontrolk¹, ale nie znaæ jej typu. Wyra¿enie
TypeOf ... Is mo¿e byæ u¿yte do okreœlenia, czy kontrolka jest przyciskiem (Button),
etykiet¹ (Label) lub czymœ innym.
Porównywanie stringów
Porównywanie dwóch stringów jest podobne do porównywania dwóch wyra¿eñ
o wartoœciach numerycznych. Na przyk³ad, ”Jeff ” = ”Jeff ” da w wyniku prawdê (True),
podczas gdy ”Jeff ” = ”Kent” da wynik False.
Porównania stringów bazuj¹ na wartoœciach Unicode znaków w stringu. Jak
powiedziano w Rozdziale 4, dla jêzyka angielskiego zestaw znaków zaadaptowany przez
ANSI i ASCII korzysta z liczb od 0-255 dla oznaczenia wszystkich znaków
alfabetycznych (du¿ych i ma³ych liter), cyfr oraz znaków przestankowych, a tak¿e znaków
s³u¿¹cych do przedstawiania linii i grafiki. Poniewa¿ 256 znaków to za ma³o dla
wszystkich ró¿nych alfabetów u¿ywanych na œwiecie, zosta³ zaadaptowany standard
Unicode, pozwalaj¹cy na 65536 ró¿nych znaków. Mimo to, wartoœci czêsto stosowanych
znaków s¹ takie same w ASCII, jak i w Unicode. Tabela 6-2 przedstawia wartoœci ASCII
najczêœciej u¿ywanych znaków.
Znaki
Wartoœci ASCII
0 do 9
48-57 (0 to 48, 9 to 57)
A do Z
65-90 (A to 65, Z to 90)
a do z
97-122 (a to 97, z to 122)
Tab. 6-2
Wartoœci ASCII najczêœciej u¿ywanych znaków
Wynik porównania stringowej reprezentacji liczb nie zawsze mo¿e byæ przez Ciebie
oczekiwany. Jak mo¿esz siê spodziewaæ, ”5” jest wiêksze od ”4”, poniewa¿ wartoœæ
ASCII dla znaku 5 (53) jest wiêksza ni¿ wartoœæ ASCII dla 4 (52). Jednak¿e ”5” tak¿e
bêdzie wiêksze od ”4444” z tego samego powodu. W porównywaniu stringów, je¿eli
wartoœæ ASCII pierwszego znaku jednego stringu jest wiêksza ni¿ wartoœæ pierwszego
znaku drugiego stringa, pozosta³e znaki siê nie licz¹. W ten sposób ”ZAAA” jest wiêksze
od ”AZZZ”. Porównanie przechodzi do drugiego znaku tylko wtedy, je¿eli pierwsze s¹
takie same, potem do trzeciego, dopóki nie natrafi na ró¿ne znaki.
Dodatkowo porównywanie stringów poci¹ga za sob¹ dwie kwestie, które nie
wystêpowa³y w przypadku porównywania liczb: czy w porównaniu odgrywa rolê
wielkoœæ liter oraz u¿ycie operatora Like.
ROZDZIA£ 6: Operatory porównañ i logiczne
147
Option Compare
Jak pokazuje Tabela 6-2, wartoœci ASCII ma³ych liter s¹ wiêksze ni¿ ich du¿ych
odpowiedników: a jest wiêksze od A. Domyœlnie w Visual Basic .NET porównania s¹
czu³e na wielkoœæ liter – odró¿niaj¹ wielkie litery od ma³ych. W ten sposób jeff jest
wiêksze od (zamiast równe) s³owa Jeff.
W zale¿noœci od kontekstu programu, mo¿esz chcieæ dokonywaæ porównañ,
w których nie odgrywa roli wielkoœæ liter – czyli takich, w których nie ma znaczenia, czy
znak jest pisany du¿¹ czy ma³¹ liter¹. W przypadku logowania, w nazwach u¿ytkownika
zwykle nie odgrywa roli wielkoœæ liter (podczas gdy w has³ach najczêœciej tak).
Aby zadeklarowaæ domyœln¹ metodê porównywania stringów, korzystasz z instrukcji
Option Compare. Instrukcja Option Compare mo¿e byæ jedn¹ (ale tylko jedn¹)
z nastêpuj¹cych:
Option Compare Binary
Option Compare Text
Domyœlnym ustawieniem jest Option Compare Binary, jest to porównanie czu³e na
wielkoœæ liter, podczas gdy Option Compare Text nie. W ten sposób przy Option
Compare Binary aaa jest wiêksze od AAA. Jednak¿e przy Option Compare Text aaa jest
równe AAA.
Mo¿esz zmieniæ ustawienia Option Compare korzystaj¹c wbudowanych funkcji
UCase i LCase.
Funkcja UCase pobiera jako argument znak lub string. Zamienia wszystkie ma³e litery
na du¿e; wszystkie du¿e litery i znaki nie bêd¹ce literami pozostaj¹ bez zmian. Na
przyk³ad, je¿eli string ”Hello World 1234” bêdzie argumentem dla funkcji UCase, wtedy
zwróci ona string „HELLO WORLD 1234”:
Debug.Write(UCase(”Hello World 1234”))
‘Wypisze ”HELLO WORLD 1234”
Funkcja LCase jest odwrotnoœci¹ UCase, zamienia wszystkie du¿e litery na ma³e,
ma³e litery i nie-litery pozostaj¹ bez zmian. Na przyk³ad, je¿eli string ”Hello World 1234”
bêdzie argumentem dla funkcji LCase, wtedy otrzymamy ”hello world 1234”.
Funkcje UCase i LCase mog¹ byæ u¿yte dla uniewa¿nienia ustawienia Option
Compare poprzez konwersje porównywanych stringów albo do ma³ych liter, albo do
du¿ych, zanim zostan¹ one porównane, w ten sposób eliminuj¹c znaczenie wielkoœci liter
w porównaniu.
Instrukcja Option Compare musi byæ zadeklarowana na poziomie modu³u, przed
wszelkimi procedurami.
6
148
Visual Basic .NET - KURS PODSTAWOWY
Operator Like
Operator Like s³u¿y do okreœlenia, czy string pasuje do podanego wzorca, zwraca
True, je¿eli tak, w przeciwnym razie False. Oto jego sk³adnia:
[string] Like [wzorzec]
Nastêpuj¹ca instrukcja zwróci True:
Debug.Write(”F” Like ”F”) ‘zwróci True
Nastêpuj¹ce instrukcjê zwróc¹ False:
Debug.Write (”FF” Like ”F”)
Debug.Write(”F” Like ”FF”)
‘zwróci False
‘zwróci False
Nastêpuj¹ca instrukcja zwróci True, je¿eli Option Compare jest ustawione na Text,
albo False, je¿eli Option Compare jest ustawione na Binary.
Debug.Write(”F” Like ”f ”)
W poprzednich przyk³adach operator Like pe³ni³ tê sam¹ funkcjê co operator
równoœci. Prawdziwa si³a operatora Like polega na u¿ywaniu wzorca.
Pasowanie wzorca jest czêsto wykorzystywane w codziennej pracy na komputerze.
Na przyk³ad przy wyszukiwaniu pliku, o którym wiesz, ¿e zaczyna siê na „msado” i
posiada rozszerzenie .dll, mo¿esz poszukaæ pliku msado*.dll korzystaj¹c ze znaku *.
Tabela 6-3 przedstawia znaki wzorca obs³ugiwane przez Visual Basic .NET.
Znak * jest czêsto u¿ywany przy wyszukiwaniu, szczególnie gdy nie pamiêtasz
wszystkich szczegó³ów wyszukiwanego stringu. Nastêpuj¹ca instrukcja zwróci True,
poniewa¿ ”aBBBa” posiada ”a” na pocz¹tku i ”a” na koñcu, pomiêdzy nimi mo¿e byæ
dowolna iloœæ innych znaków:
”aBBBa” Like ”a*a”
Znak zastêpczy ? zapewnia bardziej œcis³e wyszukiwanie ni¿ *, poniewa¿ podczas gdy
znak * reprezentuje zero lub wiêcej znaków, ? reprezentuje dok³adnie jeden znak.
Nastêpuj¹ca instrukcja zwraca True, poniewa¿ ”BAT” zaczyna siê na ”B”, koñczy na ”T”
i posiada dok³adanie jeden znak pomiêdzy nimi:
”BAT” Like ”B?T”
Znaki we wzorcu
Pasowanie do stringa
?
Dowolny jeden znak
*
Zero lub wiêcej znaków
Tab. 6-3
Znaki zastêpcze wzorca
ROZDZIA£ 6: Operatory porównañ i logiczne
Znaki we wzorcu
Pasowanie do stringa
#
Dowolna jedna cyfra (0-9)
[lista znaków]
Dowolny jeden znak z listy znaków
[!lista znaków]
Dowolny jeden znak którego nie ma na liœcie znaków
Tab. 6-3
149
Znaki zastêpcze wzorca (c.d.)
Znaki zastêpcze ? i *, podobnie jak inne, mog¹ byæ po³¹czone. Nastêpuj¹ca instrukcja
zwraca True, poniewa¿ ”BAT” zaczyna siê na ”B”, za nim nastêpuje jeden znak,
a nastêpnie ”T”, na koñcu zero lub wiêcej dowolnych znaków.
”BAT123kgh” Like ”B?T*”
Znak zastêpczy # zapewnia jeszcze bardziej œcis³e wyszukiwanie ni¿ ?, poniewa¿
podczas gdy ? reprezentuje dowolny znak, znak # reprezentuje cyfrê. Nastêpuj¹ca
instrukcja zwraca True, poniewa¿ ”a2a” zaczyna siê i koñczy na ”a” i posiada dok³adnie
jedn¹ cyfrê poœrodku:
”a2a” Like ”a#a”
Grupa jednego lub wiêcej znaków (lista znaków) zawarta w nawiasach
kwadratowych ([ ]) mo¿e byæ wykorzystana do reprezentowania dowolnego
pojedynczego znaku, mo¿e zawieraæ dowolny kod znaku, nawet cyfry. Nastêpuj¹ca
instrukcja zwraca True, poniewa¿ ”F” wystêpuje w zestawie znaków od A do Z:
”F” Like ”[A-Z]”
Uwaga
Gdy podajemy zakres znaków, musz¹ siê one pojawiæ w rosn¹cej kolejnoœci,
od najmniejszego do najwiêkszego. W ten sposób [A-Z] jest poprawnym
wzorcem, natomiast [Z-A] nie jest.
Znak wykrzyknika na pocz¹tku listy oznacza, ¿e znaki które bêd¹ pasowaæ - s¹ to te
niezawarte na liœcie. Nastêpuj¹ca instrukcja zwraca False, poniewa¿ ”F” wystêpuje na
w zestawie znaków od A do Z:
”F” Like ”[!A-Z]”
Pierwszeñstwo
Operatory porównania posiadaj¹ ni¿szy priorytet ni¿ operatory arytmetyczne omówione
w Rozdziale 5, wy¿szy natomiast od operatorów logicznych omówionych w nastêpnej
6
150
Visual Basic .NET - KURS PODSTAWOWY
sekcji, „Operatory logiczne”. Wszystkie operatory porównania posiadaj¹ równy priorytet
i s¹ obliczane od lewej strony do prawej.
l Jaki jest typ danej zwracanej przez operatory porównania?
l Jaka instrukcja okreœla, czy w porównywaniu stringów odgrywa rolê wielkoœæ liter?
Operatory logiczne
Operator porównania mo¿e dokonaæ tylko jednego porównania naraz. Czasami trzeba
po³¹czyæ kilka porównañ. Aby okreœliæ, czy ktoœ mo¿e g³osowaæ, musisz porównaæ
wiek osoby z dopuszczalnym wiekiem oraz obywatelstwo z obywatelstwem polskim.
W takim przypadku, obydwa porównania musz¹ daæ w wyniku prawdê (True). Aby
okreœliæ, czy kupuj¹cy ma prawo do rabatu, musisz sprawdziæ, czy ca³kowita suma
zakupu przekracza 500 z³, lub czy jakikolwiek zakup jest wiêkszy ni¿ 100 z³. W takim
przypadku wystarczy aby tylko jeden warunek zosta³ spe³niony (da³ w wyniku True).
Po³¹czenie porównañ albo w koniunkcjê (I - And), albo sumê logiczn¹ (LUB - Or)
poci¹ga za sob¹ u¿ycie operatorów logicznych And i Or.
Uwaga
Wiele spoœród operatorów logicznych porównuj¹cych wyra¿enia typu
Boolean mo¿e byæ tak¿e u¿ytych jako operatory bitowe porównuj¹ce dwa
wyra¿enia numeryczne. Jak powiedziano w Rozdziale 1, komputer myœli
w postaci jedynek i zer, zaœ liczby czêsto s¹ wyra¿ane w postaci binarnej
lub o podstawie 2. W porównaniach bitowych dwie liczby s¹ porównywane
bit po bicie, 1 lub 0 na danym bicie decyduj¹ o bicie wyniku porównania.
W rozdziale tym skupimy siê na operatorach logicznych zamiast na
bitowych, poniewa¿ w Rozdziale 7 i 8 bêdziemy u¿ywaæ operatorów
logicznych.
l Boolean.
l Option Compare. Option Compare Binary oznacza, ¿e porównania bêd¹ czu³e na wielkoœæ liter; Option
Compare Text oznacza, ¿e wielkoœæ liter nie bêdzie gra³a roli.
ROZDZIA£ 6: Operatory porównañ i logiczne
151
Operator And
Operator And przeprowadza logiczn¹ operacjê koniunkcji na dwóch wyra¿eniach
Boolean zwracaj¹c wartoœæ Boolean, któr¹ jest False, jak pokazuje Tabela 6-4, dopóki
obydwa wyra¿enia nie dadz¹ w wyniku True.
WartoϾ pierwszego
wyra¿enia
WartoϾ drugiego
wyra¿enia
Wynik
True
True
True
True
False
False
False
True
False
False
False
False
Tab. 6-4
Operator And wraz z wyra¿eniami Boolean
Nastêpuj¹cy kod pokazuje dzia³anie operatora And wraz z wyra¿eniami typu
Boolean:
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B And B > C ‘ Zwraca True.
myCheck = B > A And B > C ‘ Zwraca False.
Przyk³ad z prawem do g³osowania przedstawiony na pocz¹tku tego rozdzia³u jest
dobrym przyk³adem tego, kiedy u¿ywaæ operatora And, gdy obydwa warunki (wiek
i obywatelstwo) musz¹ byæ prawd¹ (True), w przeciwnym razie wynikiem (prawo do
g³osowania) bêdzie fa³sz (False).
Operator AndAlso
Operator AndAlso jest prawie identyczny z operatorem And w porównywaniu dwóch
wyra¿eñ typu Boolean. Jak pokazuje Tabela 6-5, jedyn¹ ró¿nic¹ jest to, ¿e je¿eli pierwsze
wyra¿enie da wynik False, drugie nie jest obliczane. Nastêpna sekcja “Zapytaj Eksperta”
omawia konsekwencje braku obliczania i dlaczego móg³byœ u¿ywaæ operatora AndAlso
zamiast operatora And.
6
152
Visual Basic .NET - KURS PODSTAWOWY
WartoϾ pierwszego
wyra¿enia
WartoϾ drugiego
wyra¿enia
Wynik
True
True
True
True
False
False
False
(nie obliczane)
False
Tab. 6-5
Operator AndAlso
Uwaga
Operator AndAlso, w odró¿nieniu od And, przeprowadza tylko logiczne
porównanie dwóch wyra¿eñ typu Boolean, nie mo¿e byæ u¿yty do bitowego
porównywania dwóch wyra¿eñ numerycznych.
Operator Or
Operator Or przeprowadza sumê logiczn¹ dwóch wyra¿eñ typu Boolean zwracaj¹c
wartoœæ Boolean, któr¹, zgodnie z Tabel¹ 6-6, jest prawda (True), dopóki obydwa
wyra¿enia nie dadz¹ wyniku False.
Nastêpuj¹cy kod pokazuje dzia³anie operatora Or wraz z wyra¿eniami typu Boolean:
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B Or B > C ‘ Zwraca True.
myCheck = B > A Or B > C ‘ Zwraca True.
myCheck = B > A Or C > B ‘ Zwraca False
Przyk³ad darmowego wstêpu do kina dobrze przedstawia to, kiedy u¿ywaæ
operatora Or, gdy chocia¿ jeden warunek jest prawd¹ (True) (dziecko lub emeryt), wtedy
wynikiem te¿ jest prawda (True), czyli wejœcie za darmo. Zap³aciæ trzeba tylko wtedy,
gdy obydwa warunki s¹ nieprawdziwe.
ROZDZIA£ 6: Operatory porównañ i logiczne
WartoϾ pierwszego
wyra¿enia
WartoϾ drugiego
wyra¿enia
Wynik
True
True
True
True
False
True
False
True
True
False
False
False
Tab. 6-6
153
Operator Or wraz z wyra¿eniami Boolean
Operator OrElse
Operator OrElse tak siê ma do operatora Or, jak AndAlso do And. Jak pokazuje Tabela
6-7, jedyn¹ ró¿nic¹ pomiêdzy operatorem OrElse a operatorem Or jest to, ¿e je¿eli
pierwsze wyra¿enie da wynik True, wtedy drugie nie jest obliczane. Nastêpna sekcja
„Zapytaj Eksperta” omawia konsekwencje braku obliczania drugiego wyra¿enia oraz
dlaczego móg³byœ u¿ywaæ operatora OrElse zamiast Or.
Uwaga
Podobnie jak w przypadku AndAlso, operator OrElse, w odró¿nieniu od Or,
przeprowadza tylko logiczne porównanie dwóch wyra¿eñ typu Boolean, nie
mo¿e s³u¿yæ do przeprowadzania bitowego porównania dwóch wyra¿eñ
numerycznych.
Operator Xor
Operator Xor przeprowadza operacje logicznego wy³¹czania na dwóch wyra¿eniach
typu Boolean, wynik przedstawia Tabela 6-8. Wynikiem jest True, je¿eli jedno i tylko
jedno wyra¿enie wynosi True, w przeciwnym razie False.
Nastêpuj¹cy kod pokazuje jak dzia³a operator Xor wraz z wyra¿eniami Boolean:
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B Xor B > C ‘ Returns False.
myCheck = B > A Xor B > C ‘ Returns True.
myCheck = B > A Xor C > B ‘ Returns False.
6
154
Visual Basic .NET - KURS PODSTAWOWY
WartoϾ pierwszego
wyra¿enia
WartoϾ drugiego
wyra¿enia
Wynik
True
(nie wyliczane)
True
False
True
True
False
False
False
Tab. 6-7
Operator OrElse
WartoϾ pierwszego
wyra¿enia
WartoϾ drugiego
wyra¿enia
Wynik
True
True
False
True
False
True
False
True
True
False
False
False
Tab. 6-8
Operator Xor wraz z wyra¿eniami typu Boolean
Operator Xor jest u¿yteczny, gdy chcesz okreœliæ, czy dok³adnie jeden warunek jest
prawd¹.
Operator Not
Operator Not przeprowadza logiczn¹ negacjê na jednym wyra¿eniu typu Boolean,
zwracaj¹c wartoœæ Boolean, któr¹, jak pokazuje Tabela 6-9, jest True, je¿eli wyra¿enie da
wynik False, w przeciwnym razie wynikiem jest False.
Operator Not jest u¿yteczny w sytuacjach, w których nie prawda (Not True) jest
bardziej naturalna ni¿ False. Na przyk³ad w programie kalkulator, omawianym na
pocz¹tku tego rozdzia³u, okreœlaj¹c, czy dzielnik jest równy zero (dzielenie przez zero jest
zabronione), intuicyjnie mo¿na powiedzieæ, ¿e dzielenie mo¿e zostaæ przeprowadzone,
je¿eli dzielnik nie jest równy zero.
Pierwszeñstwo
Operatory logiczne posiadaj¹ ni¿szy priorytet ni¿ operatory porównania omówione
wczeœniej. Tabela 6-10 pokazuje priorytet wœród operatorów logicznych.
ROZDZIA£ 6: Operatory porównañ i logiczne
Wartoœæ wyra¿enia
Wynik
True
False
False
True
Tab. 6-9
Operator Not
Priorytet
Operator(y)
Opis
1
Not
Negacja
2
And, AndAlso
Suma logiczna
3
Or, OrElse
Koniunkcja
4
Xor
Wy³¹czanie
Tab. 6-10
Priorytet wœród operatorów logicznych
Je¿eli w jednej instrukcji pojawi¹ siê operatory logiczne o równym priorytecie,
pierwszeñstwo bêdzie obliczane od lewej do prawej (czyli najpierw zostanie wykonany
ten z lewej).
l Który operator dzia³a tylko z jednym operandem zamiast dwóch?
l Który operator logiczny zwraca False, je¿eli obydwa operandy daj¹ wynik True?
Podsumowanie
W miarê tego jak programy robi¹ siê coraz bardziej skomplikowane, ich wykonywanie
czêsto musi siê rozga³êziaæ na dwa lub wiêcej kierunków w zale¿noœci od tego, czy
warunek jest prawd¹ czy fa³szem. Jak powiedziano na pocz¹tku tego rozdzia³u,
program kalkulator, zanim przeprowadzi dzielenie, powinien sprawdziæ, czy dzielnik nie
jest zerem (dzielenie przez zero jest zabronione, je¿eli wyst¹pi, spowoduje b³¹d
programu). Program rozga³êzia siê, przeprowadza dzielenie, je¿eli dzielnik nie jest równy
zero, w przeciwnym razie ostrzega u¿ytkownika.
l Not.
l Xor.
155
6
156
Visual Basic .NET - KURS PODSTAWOWY
Operatora porównañ u¿yjesz w celu okreœlenia tego, czy dzielnik jest równy (lub nie
jest równy) zero. Istniej¹ operatory porównania testuj¹ce równoœæ b¹dŸ nierównoœæ, lub
to, czy jakaœ wartoœæ jest wiêksza od drugiej albo mniejsza. Operatory porównania mog¹
byæ u¿yte do porównywania nie tylko wartoœci numerycznych, ale tak¿e i stringów lub
nawet obiektów.
Operator porównania mo¿e dokonaæ tylko jednego porównania naraz, czasami
trzeba natomiast po³¹czyæ kilka porównañ. Na przyk³ad, aby sprawdziæ, czy ktoœ mo¿e
g³osowaæ, musisz porównaæ jego wiek z wiekiem dopuszczalnym, a tak¿e obywatelstwo
z obywatelstwem polskim. W takim przypadku obydwa porównania musz¹ byæ
prawdziwe (True), aby osoba mia³a prawo do g³osowania.
Pytanie: Jaka jest tak naprawdê ró¿nica w tym, ¿e operator AndAlso nie
oblicza drugiego wyra¿enia, je¿eli pierwsze wyra¿enie da wynik False, lub ¿e
operator OrElse nie oblicza drugiego wyra¿enia, je¿eli pierwsze da wynik True?
OdpowiedŸ: Nie ma prawdziwej ró¿nicy, je¿eli drugi operand to zwyk³e
porównanie. Jednak¿e drugie wyra¿enie mo¿e byæ bardziej z³o¿one, mog¹ tam
byæ np. wywo³ania funkcji, które zmieniaj¹ wartoœci przed powrotem do wyniku
Boolean. W takim przypadku zmienne mog¹ posiadaæ inne wartoœci w zale¿noœci
od tego, czy drugie wyra¿enie by³o obliczane, czy te¿ nie.
Pytanie: Dlaczego u¿y³byœ operatora AndAlso zamiast And lub OrElse zamiast
operatora Or?
OdpowiedŸ: Je¿eli drugie wyra¿enie jest skomplikowane, móg³byœ chcieæ
zaoszczêdziæ czas procesora nie obliczaj¹c go. Jednak¿e normalnie decyzja o tym,
czy u¿ywaæ AndAlso zamiast And lub OrElse zamiast Or zale¿y od logiki
Twojego programu. Jak powiedziano wczeœniej, gdy drugie wyra¿enie jest
skomplikowane, mo¿e np. zawieraæ wywo³ania funkcji która, zmienia wartoœci,
zmienne mog¹ mieæ ró¿ne wartoœci w zale¿noœci od tego, czy drugie wyra¿enie
by³o obliczane. Musisz zdecydowaæ, czy logika programu pozwala na takie
zmiany. Nie ma jasnej odpowiedzi, wszystko zale¿y od struktury Twojego
programu.
Jednak¿e w przypadku innych porównañ tylko jeden spoœród dwóch warunków
musi byæ prawd¹. Na przyk³ad mo¿esz mieæ darmowy wstêp do kina, je¿eli jesteœ
dzieckiem lub emerytem.
ROZDZIA£ 6: Operatory porównañ i logiczne
157
Operatorów logicznych u¿ywasz do po³¹czenia kilku porównañ. Operatory logiczne
to And (obydwa wyra¿enia musz¹ byæ prawd¹, aby wynik by³ prawd¹) i Or (wystarczy
tylko prawdziwoœæ jednego wyra¿enia, aby wynikiem by³a prawda). Istniej¹ tak¿e inne
operatory logiczne.
Operatory porównañ i logiczne daj¹ podstawy pod Rozdzia³y 7 i 8, w których
korzystamy z tych operatorów w celu okreœlenia, czy warunek lub ich kombinacja daje
wynik True lub False.
Sprawdzian
1. Jaki typ danych zwracaj¹ operatory porównania?
A. Boolean
B. Byte
C. Integer
D. String
2. Jakie typy danych porównuje operator Like?
A. Boolean
B. Byte
C. Integer
D. String
3. Który operator porównuje odwo³ania do obiektu?
A. >
B. <>
C. Is
D. Like
6
158
Visual Basic .NET - KURS PODSTAWOWY
Sprawdzian
4. Która instrukcja okreœla to, czy w porównywaniu stringów odgrywa rolê
wielkoϾ liter?
A. Option Explicit
B. Option Compare
C. Option Strict
D. Stock Options
5. Który z poni¿szych znaku nie jest u¿ywany jako wzorzec w porównywaniu
stringów?
A. #
B. ^
C. ?
D. *
6. Operacje porównania posiadaj¹ priorytet:
A. Wy¿szy ni¿ operatory arytmetyczne, ale ni¿szy ni¿ operatory logiczne.
B. Ni¿szy ni¿ operatory arytmetyczne, ale wy¿szy ni¿ operatory logiczne.
C. Wy¿szy zarówno od operatorów arytmetycznych, jak i porównañ.
D. Ni¿szy zarówno od operatorów arytmetycznych, jak i porównañ.
7. Który z poni¿szych operatorów logicznych pobiera tylko jeden operand
zamiast dwóch?
A. And
B. Or
C. Not
D. Xor
ROZDZIA£ 6: Operatory porównañ i logiczne
159
Sprawdzian
8. Który z nastêpuj¹cych operatorów logicznych zwraca False, je¿eli obydwa
operandy daj¹ wynik True?
A. And
B. Or
C. Not
D. Xor
9. Który z nastêpuj¹cych operatorów logicznych posiada najwy¿szy priorytet?
A. And
B. Or
C. Not
D. Xor
10. Który z nastêpuj¹cych operatorów logicznych nie bêdzie oblicza³ drugiego
wyra¿enia, je¿eli pierwsze da wynik True?
A. And
B. AndAlso
C. Or
D. OrElse
6
160
Visual Basic .NET - KURS PODSTAWOWY