Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Curiosità su operatore AND

Dato il seguente codice:
Private Sub Form_Load()
    If funzione1 = True And funzione2 = False Then
        MsgBox "Ciao"
    End If
End Sub
Private Function funzione1() As Boolean
    MsgBox "Entrato in funzione 1"
    funzione1 = False
End Function
Private Function funzione2() As Boolean
    MsgBox "Entrato in funzione 2"
    funzione2 = False
End Function
mi chiedo:
1) Perchè entra anche nella funzione2?
2) L'operatore AND non dovrebbe interrompere la sequenza dell'IF?
3) Il codice sopra nel form load non dovrebbe funzionare come il codice
sotto?
Private Sub Form_Load()
    If funzione1 = True Then
        If funzione2 = False Then
            MsgBox "Ciao"
        End If
    End If
End Sub
Grazie a tutti.
Ciao, Toni.

 2) L'operatore AND non dovrebbe interrompere la sequenza dell'IF?
Programmatore C? :-)
No, VB non considera la sequenza. VB prima ottiene tutti i risultati delle
componenti dell'espressione logica, poi controlla il risultato
dell'espressione e prosegue di conseguenza.
E' uno dei motivi per cui non puoi mettere negli IF delle istruzioni che
genererebbero errore, fidandoti del fatto che prima ce n'e' una che
bloccherebbe tutto...

 2) L'operatore AND non dovrebbe interrompere la sequenza dell'IF?
cut
No perche' l'operatore AND verifica comunque entrambe le espressioni
Ciao.

 ha scritto nel messaggio
news:c8g3q3$i7u$1...@newsread.albacom.net...

Ciao,
il tutto viene ridotto ad una operazione booleana e non a una serie di
istruzioni
A=(funzione1=True)= 1
A=(funzione1=False)= 0
B=(funzione2=False)=1
B=(funzione2=True)=0
A  B | Out
-----------
0   0 | 0
0   1 | 0
1   0 | 0
1   1 | 1
IF  A AND B THEN
     MsgBox "Ciao"
End if
Se non conosce il valore di A ed anche il valore di B come può valutare
l'espressione ?
Ciao Giorgio


Scusa ma questa mi sembra una cavolata, anche perchè il primo risultato
ritorna false e poi c'e' AND, che cavolo continua a fare?
Ciao, Toni.


Bella cavolata secondo me (non la risposta, ma come si comporta vb),
praticamente io devo fare sempre come nel secondo esempio.
Secondo me questa e' una pecca di vb, piccola ma sempre pecca.
Ciao Toni.

 ha scritto nel messaggio
news:c8g4s7$j4a$1...@newsread.albacom.net...

forse per te sarà una cavolata ma vb valuta il risultato dell'espressione
non i singoli parziali.
Ciao Giorgio

 l'espressione ?
Qualcosa tipo
IF (not recDati IS Nothing) AND (not recDati.State = adStateClosed) then
....
end if
E' comodissimo, magari non estremamente logico, ma comodissimo.
Solo che se lo fai in VB, e per qualche motivo l'oggetto e' Nothing, si
schianta tutto. Sono cose che in altri linguaggi sono usatissime...
Un po' come scrivere
A = (B = 0)
Magari qui lo conoscono tutti, ma di programmatori VB che non sapevano che
si puo' fare ne conosco diversi...se qualcuno si ricorda tempo addietro
avevamo parlato anche dell'
IF boolean THEN
Vabbe', VB non ha la gestione intelligente dell'AND. Amen :-)


Perche' VB non utilizza quella che si chiama 'Short Circuit
Evaluation' (magari avesse una tale e mirabolante caratteristica); in
pratica non interrompe la valutazione nel momento in cui il risultato
e' lampante ma arriva fino alla fine. Tieni peraltro presente che
l'assunzione che la valutazione avvenga sempre da sinistra a destra
non e' una cosa predefinita della SCE. Potrebbe avvenire anche il
contrario.
--
Ciao!
Luca Menegotto

 Evaluation'
In VB.net č stata introdotta, anche se secondo me non č cosě
intuitiva come dovrebbe essere.
Anzi, in VB.net puoi scegliere quale tipo di AND e di OR utilizzare:
quelli standard o quelli "short-circuitati" AndAlso e OrElse.
Ciao
--
Math Parser : 
http://www.neodatatype.net
FlowChart   : 
http://www.neodatatype.net/dump/flowchart/dir.asp
Sito Comune : 
http://www.it-lang-vb.net


Pero' una cosa mista e' molto potente. Ovvio che devi sapere cio' che
stai facendo.
--
Ciao!
Luca Menegotto


Il fatto che il VB valuti il risultato e non le singole espressioni l'avevo
capito, avevo qualche dubbio all'inizio ma viste le tante risposte mi ero
tolto pure l'ultimo dubbio.
Adesso il discorso è un altro, perchè VB si comporta così?
Cioè c'è una logica dietro a tutto questo comportamento?
Non mi sembra che sia un problema di sicurezza, anche perchè sarebbe più
sicuro fare terminare l'espressione IF prima dell'AND.
Comunque grazie per le risposte.
Ciao, Toni.

 ha scritto nel messaggio
news:c8g5jn$ngm$1...@news.ngi.it...

Per niente intelligente, mi chiedo cosa abbia spinto i programmatori della
MS a far "funzionare" l'AND in questo modo.
Praticamente se io avessi 15 AND dovrei fare una serie incredibile di "IF
..... THEN",o dovrei inventarmi qualcosa per superare sto "problema".
Meglio non dare un mio parere, altrimenti continuiamo fino a Natale (2010)
eheh.
Grazie per le risposte.
Ciao, Toni.


Per me resta un mistero, non il "funzionamento" che ormai ho capito, ma il
motivo di lasciar fare così a VB.



Forse per comoditŕ (di chi lo ha progettato), non credo sia semplice trovare
il punto di uscita dell'espressione.
In Sql Server queste due espressione non generano errore, in vb sě
----------------
IF 1/0=1 AND 1=2 AND 2=1
   Print 'Verificato'
ELSE
   Print 'Condizione Falsa'
IF NOT(1/0<>1 OR 1<>2 OR 2<>1)
   Print 'Condizione Vera'
ELSE
   Print 'Condizione Falsa'
----------------
come puoi vedere sono identiche, e non vengono valutate da sinistra a
destra, se per la prima č semplice trovare la via breve per la seconda lo č
un pň di meno. Forse in Vb hanno speso piů energie per renderlo semplice e
comodo o forse Vb deve essere coerente con il linguaggio Basic ben piů
antico del C.
Ciao Giorgio

 stai facendo.
Il problema è che il programmatore VB spesso fa fare alle funzioni non 
solo il loro lavoro, che è quello di calcolare un risultato, ma anche 
operazioni "collaterali" che magari aggiustano l'interfaccia o impostano 
variabili globali.
Usare il short-circuit in queste condizioni è potenzialmente catastrofico :)


 sicuro fare terminare l'espressione IF prima dell'AND.
No, come detto credo sia solo perchč una forma "esplicita" di 
ramificazioni č piů chiara al programmatore VB medio.


 Vabbe', VB non ha la gestione intelligente dell'AND. Amen :-)
a me non sembra invece....
Un'espressione con gli AND ritorna true se sono tutti verificati, con gli OR
basta che uno solo sia verificato, punto.
Logico e semplice! ;-)
ciaociao

 Logico e semplice! ;-)
La gestione intelligente è intesa in questo modo, prendi ad esempio questa
espressione,
-----------------
(1-1)*(45+12*14+18+25*12/3)/(2+2*35)
-----------------
1-1=0 quindi è inutile valutare tutto il resto, il risultato è 0.
Ciao Giorgio

 Ciao Giorgio
ciaociao


umm, allora proviamo con un'espressione booleana
--------------
(A AND !A) AND  (C OR B AND A OR !C AND !A)
-------------
A AND !A è 0 quindi tutto il resto è inutile valutarlo.
Ciao Giorgio

 > > news:2h3kodF...@uni-berlin.de...
scusa dimenticavo
! è uguale a NOT
Ciao Giorgio

 Ciao Giorgio
ciaociao

 Ciao Giorgio
ciaociao

variabili globali.
Beh, ma quello non e' un programmatore, e' un 'utonto' vb (o
generale). Una delle regole auree della programmazione strutturata -
nota, non tiro in ballo nemmeno l'OOP - e' quella che una funziuone
deve avere il minor numero di effetti collaterali, meglio nessuno....
:))))
--
Ciao!
Luca Menegotto

 ma il motivo di lasciar fare così a VB.
per te che vieni dal c infatti e' cosi, come lo e' per me che vengo dal
Basic e che impattando con lo short circuit mi sono Sfrantumato contro il
primo A = !A ^_^
per esempio in vb scrivo : (CASO ESTREMIZZATO)
if calcolasubtotale(x,retValue1) and Calcolasubtotaleinnero(x,retValue2)
then
    ' Tutto ok !
endif
quadagno = retValue1 - retValue2 'in C questa riga potrebbe dare valori
sbagliati appunto perche' la retValue2 non viene calcolata per COLPA del
shortcirucuit !
Logicamente e' un caso estremo, ma se io faccio una cosa simile in C non
capirei perche' i creatori del C non mi valutino tutte le espressioni di una
If !
Sono medoti diversi di lavorare con la stesso costrutto purtroppo !
Come l'integer di vb e quello del net che differiscono di ben 16bit !
Stesso nome diverso risultato
-- 
<Gigio2K>
--- 
http://www.g2kweb.it/gigio2k
 ---
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/


Era soltanto un discorso di capire il "ragionamento" fatto da VB
sull'operatore AND.
Io resto del parere che è un metodo errato.
Esempio:
IF ServerAttivo=True AND ControllaServer= True THEN
'Prendo i dati dal server
END IF
Private Function  ControllaServer () As Boolean
'controlla stato server
End Function
Fine esempio.
Cosa succede se io devo collegarmi al server per prendere i dati e il server
non è collegato e la variabile ServerAttivo=False?
Perde sempre un sacco di tempo (cioè il tempo per capire se per esempio è
spento o non in linea o altro)
Questo soltanto perchè l'AND non viene interrotto.
Quindi adesso sono costretto a fare diversi IF .... THEN oppure trovare
strade alternative.
Comunque credo sia un problema mio, cioè continuo a ragionare in c.
Ciao, Toni.