Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-03-2010, 23:26   #1
gege_63
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.
gege_63 è offline   Rispondi citando il messaggio o parte di esso
Old 09-03-2010, 23:51   #2
Agat
Senior Member
 
L'Avatar di Agat
 
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);
Edit: Dimenticavo che il perche', e' la precedenza inferiore dell'assegnamento rispetto all'incremento
__________________
As goes google so goes the world | Artix | Arch | Pyvideo | La tariffazione a 28 giorni è stato un crimine contro l'umanità

Ultima modifica di Agat : 10-03-2010 alle 00:01.
Agat è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 00:02   #3
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2658
Quote:
Originariamente inviato da gege_63 Guarda i messaggi
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.
scusa tu stai compilando con qualche livello di ottimizzazione?

l'ho appena compilato e mi dà 1.

Ultima modifica di Black imp : 10-03-2010 alle 00:07.
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 10:16   #4
Galdor
Senior Member
 
L'Avatar di Galdor
 
Iscritto dal: Sep 2007
Città: Monza
Messaggi: 627
In effetti dovrebbe stampare 1 anche secondo me...
Galdor è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 10:23   #5
flx2000
Bannato
 
L'Avatar di flx2000
 
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.
flx2000 è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 12:47   #6
agente mm8
Senior Member
 
Iscritto dal: Mar 2008
Messaggi: 401
Provato e stampa 1... come mi sembra anche logico, del resto.
agente mm8 è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 13:34   #7
flx2000
Bannato
 
L'Avatar di flx2000
 
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
quindi secondo te l'incremento quando viene fatto? mica l'ho capita la spiegazione che hai dato... e soprattutto, l'hanno compilato e stampa 1 (non ho tempo di provarlo personalmente ora...)
E' un tipico caso di programmazione che dipende dal compilatore.

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.
flx2000 è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 13:58   #8
||ElChE||88
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.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 20:36   #9
gege_63
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.
gege_63 è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2010, 21:07   #10
gege_63
Member
 
Iscritto dal: Dec 2007
Messaggi: 30
Quote:
Originariamente inviato da flx2000 Guarda i messaggi
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)
non sono tanto daccordo, perchè è un postincremento:
se il codice fosse

a=0;
b=a++;
printf(b);

il risultato sarebbe sicuramente b=0, perchè l'incremento avviene dopo l'assegnazione.
gege_63 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 08:51   #11
flx2000
Bannato
 
L'Avatar di flx2000
 
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
Quote:
Originariamente inviato da gege_63 Guarda i messaggi
non sono tanto daccordo, perchè è un postincremento:
se il codice fosse

a=0;
b=a++;
printf(b);

il risultato sarebbe sicuramente b=0, perchè l'incremento avviene dopo l'assegnazione.
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)
flx2000 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 09:06   #12
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 09:11   #13
Galdor
Senior Member
 
L'Avatar di Galdor
 
Iscritto dal: Sep 2007
Città: Monza
Messaggi: 627
Quote:
Originariamente inviato da gege_63 Guarda i messaggi
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.
Con Visual C++ 2008 express edition a me stampa 1 che credo sia il risultato più logico...
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.
Galdor è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 09:33   #14
kralizec
Member
 
Iscritto dal: Aug 2007
Messaggi: 235
Quote:
Originariamente inviato da AnonimoVeneziano Guarda i messaggi
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 ha 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
Allora, a++ è un POST incremento, significa che, al contrario di ++a, l'incremento della variabile avviene DOPO l'assegnamento, quindi il programma dovrebbe procedere come segue:

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
}
Questa interpretazione, secondo me, spiega correttamente il fatto che il risultato sia 1, provato su macOS, con gcc 4.4.0 20080801 (experimental) e su macchina virtuale con ubuntu, con gcc 4.4.1 (Ubuntu 4.4.1-4ubuntu9).

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 ++

Ultima modifica di kralizec : 11-03-2010 alle 09:36. Motivo: correzione
kralizec è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 09:45   #15
flx2000
Bannato
 
L'Avatar di flx2000
 
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
Quote:
Originariamente inviato da kralizec Guarda i messaggi
Allora, a++ è un POST incremento, significa che, al contrario di ++a, l'incremento della variabile avviene DOPO l'assegnamento, quindi il programma dovrebbe procedere come segue:

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
}
Questa interpretazione, secondo me, spiega correttamente il fatto che il risultato sia 1, provato su macOS, con gcc 4.4.0 20080801 (experimental) e su macchina virtuale con ubuntu, con gcc 4.4.1 (Ubuntu 4.4.1-4ubuntu9).

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 ++
Appena riprovato.
Visual Studio 2008, C#:
Codice:
{
    int a = 0;
    a = a++;
}
Il breakpoint sulla parentesi conclusiva segna chiaramente a = 0 in fase di esecuzione del codice.
flx2000 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 09:53   #16
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4906
Quote:
Originariamente inviato da Galdor Guarda i messaggi
mi sembra più un "difetto" del compilatore
Quote:
Originariamente inviato da kralizec Guarda i messaggi
vorrebbe dire che il compilatore usato ha dei problemi rispetto allo standard nella gestione degli operatori come ++
E dire che l'ho già scritto sopra...
Quote:
Originariamente inviato da ISO/IEC 14882:2003(E) C++ Standard
Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual
expressions, and the order in which side effects take place, is unspecified. Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined. [Example:
i = v[i++]; // the behavior is unspecified
i = 7, i++, i++; // i becomes 9
i = ++i + 1; // the behavior is unspecified
i = i + 1; // the value of i is incremented
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 10:04   #17
Galdor
Senior Member
 
L'Avatar di Galdor
 
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
Galdor è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 10:07   #18
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4906
Quote:
Originariamente inviato da Galdor Guarda i messaggi
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
Se lo standard dice che non è definito allora il compilatore può restituire quello che gli pare, che ti piaccia o meno.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 10:20   #19
kralizec
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
kralizec è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2010, 11:15   #20
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4906
Quote:
Originariamente inviato da kralizec Guarda i messaggi
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
Azz, hai ragione, non so perché pensavo si parlasse di C++.

Comunque non cambia molto
Quote:
Originariamente inviato da ISO/IEC 9899:TC2 C99 Standard
Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.

This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
2 minuti: il tempo per scorrere le 25 of...
Mini LED TCL: confronto tra le migliori ...
Robot aspirapolvere: questi sono i più a...
Portatile tuttofare Lenovo Core i5/16GB ...
Scende a 99€ il tablet 11" 2,4K con...
Amiga: quali erano i 10 giochi più belli
Driver più sicuri: Microsoft alza...
Ego Power+ ha la giusta accoppiata per l...
Scompiglio nei listini Amazon: prezzi im...
Sotto i 105€ il robot Lefant che lava, a...
Mini proiettori smart in offerta: uno co...
Smartwatch Amazfit in offerta: Balance o...
Windows XP ritorna: ecco come usarlo sub...
Arrow Lake in saldo: Intel taglia i prez...
LG C4 da 55'' a 899€ è il top per...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v