Newsgroup: it.comp.www.php
Titolo: ordine di valutazione

Mi spiego.
Supponiamo che la variabile $a non sia definita. Il seguente codice dà
errore oppure funziona lo stesso? (ho abbondato di spazi e parentesi per far
capire il problema)
if( (isset($a)) && ($a=="pippo") )
 print("ok");
else
 print("ko");
A rigore il codice dovrebbe dare errore perché, mentre la prima condizione
(isset($a)) può essere correttamente valutata sempre, se la variabile $a non
è definita la condizione ($a=="pippo") non può essere valutata e durante
l'esecuzione dovrebbe restituire errore.
Tuttavia in molti linguaggi, specie quando si ha da fare un AND tra più
condizioni, proprio per velocizzare la cosa, durante l'esecuzione, queste
vengono valutate nell'ordine in cui sono scritte, e la valutazione si
arresta non appena viene trovata una condizione non verificata. Se così
fosse il codice sopra dovrebbe funzionare, mentre questo no (sempre nelle
ipotesi che $a non sia definita), nonostant da un punto di vista di
espressione logica è equivalente in tutto e per tutto:
if( ($a=="pippo") && (isset($a)) )
 print("ok");
else
 print("ko");
Zio Mauro

Anche se $a non esiste (quindi !isset) la condizione funzionerà lo stesso
(non darà quindi errore)...
Prova a scrivere echo $a.... vedrai che non visualizza niente a video
nonostante la variabile non esista.
Ciao
Francesco
"Zio" <oppi_NO_SP@M_monrif.net> ha scritto nel messaggio
news:f%SV8.41409$Jj7.1...@news1.tin.it...


vengono valutate nell'ordine in cui sono scritte, e la valutazione si
E' cosi' anche in php.

Sinceramente la funzione isset anche a me risulta un po' strana: non
riesco a capire in quali casi dia 0.
Cmq il discorso che voi fate mi pare strano:
se dichiaro un AND il programma deve eseguire un AND non puň arrestarsi
e dare 1 solo se trova 1 al primo elemento.
In tal caso non sarebbe piů un AND ma un OR.
Ciao
Cla

In tal caso non sarebbe più un AND ma un OR.
Infatti...non funziona così:)
Se l'esepressione da valutare è una AND, se il primo
operando dà 0 è inutile continuare la valutazione anche per
il resto...il risultato sarà cmq FALSE.
Se l'espressione da valutare è OR, la valutazione si ferma
non appena trova un 1, poiché il risultato complessivo sarà
sicuramente 1.
--
Oggi ho fatto una scoperta, ho trovato un computer...
The MentoR

 Zio Mauro
Premesso che la mia esperienza in programmazione non è vastissima se
escludiamo il Java io ti direi che in caso tu metta l'&& vengono valutate
entrambe le condizioni mentre usando l' AND bit a bit non viene considerata
la verificazione di entrambe.
Il processo viene chiamato "lazy evaluation" e il più delle volte a me crea
un sacco di casini.
E' vero che in genere velocizza il programma (d'altro canto deve valutare
una sola condizione) ma spesso causa errori logici nella produzione del
programma.
Ad es. Se tu vuoi che entrambe le condizioni vengano controllate se utilizzi
l'AND "ozioso" non verrà effettuato il controllo sulla seconda se la prima è
falsa.
In quel caso da te descritto.
Se la variabile a soddisfa la condizione isset($a) si verifica la seconda
condizione. in questo caso la variabile dovrebbe essere stata definita
(soddisfa la prima condizione) quindi anche la seconda può essere
controllata ($a = = pippo) se questa risulta falsa verrà eseguito il codice
dopo l'else se risulta vero verrà stampato "ok".
Non credo quindi che il programma genererebbe errori... dal punto di vista
logico.
Dal punto di vista della macchina invece è probabile... in fase di
"compilazione" viene fatto il controllo dei cicli e delle variabili "orfane"
quindi quella variabile, non essendo inizializzata, potrebbe causare
problemi.
Ripeto la mia risposta è più che altro di carattere di "programmazione
generale" come già detto non sono espertissimo di PHP e immagino che altri
potranno meglio di me rispondere alla tua domanda...
Melkor

io credo che la domanda sia interessante ma poco pratica.. nel dubbio si 
possono sempre fare due if annidati
prima controlli se esiste e poi controlli se è uguale.. così eviti 
problemi vari, e poi il costo computazionale è lo stesso.
rispondendo alla domanda io credo che in php in questo caso se la prima 
risulta falsa anche la seconda lo sarà per forza.

 ha scritto nel messaggio
news:3D284A06...@nettuno.it...

AND
condizione 1          condizione 2                 AND
1                            1                                    1
1                            0                                    0
0                            1                                    0
0                            0                                    1
questo è l'AND.
=)

0 AND 0 fa 0
AND
0 0 0
0 1 0
1 0 0
1 1 1

 ha scritto nel messaggio
news:3D284E6B...@nettuno.it...


 wrote in message
news:VVXV8.1419$C8....@tornado.fastwebnet.it...

direi: a == b