Newsgroup: it.comp.lang.c
Titolo: Re: Inclusione assegnamento in argomento di un if


		ciao, rz
-- 
http://mrzac.altervista.org

 valutare se questo valore è diverso da un certo valore. 
Sì, nel caso della fopen() non si tratta di una regola particolare.  
La logica è sempre la stessa, un'assegnazione del tipo:
lvalue = rvalue
ha come risultato l'lvalue, quindi se scrivi:
if ((a=b=5))...
equivale a: 
if (a) ...
L'unica raccomandazione è di mettere l'argomento della if all'interno di
un ulteriore set di parentesi, in modo da far comprendere al compilatore
che il controllo dell'assegnazione è voluto.  Una delle sviste più
frequenti (specie per chi programma in più linguaggi contemporaneamente
;-) è quella di scrivere:
if (a=b) ...
_al posto_ di:
if (a==b)...
Il compilatore segnala un possibile errore di assegnamento con un warning,
ma se scrivo:  
if ((a=b))...
vuol dire che voglio esplicitamente testare il valore di a, dopo
l'assegnazione ad esso del valore di b.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ciao a tutti, volevo chiedervi se, così come è possibile includere 
un'assegnamento ad un puntatore ad un file nell'argomento di un if che 
valuta il valore di ritorno della fopen(), è possibile assegnare un 
valore ad una variabile e, sempre nell'argomento del medesimo if(), 
valutare se questo valore è diverso da un certo valore. Tale valutazione 
è quella che deve costituire la condizione dell'if().
Ecco un esempio di ciò che intendo:
con la fopen() si può fare:
if(  (file0 =  fopen("PATH", "r")) == NULL )
è allora possibile una cosa di questo tipo:
if(  *(temp+i) = *(pwdir + j) != '0' )
Un'assegnamento (es. i=2;) vale il valore che si assegna alla variabile 
in una valutazione logica?
  ciao e grazie, rz
-- 
"Una riga lasciata bianca può valere più di 100 parole"

 if(  *(temp+i) = *(pwdir + j) != '0' )
Qui` pero` manca una coppia di parentesi. L'operatore di confronto ha
priorita` piu` alta rispetto all'assegnamento, quindi l'espressione e`
equivalemente a:
*(temp + i) = ( *(pwdir + j) != '0' )
In pratica a temp[i] viene assegnato 1 oppure 0 in base all'esito della
disuguaglianza. Per fare quello che vuoi devi forzare l'assegnamento
prima del confronto:
if ( (*(temp + 1) = *(pwdir + j) ) != '0' )
Btw, se il tuo intento e` controllare la presenza del terminatore di
stringa devi usare '\0', non '0'.
Come nota personale aggiungo che abusare di costrutti del genere puo`
peggiorare la leggibilita` del codice; nel tuo esempio, specie senza
tutti gli spazi messi artificialmente, e` difficile capire a colpo
d'occhio cosa sta accadendo. Per cose "standard" (quali ad esempio la
fopen oppure la malloc) puo` andare, ma per cose piu` complesse e`
meglio usare una variabile temporanea (che tanto con un compilatore
recente e` praticamente gratis).
Luca
-- 
Home: 
http://kronoz.cjb.net
Io mi ricordo sempre il compleanno della mia ragazza:
cade il giorno dopo di quando lei me lo ricorda

mrzac <molan...@email.itALIA> wrote:

Attenzione: "il valore che si assegna" e ambiguo
	signed char s;        /* char: 8 Bit */
	unsigned char u;
	(s=-1)     valore -1
	(s=1)      valore  1
	(u=1)      valore 1
	(u=-1)     valore 255 (!)
in "u=-1" si assegna -1 ma 255 viene assegnato ;-)
Piu preciso: Il valore di un assegnamento è il valore nella variabile
assegnata dopo l'assegnamento.
-- 
Horst


Grazie 1000! Sapete mica se ANSI C dice qualcosa di ufficiale e 
"universale" a riguardo?
	ciao e grazie, rz
-- 
http://mrzac.altervista.org

"universale" a riguardo?
       An assignment expression has the value of the left operand
       after the assignment, but is not an lvalue. 
-- 
Horst