Newsgroup: it.comp.lang.c
Titolo: sono nuovo di zecca.

Salve,
sto studiando da pochissimo il c: forse è l'inizio di una lunga passione, 
forse un fuoco di paglia.
Premessa:
Da quel che ho capito, una variabile:
- prima si dichiara: int a;
- poi le si assegna un valore: a = 5; oppure a = 3*b;, ecc
- infine la si usa
Per quanto riguiarda l'assegnazione, mi pare di aver compreso che:
int a = b = 10;
- dichiari a
- le attribuisca il valore dell'assegnazione b=10, ossia 10
Domande:
1) ma nell'ultimo caso b deve essere stata già dichiarata?
2) usando questa: printf("aaaa %d, ddddd %d", ffffff %d", a = 7, b, c);
mi sono accorto di una cosa strana. Mi pareva di aver capito che le 
assegnazioni, come viste sopra, potessero esser fatte anche tra gli 
argomenti di printf, inizializzando o mutando il valore di variabili 
previamente dichiarate. Come mai, però, se faccio questo, tutti le 
variabili-argomento (già previamente dichiarate ed inizializzate), che 
seguono la assegnazione (quindi b e c), danno valori assurdi?
Mi spiego, lanciando il programma ottengo:
aaaa 7 ddddd 3034444 ffffff -3341545
mentre b e c eranomagari  4 e 5?
Grazie 

 aaaa 7 ddddd 3034444 ffffff -3341545
per esempio:
int a;
int c = 3;
printf("a vale  %d  e %d e %d \n", a = 9*c, c, a);
non funziona proprio. Il terzo valore stampato č -370086, ma se scrivo:
printf("vale  %d  e %d e %d \n", a = 9*c, c, );
printf("vale  %d  \n", a);
ottengo come terzo valore il valore assegnato ad a (a = 9*c).
Quindi viene mantenuto il valore della assegnazione di a, eppure se lo 
richiamo nella stessa printf, niente.
Perchč? 

 Perchè? 
Dipende dall'ordine di valutazione degli argomenti passati ad 
una funzione. Nulla ti garantisce che essi vengano valutati da 
sinistra verso destra piuttosto che da destra verso sinistra. 
Sostanzialmente dipende dal compilatore. In questo caso la 
valutazione sembra da destra verso sinistra. La variabile a in 
fondo viene valutata al valore che ha, ovvero niente di 
inizializzato esplicitamente (qualsiasi cosa stia in quel 
momento al suo indirizzo di memoria). Poi viene valutata c a 3 
e poi viene valutato il valore 9*3 (l'assegnamento è un side 
effect). Generalmente evita di passare argomenti su cui 
operano i side effect. Per esempio:
int i=0;
printf("%d %d", ++i, ++i);
stamperà: 1 2 o 2 1? Non lo puoi dire a priori perché non 
conosci l'ordine di valutazione e gli argomenti sono affetti 
da side effect.
http://c-faq.com/expr/comma.html
Ciao.

 
http://c-faq.com/expr/comma.html
Molto chiaro, grazie.
Ciao 

 stamperà: 1 2 o 2 1? 
...oppure: 2 2?
cioe': potrebbe prima eseguire tutte le operazioni di incremento, e poi 
fare il push (2 volte) nello stack del risultato finale di 'i' per la 
chiamata alla printf.
ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 da side effect.
In realtà potrebbe stampare qualsiasi cosa perché l'espressione in questione
è illegale. Il separatore degli argomenti nella chiamata di una funzione (a
differenza dell'operatore ",", che è un'altra cosa) non stabilisce un
sequence point. Modificare una locazione più di una volta senza che
intervenga un sequence point ha effetti indefiniti.
 n = ++i + ++i; /* illegale */
 n = ++i, ++i;  /* legale */
 n = ++i && ++i /* legale */
Max

 n = ++i && ++i /* legale */
Non ho copmpreso, scusami.
Allora: la virgola è il separatore degli argomenti nella chiamata di 
funzione?
Se sì, mi pare di capire che tu dica: questo separatore di argomenti non 
stabilisce una sequenza.
E quindi bisogna usare && al posto della virgola  per stabilire una 
sequenza?
Cmq ICC procede da destra a sinistra.
Grazie