Newsgroup: it.comp.lang.c++
Titolo: &, &&, | e ||

Ciao a tutti,
Studio c++ da poco e seguendo i consigli di questo ng ho iniziato a
leggere "thinking in c++"; per questo di tanto in tanto postero' i
miei dubbi sull'argomento.
Il primo e' il seguente:
quando andavo ancora a scuola il mio prof di informatica mi ha
insegnato che la differenza tra i due operatori & e && (e anche | e
||) sta nel fatto che && non valuta l'espressione alla sua destra
quando quella a sinistra e' falsa, quindi e', in alcuni casi, piu'
veloce.
Studiando thinking in c++ ho invece capito che la vera differenza sta
nel fatto che & esegue un'operazione tra i bit, mentre && esegue
un'operazione logica.
Facendo delle prove ho notato che in effetti in un'istruzione come
(false && a++) l'incremento di a non viene eseguito, pero' esistono
molte coppie di valori per cui a&b e' diverso da a&&b.
Ad esempio con la coppia di valori 1 e 2:
a = 1 (00000001)
b = 2 (00000010)
&& restituisce true, perche' i due valori sono diversi da zero, ma &
restituisce 0, perche' i due bit ad uno vengono portati a zero.
Lo stesso discorso fatto pero' con gli operatori | e || funziona,
perche' i due bit ad uno rimangono ad uno.
A questo punto mi chiedo: ho sbagliato qualcosa nei miei ragionamenti?
Oppure il mio prof mi aveva insegnato una cavolata? O il discorso del
prof ha senso solo con l'operatore | ?
Grazie!
Asfodelo Nero

 ha scritto nel messaggio
news:79836666.04031...@posting.google.com...



pardon ho scritto una frase un pò ambigua qui, non valuterei mai c con x,
posto di avere a==b


 veloce.
Secondo me il tuo prof ti ha detto una emerita ca##ata.
Da come e' messa giu' sembra che && e & facciano la stessa cosa solo che 
&& e' piu' furbo e se trova un FALSE si ferma senza andare avanti a 
controllare le altre condizioni.
&& e & non fanno la stessa cosa.
&& e' un operatore logico che serve per concatenare una serie di 
proposizioni:  (proposizioni1 && proposizioni2 && proposizioni3)
Solo se tutte e 3 le proposizioni sono vere allora il risultato e' vero. 
&& di fatto e' l'AND della logica.
& invece nn c'entra nulla con la logica ma ha a che fare con la 
matematica, con i numeri.
A & B non vuol dire: se A e' vero e B e' vero allora vero, ma 
semplicemente vuol dire fai l'AND bit a bit dei due numeri A e B.
L'AND, cosi' come tutte le operazioni matematiche, e' una funzione ben 
definita ed il risultato e' un numero che non ha nulla a che fare con la 
relazione logica tra 2 proposizioni.
Stesso discorso ovviamente valer per || e |.
Concludendo, tu hai ragione, il tuo prof no.

 è verificato come TRUE, questo ovviamente per motivi di efficienza.
parzialmente vero..
* non viene fatto solo per motivi d'efficienza
  considera questo:
  void test(A* a) {
    if ( a!=0 && a->isSomethingTrue() ) 
      a->doSomething();
  }
* non è vero che l'ordine di valutazione di &&( o ||) sia sempre definito
  in C++:
  nel caso venga fornito un overload di operator&& ( o operator||) si
  perde la semantica di cortocircuito e l'ordine di valutazione per
  quell'operatore.
 
-- 
sbirish

       a->doSomething();
[cut]
Adoro il c++; una cosa del genere in vb non si puo' fare!
Grazie a tutti per le risposte; avete fugato i miei dubbi in maniera
eccellente. Ovviamente ne nasceranno presto altri, quindi al prossimo
post!
Asfodelo Nero

 Adoro il c++; una cosa del genere in vb non si puo' fare!
Si puo' fare, ma con una sintassi diversa.
Puoi fare una
cascata di if che ha esattamente lo stesso significato
(lo scrivo in C perche' per il basic sono rimasto al c64...)
if (a!=0)
{
    if (a->isSomethingTrue()) a->doSomething();
}
che e' equivalente,
in quanto il secondo if viene valutato solo se
passa il primo.
Il C(++) ha il dono della sintesi...
ciao.
g.

 Il C(++) ha il dono della sintesi...
e dei trabocchetti =)
sbirish

 cascata di if che ha esattamente lo stesso significato
[cut]
Beh dai, sto imparando ma a fare due if ci arrivo anch'io! :)
Intendevo proprio farlo in una riga sola. Comunque ci sono altre cose
che proprio non si possono fare in vb...
Ciao,
Asfodelo Nero


dimmene una.
g.

 dimmene una.
Beh, ad esempio puoi compilare i programmi per unix. :P
Se invece intendi proprio a livello di linguaggio te ne dico subito
una: i puntatori a funzioni.
Asfodelo Nero


Scusami tanto, la mia domanda non era proprio una vera domanda,
stavo giocando sul significato leggermente equivoco della tua
espressione "... cose che proprio non si possono fare in vb".
Se intendiamo "a livello di linguaggio" e' chiaro che ogni
linguaggio di programmazione ha la sua sintassi
e quindi e' ovvio ci siano cose
che puoi fare con una sola istruzione in C++ e invece ti ci vuole molto
di piu' in VB o in forth o in lisp o in prolog etc.etc.
Ma vale anche il viceversa. Anche rimanendo nei linguaggi imperativi,
per esempio, il "goto calcolato" c'era in basic e in fortran,
ma non c'e' in C++ una istruzione corrispondente (poco male!).
Se invece per "cose che si possono fare" intendiamo il generare un
dato output in funzione di un dato input,
la cosa importante e' che tutti questi linguaggi
sono comunque "universali". Quindi qualunque funzione (in senso lato)
che puoi calcolare in un linguaggio le puoi calcolare anche
negli altri anche se a seconda dei casi dovrai fare un po' piu' fatica.
In particolare, dato un programma che usa i puntatori
a funzione si puo' scrivere un programma in Vb che non li
usa ma fornisce lo stesso output.
ciao,
g.