|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 30
|
[C] risultato di: a=a++;
il quesito è il seguente:
cosa viene stampato come valore di a dal seguente frammento di sw: a=0; a=a++; printf(a); ora: lo so che a=a++; non ha senso pratico, ma qualcuno sa spiegarmi perchè il valore finale di a è 0 e non 1? O meglio: è vero che l'incremento avviene dopo l'assegnazione, però riguarda sempre la variabile a. Riassumendo: ero convinto che a alla fine valesse 1 ed invece vale 0. grazie a che vorrà aiutarmi con questo problema esclusivamente teorico e poco pratico. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 2516
|
Ma a e' int ?
Supposto sia int, fa proprio 1 Codice:
int a=0;
a=a++;
printf("a=%d\n", a);
__________________
As goes google so goes the world | Artix | Arch | Pyvideo
Ultima modifica di Agat : 10-03-2010 alle 01:01. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
l'ho appena compilato e mi dà 1. Ultima modifica di Black imp : 10-03-2010 alle 01:07. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2007
Città: Monza
Messaggi: 627
|
In effetti dovrebbe stampare 1 anche secondo me...
|
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
a=0 !!!!
1. Il buffer si predispone per fare a = a ponendo la seconda a nello stack 2. Il buffer incrementa a di 1 la a nello stack 3. Il buffer esegue a = a considerando la a PRIMA dell'incremento perché è a++ e non ++a 4. Lo stack viene eluso dalla precedenza 5. Il buffer esce con a = 0 Ultima modifica di flx2000 : 10-03-2010 alle 11:30. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2008
Messaggi: 401
|
Provato e stampa 1... come mi sembra anche logico, del resto.
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
Quote:
L'ho verificato io stesso pochi istanti fa con VS C++ e C# e dà 0. Dovrei provare con g++ per vedere se dà 1. Di fatto, la "logica" naturale (del gcc ad esempio) vuole che si legga in questo modo: "Viene eseguita l'operazione a destra e alla fine assegnata alla parte sinistra". Allora è chiaro che le fasi sarebbero: 1. Eseguo l'incremento (a passa da 0 a 1) 2. Lo assegno a se stesso (a resta a, cioè 1) Diversi compilatori possono generare diversi risultati se si trovano a lavorare su funzioni di questo tipo perché dipende tutto da come usano lo stack, che non a caso è una delle cose che differenzia maggiormente tra loro i compilatori. Ultima modifica di flx2000 : 10-03-2010 alle 14:36. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
a viene usato sia come come lvalue che rvalue nell'ambito dello stesso sequence-point, quindi (secondo lo standard C++) il risultato di quell'espressione non è definito.
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 30
|
non mi aspettavo risposte così numerose al mio quesito: grazie.
il mio risultato , cioè 0, lo ottengo sia con DEVC++ che con visual C#. vorrei sapere, da chi ottiene 1, con che compilatore lavora. grazie ancora a tutti. |
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: Dec 2007
Messaggi: 30
|
Quote:
se il codice fosse a=0; b=a++; printf(b); il risultato sarebbe sicuramente b=0, perchè l'incremento avviene dopo l'assegnazione. |
|
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
Se guardi bene anch'io ho dato risposta 0. La spiegazione che citi è un'ipotesi che ho cercato di dare per giustificare i casi in cui è uscito 1 (dando per scontato che qualcuno abbia effettivamente ottenuto 1)
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Al di là del fatto dell'implementazione specifica del compilatore, secondo me il risultato più giusto (e che uno si aspetta da questa operazione) è zero.
La ragione è che una espressione come "a++" viene valutata prima dell'incremento, quindi il valore in cui una espressione come "a++" , se il valore di a prima dell'espressione è 0, è proprio 0. Ricapitolando quindi : a=0; viene assegnato ad a il valore 0 a=a++; prima viene valutato "a++" e quindi 0, poi viene effettuato l'incremento, quindi a = 1 , poi però viene effettuato l'assegnamento con il valore 0 memorizzato in precedenza dalla valutazione di a++ e quindi a torna ad essere 0. Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 11-03-2010 alle 10:20. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Sep 2007
Città: Monza
Messaggi: 627
|
Quote:
Pensando a come funzioni lo stack e il compilatore probabilmente è giusto che esca 0, ma per logica dovrei ottenere 1, se metto quel ++ vorrà pur dire che voglio incrementare a no? se lo faccio prima o dopo il risultato non dovrebbe comunque cambiare; mi sembra più un "difetto" del compilatore Ultima modifica di Galdor : 11-03-2010 alle 10:16. |
|
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Aug 2007
Messaggi: 235
|
Quote:
Codice:
#include <stdio.h>
int main(){
int a; // Inizializzazione
a=0; // assegnazione di 0 ad "a"
a=a++;
/* Questa dovrebbe tradursi così:
a=a; Assegnazione di 0 ad a, di nuovo
a++; incremento di a, quindi dopo l'istruzione: a = 1;
*/
printf("a=%i\n", a); // Stampa
}
Non so come possa venire 0 a qualcuno, a meno di errori di trascrizione del codice, vorrebbe dire che il compilatore usato ha dei problemi rispetto allo standard nella gestione degli operatori come ++
__________________
Vendo Adattatore mini DP -> HDMI con audio Ultima modifica di kralizec : 11-03-2010 alle 10:36. Motivo: correzione |
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
Quote:
Visual Studio 2008, C#: Codice:
{
int a = 0;
a = a++;
}
|
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
Quote:
|
||
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Sep 2007
Città: Monza
Messaggi: 627
|
Ho capito che lo standard non definisce un comportamento preciso in questo caso, ma se tu dovessi scrivere un compilatore che esegue quelle istruzioni gli faresti tornare 1 o 0 ?
Chiaro che sia che torni uno o l'altro il compilatore rispetterà lo standard, ma IMHO se torna 1 è meglio |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
|
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Aug 2007
Messaggi: 235
|
ok, abbiamo capito che non è ben definito il comportamento, ma c'è anche da dire che tu hai quotato è dello standard del c++, non del c
per fix2000, Visual Studio, per quanto riguarda la mia esigua esperienza, si rivela spesso discostante da gcc... per non parlare del fatto che tu hai compilato in C# e non in C io ho solo riportato l'output delle mie compilazioni, che rispecchiano (fortunatamente per me) le mie aspettative
__________________
Vendo Adattatore mini DP -> HDMI con audio |
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
Comunque non cambia molto Quote:
|
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:00.












mica l'ho capita la spiegazione che hai dato... e soprattutto, l'hanno compilato e stampa 1 (non ho tempo di provarlo personalmente ora...)







