|
|
|
![]() |
|
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: 2515
|
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 00:01. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2658
|
Quote:
l'ho appena compilato e mi dà 1. Ultima modifica di Black imp : 10-03-2010 alle 00: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 10: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 13:36. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4906
|
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: 13826
|
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 09: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 09: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 09: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: 4906
|
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: 4906
|
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: 4906
|
Quote:
![]() Comunque non cambia molto ![]() Quote:
|
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:33.