Visual basic .net: andalso en orelse

Moderators: jkien, Xilvo

Reageer
Gebruikersavatar
Berichten: 11

Visual basic .net: andalso en orelse

Hallo

is er een expert in visual basic.NET ?

mijn vraag gaat over voorwaarden over te slaan in een If .. then statement

dus als er twee of meer voorwaardelijke expressies in een If .. Then-statment worden gebruikt, kunt je de operatoren AndAlso en OrElse gebruiken om ervoor te zorgen dat ter niet zake doende voorwaarden in het statement worden overgeslagen. Als het resultaat van de eerste voorwaarde bepaalt dat Visual Basic de overige voorwaarden niet hoeft te testen, worden die voorwaarden overgeslagen.

een voorbeeld

Code: Selecteer alles

Dim surfen as Boolean = true

Dim strUrl = IEBrowser.UrlPath.Text

  If Surfen = true AndAlso TeBezoekenWebSite(strUrl)= "www.wetenschapsforum.nl" Then

MessageBox.show("Jij leert iets bij!")

  Else

MessageBox.show("Geen tijd verspillen")

  End If
mm maar da kun je ook perfect doen met And of niet? wat is het verschill dan en waarom OrELse?

thx in advance

groetjess
Wisdom is found only in truth

(Johann Wolfgang von Goethe)

Gebruikersavatar
Berichten: 9.240

Re: Visual basic .net: andalso en orelse

In andere talen kun je inderdaad gewoon AND gebruiken, ik weet echter niet of andalso een andere betekenis heeft dan AND, of dat het een pseudoniem is. Zelde met else, vaak is else genoeg al wil php graag elseif hebben mischien dat het dus pseudoniemen zijn.

Re: Visual basic .net: andalso en orelse

Van de msdn:

Logical operators compare Boolean expressions and return a Boolean result. The And, Or, AndAlso, OrElse, and Xor operators are binary because they take two operands, while the Not operator is unary because it takes a single operand. Some of these operators can also perform bitwise logical operations on integral values.

Dus And en AndAlso zijn uitwisselbaar, wat betrefd v.b.

Gebruikersavatar
Berichten: 1.623

Re: Visual basic .net: andalso en orelse

Het verschil tussen AND en ANDALSO is, dat bij AND altijd allebei de expressies worden geevalueerd, en bij ANDALSO wordt dat niet altijd gedaan. Een voorbeeld ter verduidelijking:

IF (1>10) AND (10<100) THEN blabla

In dit voorbeeld worden allebei de expressies geevalueerd. De eerste expressie (1>10) levert FALSE op, maar desondanks wordt ook de tweede expressie (10<100) geevalueerd.

IF (1>10) ANDALSO (10<100) THEN blabla

In dit voorbeeld is de eerste expressie FALSE, het heeft geen zin meer om de tweede expressie te evalueren, dus dat wordt overgeslagen.

bij OR en ORELSE geldt iets dergelijks. Als bij het gebruik van ORELSE de eerste expressie al TRUE oplevert, heeft het geen enkele zin meer om de tweede expressie te evalueren. De statement(s) na THEN worden in dat geval namelijk toch wel uitgevoerd, omdat de eerste expressie immers al TRUE oplevert.

Ik vraag me nu alleen wel af, waarom we dan nog AND en OR gebruiken. Zoals ik het nu zie, is code waarbij gebruik wordt gemaakt van ANDALSO en/of ORELSE gemiddeld sneller dan code waarbij alleen maar gebruik wordt gemaakt van AND en/of OR... Of zie ik dat verkeerd?

Zie evt. op MSDN.
Beter kaal als geen haar want een kip snurkt

Re: Visual basic .net: andalso en orelse

Bij visual C staat dit in de msdn:

The conditional-AND operator (&&) performs a logical-AND of its bool operands, but only evaluates its second operand if necessary.

Vroeger was dit bij Java ook zo.

Dus mijn vermoeden zou zijn dat v.basic meer op natuurlijke taal zou moeten lijken.

Ik persoonlijk ben vaker met c en java bezig, daarom zou ik het onzinnig vinden, wanneer ik toevallig iets in basic maak, om rekening te houden met het effect van AndAlso e.d. Vervolgens komen er weer nieuwe versies uit van talen en dat is het weer net even iets anders, dan blijf je aan de gang. Dan is het imo verstandiger om consequent iets aan te houden wat je wel of niet doet en dan voor eventuele optimalisaties iets op adhoc basis in de taal defenitie na kijken.

Re: Visual basic .net: andalso en orelse

Nog eens even geprobeerd in basic:

Code: Selecteer alles

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim i As Integer = 0

        Dim a As Integer = 5

        Dim b As Integer = 6

        Dim c As Integer = 0

        Dim d As Integer = 0

        Dim start As Double = Environment.TickCount

        For i = 0 To 10000000

            If a <> 5 And a < b Then

                c = c + 1

            End If

            d = d + 1

        Next

        Dim eind As Double = Environment.TickCount

        Dim resultaat As Double = eind - start

        TextBox1.Text = "c: " & c.ToString() & " d: " & d.ToString() & vbCrLf & resultaat.ToString()

        ' And = 63 miliseconden

        ' AndAlso = 63 miliseconden

    End Sub
And = 63 miliseconden

AndAlso = 63 miliseconden

Op een pentium 4 2,4 ghz xp. Dus volgens mij maakt het geen fluit uit of er And of AndAlso staat, wanneer je een

paar selecties hebt.

Gebruikersavatar
Berichten: 1.623

Re: Visual basic .net: andalso en orelse

Nvt schreef:Nog eens even geprobeerd in basic:

Code: Selecteer alles

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim i As Integer = 0

        Dim a As Integer = 5

        Dim b As Integer = 6

        Dim c As Integer = 0

        Dim d As Integer = 0

        Dim start As Double = Environment.TickCount

        For i = 0 To 10000000

            If a <> 5 And a < b Then

                c = c + 1

            End If

            d = d + 1

        Next

        Dim eind As Double = Environment.TickCount

        Dim resultaat As Double = eind - start

        TextBox1.Text = "c: " & c.ToString() & " d: " & d.ToString() & vbCrLf & resultaat.ToString()

        ' And = 63 miliseconden

        ' AndAlso = 63 miliseconden

    End Sub
And = 63 miliseconden

AndAlso = 63 miliseconden

Op een pentium 4 2,4 ghz xp. Dus volgens mij maakt het geen fluit uit of er And of AndAlso staat, wanneer je een

paar selecties hebt.
Ja, maar nu gebruik je hele simpele expressies: je vergelijkt twee variabelen met elkaar. Maar wat als je expressies ingewikkelder zijn (bijv. gebruik maken van functies), of zelfs een database aanroepen? Dan is elke evaluatie die je niet hoeft te doen mooi meegenomen.
Beter kaal als geen haar want een kip snurkt

Re: Visual basic .net: andalso en orelse

Bij 10000000 herhhalingen betekend dat je bij And 10000000 extra evaluaties hebt en daar zit geen tijdverschil in.

Dan vraag ik mij af of er bij And niet het zelfde gebreurdt als bij AndAlso. Zeker wanneer je weet dat bij c en Java

ook alles afhangt van de eerste evaluatie.

Maar als er wel een verschil zit tussen And en AndAlso:
Maar wat als je expressies ingewikkelder zijn (bijv. gebruik maken van functies), of zelfs een database aanroepen? Dan is elke evaluatie die je niet hoeft te doen mooi meegenomen.
Dan heb je hier wel een punt. Wat betrefdt evaluaties van functies in expressies ben ik zelf nooit verder dan 1 gekomen.

Gebruikersavatar
Berichten: 11

Re: Visual basic .net: andalso en orelse

ik heb het antwoord!

bedankt voor jullie waardevolle reacties,.. ik het antwoord alleen moe ik da nu in praktijk bregen
Wisdom is found only in truth

(Johann Wolfgang von Goethe)

Gebruikersavatar
Berichten: 691

Re: Visual basic .net: andalso en orelse

In pascal kan men de verdere evaluatie met een compilercommando instellen.

Het volgende stukje software is dus onduidelijk in pascal:

var teller_waarde:longint=0;

function teller:longint;

begin

inc(teller_waarde);

result:=teller_waarde;

end;

procedure programma;

var x:longint;

BEGIN

x:=1;

IF (x=1) OR (teller>10) THEN BEGIN nummerafbeelden(teller_waarde);end;

end;

De teller-waarde is nu 0 of 1 afhankelijk van de instelling van het compiler_commando dat ergens staat in het programma.

Hierdoor kan men verkeerde zaken bekomen.

Daarom vind ik het een goed punt dat een compiler uitgaat van volledige evaluatie en pas bij een commando deze

afbreekt.

Men bekomt dan altijd dezelfde resultaten onafhankelijk van een compilerstatement.

Daarom dient men pascal te herschrijven om deze gemeenheden in de taal eruit te halen.

Elke taal die compilercommandos heeft voor zulke zaken kan direkt de vuilnisbak in omdat deze onbetrouwbaar zijn bij complexe software.

Het gebruik van andalso en orelse is miet mijn favoriet omdat dit weer een complexiteit oplevert in het begrijpen van de regel, daarom is een (COMMANDONAAM ............) constructie beter.

Bijvoorbeeld: IF ALSO( (x>0) AND (oproep<10)) THEN BEGIN END;.

De compiler kan dan de switch maken tussen de volgorde in de haken structuren.

Bij also( ((x>10)and(functieoproep=0)) and (r=0)) zal functieoproep wel uitgevoerd worden omdat dan deze tussen extra (...) staat die dan de compiler instrueert om alles te verwerken.

Tip in programmeren: Niet uitgaan van voorrangregels van de software: altijd (...) toepassen.

Ik programmeer al jaren maar ik weet niet of and eerder komt dan < c.q. *.
Een computertaal is voor mensen, niet voor de computer.

Reageer