Springen naar inhoud

Visual basic .net: andalso en orelse


  • Log in om te kunnen reageren

#1

Fikr_El7or

    Fikr_El7or


  • 0 - 25 berichten
  • 11 berichten
  • Gebruiker

Geplaatst op 30 mei 2007 - 14:38

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

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

Veranderd door Fikr_El7or, 30 mei 2007 - 14:38

Wisdom is found only in truth
(Johann Wolfgang von Goethe)

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 30 mei 2007 - 15:29

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.

#3


  • Gast

Geplaatst op 30 mei 2007 - 17:21

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.

#4

zpidermen

    zpidermen


  • >1k berichten
  • 1623 berichten
  • Ervaren gebruiker

Geplaatst op 30 mei 2007 - 22:03

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.

Veranderd door zpidermen, 30 mei 2007 - 22:06

Beter kaal als geen haar want een kip snurkt

#5


  • Gast

Geplaatst op 31 mei 2007 - 04:58

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.

#6


  • Gast

Geplaatst op 31 mei 2007 - 06:15

Nog eens even geprobeerd in basic:

[codebox]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[/codebox]

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.

#7

zpidermen

    zpidermen


  • >1k berichten
  • 1623 berichten
  • Ervaren gebruiker

Geplaatst op 31 mei 2007 - 11:32

Nog eens even geprobeerd in basic:

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.

Veranderd door zpidermen, 31 mei 2007 - 11:34

Beter kaal als geen haar want een kip snurkt

#8


  • Gast

Geplaatst op 31 mei 2007 - 16:39

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.

#9

Fikr_El7or

    Fikr_El7or


  • 0 - 25 berichten
  • 11 berichten
  • Gebruiker

Geplaatst op 01 juni 2007 - 03:19

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)

#10

Schwartz

    Schwartz


  • >250 berichten
  • 691 berichten
  • Verbannen

Geplaatst op 04 juli 2007 - 23:10

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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures