Newsgroup: it.comp.lang.c
Titolo: Dubbio su doppi e tripli test.

Tutte variabili intere:
if ( a == b && c > d  &&  f < z ) g=1;  // funziona
if ( a == b & c > d  &  f < z ) g=1;  // funziona lo stesso benchè abbia
letto di non confondere assolutamente && (and logico) con & (and
bitwise): perché?
-- 
Qui si usa Linux.
http://www.puppylinux.org
Venerdì 8 gennaio 2010 (8/357) S.Massimo.
Declinazione solare -22,0915° sud. Luna di 23 giorni.

 Declinazione solare -22,0915° sud. Luna di 23 giorni.
(a==b) => 1
(c > d) => 1
(f < z) => 1
1 & 1 & 1 = 1
no?

 ha scritto:

Certamente, visto anche che funziona. Ma vorrei capire
cosa significano AND "bit a bit" (bitwise) e a AND "logico".
A pagina 394 del Deitel & Deitel c'è scritto: "Errore tipico 10.11 _
Usare l' operatore logico AND (&&) invece dell' operatore bitwise AND
(&) e viceversa è un errore. 
-- 
Qui si usa Linux.
http://www.puppylinux.org
Venerdì 8 gennaio 2010 (8/357) S.Massimo.
Declinazione solare -22,0764° sud. Luna di 23 giorni.

 (&) e viceversa ï¿œ un errore. 
E' un errore perchï¿œ qualunque intero non nullo viene interpretato come 
"TRUE" non solo "1".
E.

 
"logico" significa il normale AND, quello che ha come risultato 
true/false  (1 oppure 0 in C; solo 1 , non un qualsiasi non-zero)
"bitwise" significa che si fa l'AND sui singoli bit, il che puï¿œ portare 
a qualsiasi risultato.
Es
1 && 2 --> ((1) != 0 && (2) != 0) --> true --> 1
1 & 2 --> 0
questo perchï¿œ in binario 1 ï¿œ 0...0001, 2 ï¿œ 0...0010, e l'AND viene fatto 
sui singoli bit (13 & 42 --> (8 + 4 + 1) & (32 + 8 + 2) --> 8)
Scritto un pochino meglio:
...00101010 &
...00001101 =
...00001000
Inoltre, se sai cos'ï¿œ l corto circuito(*) degli operatori logici - l'and 
bit a bit non ce l'ha, e non puï¿œ avercelo!
(*) google

 
dall'esempio fatto si nota chiaramente quale puo' essere la fonte di 
errore :-)

 
Oltre a quanto ti � stato detto considera anche che:
quando esegui questa riga
if ( a == b & c > d  &  f < z ) g=1;
il programma fa tutti i confronti a==b c>d f<z e una volta ricavato il 
risultato di ciascuno fa l'and bit a bit dei valori restituiti. Se 
questo � vero esegue il blocco dell'if altrimenti no.
quando esegui questa riga, invece
if ( a == b && c > d  &&  f < z ) g=1;
il programma fa il primo confronto a==b, se questo � falso salta tutto 
il blocco if in quanto basta che non sia vera una delle condizioni per 
saltarlo. E procede cos� anche con le altre condizioni.
Da tenere presente soprattutto in casi del genere:
if (a==0 && ++b == 1)

 if (a==0 && ++b == 1)
Il dubbio mi era sorto proprio leggendo su un libro di C++ la
definizione di & come "operatore logico di valutazione completa"
e quella di && come "operatore AND di cortocircuito ", differenti 
tra loro solo per la maggior velocità del primo (dato il sistema
più "sbrigativo" che usa), e mi si era rafforzato vedendo che, almeno
coi miei dati, & funzionava perfettamente anche in C.
Comunque, da oggi in poi quando si faranno confronti multipli: &&.
Saluti.
-- 
Qui si usa Linux.
http://www.puppylinux.org
Domenica 10 gennaio 2010 (10/355) S.Aldo.
Declinazione solare -21,9134° sud. Luna di 25 giorni.
Vectra_VLi8

 Saluti.
Non è questione di confronti multipli o singoli: la funzione di & è
diversa da quella di &&. Non puoi usarli come e quando ti pare...
Ognuno va usato in determinati contesti e non si possono scambiare i
due ruoli.