1 van 1
Visual basic .net: andalso en orelse
Geplaatst: wo 30 mei 2007, 15:38
door Fikr_El7or
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)= "sciencetalk.nl/forum" 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
Re: Visual basic .net: andalso en orelse
Geplaatst: wo 30 mei 2007, 16:29
door DePurpereWolf
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
Geplaatst: wo 30 mei 2007, 18:21
door Nvt
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.
Re: Visual basic .net: andalso en orelse
Geplaatst: wo 30 mei 2007, 23:03
door zpidermen
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.
Re: Visual basic .net: andalso en orelse
Geplaatst: do 31 mei 2007, 05:58
door Nvt
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
Geplaatst: do 31 mei 2007, 07:15
door Nvt
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.
Re: Visual basic .net: andalso en orelse
Geplaatst: do 31 mei 2007, 12:32
door zpidermen
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.
Re: Visual basic .net: andalso en orelse
Geplaatst: do 31 mei 2007, 17:39
door Nvt
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.
Re: Visual basic .net: andalso en orelse
Geplaatst: vr 01 jun 2007, 04:19
door Fikr_El7or
ik heb het antwoord!
bedankt voor jullie waardevolle reacties,.. ik het antwoord alleen moe ik da nu in praktijk bregen
Re: Visual basic .net: andalso en orelse
Geplaatst: do 05 jul 2007, 00:10
door Schwartz
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. *.