Newsgroup: it.comp.lang.c++
Titolo: Problema di ==

A volte capita di incappare nel classico baco generato da:
if (a=b)
 {
   ...
 }
La maggior parte delle volte ci si accorge che bisognava usare '==' ma
in codici enormi può scappare.
Penso che purtroppo non ci sia una soluzione valida... (un warning?)
Luc.


Qualcuno scrive le condizioni nella forma
if ( 5 == a )
in modo che venga generato un errore se ci si dimentica un uguale.
Personalmente la trovo una soluzione intelligente, ma mi va troppo
contro pelo per riuscire a utilizzarla :-)
Ciao,
Nicola


Su alcuni compilatori se imposti il livello di warning al massimo ti tirano
fuori tutte le espressioni condizionali che contengono un assegnamento (lo
faceva anche il buon vecchio compilatore Turbo C della Borland).
Una buona norma sarebbe di mettere sempre un test anche in presenza di un
assegnamento (cosa che la microsoft ha puntulamente aggiunto a C# obbligando
un boolen type al'interno delle espressioni condizionali).
So che tutti i programmatori C* (C e C++ ;) ) sanno e usano il fatto che
l'if ammette anche un'espressione numerica,
ma credo che ormai tutti i compilatori siano in grado di fare le
ottimizzazioni necessarie (anche se non ho mai fatto delle prove in tal
senso).
Giacomo

Penso che purtroppo non ci sia una soluzione valida... (un warning?)
"Possible incorrect assignment".
I compilatori Borland segnalano qualcosa del genere.
--
Andrea Laforgia (UIN 87230455)
----------------------------------------------------------
Non scrivetemi per e-mail, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------


Non ho capito cosa intendi.
Manlio Perillo


Intendo che se uno fa un confronto esplicito in tutte le espressioi
condizionali (e fa una programmazione "pulita") puo'
lasciare i warning dei compilatori al massimo senza dover poi impazzire tra
le migliaia di warning generati.
Per quanto riguarda il C# ho letto da qualche parte che nelle espressioni
condizionali ammette soltanto un tipo booleano (tipo Delphi) non
convertibile in un intero.
Insomma if (i=x) e' un errore e non un'assegnazione piu' un test implicito
su i <>0 (i !=0 :)).
Giacomo

 un boolen type al'interno delle espressioni condizionali).
Piu' che aggiunto, copiato da Java...
Ciao,
Nicola


Mi sembrava superfluo visto che tutto il C# sembra Java ... :)
Giacomo


Ma si può continuare a fare
   int x = 5;
   if(x);
?
Manlio Perillo

 ?
Da quello che ho letto no.
if () vuole un bool, quindi
int x=5;
bool vero_falso =  ( x != 0 )          // le parentesi sono per chiarezza
                                                        // e "bool" e' un
tipo del linguaggio come int
if ( vero_falso)
Giacomo

 ha scritto nel
messaggio news:8qa5td$356$1...@zamboni.dsnet.it...

Se è per questo, bool è un tipo a se stante ANCHE in C++.
(e ci sono le normali conversioni implicite).
Comunque se così fosse si perderebbe in flessibilità (GRAVE)
a costo di un ILLUSORIO aumento di facilità.
Del resto per evitare i problemi di if(a = b) basta
dare un warning.
Inoltre uno potrebbe implementare una classe
per cui if(a = b) ha una sua ragione di esistere.
Manlio Perillo


Infatti all'inizio del thread ho detto che se uno vuole lasciare il livello
dei warning al massimo e non scocciarsi con tutti quelli che escono e'
sufficiente programmare in maniera accorta e poi ci pensa il compilatore ad
ottimizzare
if ( (a=b) == NULL ) errore !
Ciao Giacomo