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 okrelon¹ 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¿noci od tego, czy warunek jest prawd¹ (True) czy fa³szem (False). Na przyk³ad w programie kalkulator Twój program musi okreliæ, czy u¿ytkownik wybra³ dodawanie, odejmowanie, mno¿enie lub dzielenie, zanim bêdzie mo¿na przeprowadziæ wybrane dzia³anie. Twój kod okreli 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 okreliæ, 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 okrelenia, 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 wartoci. Porównanie mo¿e udzielaæ odpowiedzi na pytanie, czy wartoci 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 sporó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³asnociami. Tabela 6-1 przedstawia i opisuje operatory porównania oraz okolicznoci, 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 okrelonego wzorca Obydwie zmienne obiektu odwo³uj¹ siê do tegosamego obiektu String pasuje do okrelonego 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 wartoci mog¹ zostaæ uznane za równe chocia¿ nie s¹. Z tego powodu trzeba uwa¿aæ stosuj¹c operator sprawdzenia równoci (=) do porównania dwóch zmiennych zmiennoprzecinkowych. Operator porównania na wypadek równoci (=) jest prze³adowany, s³u¿y tak¿e jako operator przypisania omawiany w Rozdziale 5. Kompilator mo¿e okreliæ, 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 okrelenia, 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 umieciæ 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 domylnej 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 korzystalimy z operatora przypisania w celu przypisania wartoci wyra¿enia z prawej strony instrukcji przypisania do zmiennej lub zapisywalnej w³asnoci 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 domylnej 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 okrelonego 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 okrela, 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 okrelenia, 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 wartociach numerycznych. Na przyk³ad, Jeff = Jeff da w wyniku prawdê (True), podczas gdy Jeff = Kent da wynik False. Porównania stringów bazuj¹ na wartociach 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, wartoci czêsto stosowanych znaków s¹ takie same w ASCII, jak i w Unicode. Tabela 6-2 przedstawia wartoci ASCII najczêciej u¿ywanych znaków. Znaki Wartoci 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 Wartoci 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, wartoci ASCII ma³ych liter s¹ wiêksze ni¿ ich du¿ych odpowiedników: a jest wiêksze od A. Domylnie 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¿noci 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æ domyln¹ 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 Domylnym 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 odwrotnoci¹ 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 wielkoci 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 okrelenia, 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ównoci. 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 licie 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ê porodku: 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 kolejnoci, 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 licie. 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 okrela, 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 okreliæ, 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 okreliæ, 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 sporó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 myli 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 wejcie 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 okreliæ, 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, okrelaj¹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 wczeniej. Tabela 6-10 pokazuje priorytet wró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 wró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¿noci 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 okrelenia 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 wartoci 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¹ wartoci przed powrotem do wyniku Boolean. W takim przypadku zmienne mog¹ posiadaæ inne wartoci w zale¿noci 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 wczeniej, gdy drugie wyra¿enie jest skomplikowane, mo¿e np. zawieraæ wywo³ania funkcji która, zmienia wartoci, zmienne mog¹ mieæ ró¿ne wartoci w zale¿noci 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 sporó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 okrelenia, 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 okrela 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