|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
C++ Guru della Settimana #1
Prendendo spunto dall'analogo appuntamento che si svolge sul newsgroup comp.lang.c++.moderated, proviamo a proporre lo stesso "gioco" qui sul forum di HWUpgrade.
L'idea e' di presentare a tutti un quesito di C++ che esplori un problema o una curiosita' legata al linguaggio. Tutti sono invitati a provare a rispondere al quesito e trovare la soluzione, discutendone assieme. Dopo qualche giorno vi presentero' la soluzione e potremo commentarla. Se l'idea vi piace e prende piede, potremmo farlo diventare un appuntamento regolare e magari chiedere ai moderatori un forum apposito. Se avete idee su quesiti da proporre, contattatemi pure in PM. Quesito #1. Dato il seguente pezzo di codice: Codice:
class A
{
public:
A(void)
: b(10)
, a(b + 1)
{
}
int a;
int b;
};
void main(void)
{
A obj;
printf("a = %d\nb = %d\n", obj.a, obj.b);
}
Giustificate la risposta.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 18-12-2003 alle 12:47. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Ma scusa, lo compilo, lo eseguo e te lo dico
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
E poi il bello e' capire il perche' dell'output che vedi e se l'output non e' quello atteso, come correggere il codice per renderlo tale.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: May 2003
Messaggi: 119
|
Nn ho la minima idea d qello ke stampi,
ma andando a intuito direi a = un numero a caso b = 10 Nn kiedetemi xké |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Genova
Messaggi: 4330
|
Dunque...dunque
class A { public: A(void) : b(10) , a(b + 1){} int a; int b; }; void main(void) { A obj; printf("a = %d\nb = %d\n", obj.a, obj.b); } Direi questo la classe A ha un costruttore di default che imposta il dato b = 10 e il dato a = 11, nel main l'oggetto di tipo A chiamato obj direi che assume per default questi valori dato che al costruttore non ne vengono passati di diversi; l'output dovrebbe essere: a = 11 b = 10 giusto?
__________________
.::. Steam: ~Blissard~ .::. Origin: Blissard79 .::. BNet: Blissard#2740 .::. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Genova
Messaggi: 4330
|
Ripensandoci il valore di a non è così scontato potrebbe anche fare cose strane e non venire inizializzato realmente....
__________________
.::. Steam: ~Blissard~ .::. Origin: Blissard79 .::. BNet: Blissard#2740 .::. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Ok, piccolo suggerimento.
Il valore non e' scontato, ma il comportamento si'. Nel senso che il comportamento e' ben definito nello standard C++.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2003
Città: Napoli
Messaggi: 6193
|
Scusate... io la butto lì...
Gia è assai che il compilatore non vi sputi in faccia! C'ho preso?
__________________
Diablo3 PF | MyPC(liquidato) - Case Corsair Obsidian 800D / PSU Enermax Galaxy 1000W / MB GA-EX58A-UD7 / CPU Intel I7 920 [email protected] / MEM Corsair Dom. GT@1680mhz / GPU R9 290X / HD 2xWD 150GB raid 0/ SO - Windows 7 Ult. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
il valore di a dovrebbe essere il valore che era presente nella cella di memoria prima della definizione di a maggiorato di un'unità...
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Siamo sicuri che non sia dipendente dal compilatore ?
Il mio prof di informatica 1 diceva sempre che nel programmare in C++ è sbagliato fare presupposizione sull'ordine di valutazione da parte del compilatore di espressioni a pari priorità (in questo caso b(10) e a(b + 1), oppure anche i due parametri di un operatore)... |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2003
Città: Napoli
Messaggi: 6193
|
Quote:
Non è che hai eseguito e non hai capito il risultato??? Comunque è giusto. Anche se nn è una questione di priorità...
__________________
Diablo3 PF | MyPC(liquidato) - Case Corsair Obsidian 800D / PSU Enermax Galaxy 1000W / MB GA-EX58A-UD7 / CPU Intel I7 920 [email protected] / MEM Corsair Dom. GT@1680mhz / GPU R9 290X / HD 2xWD 150GB raid 0/ SO - Windows 7 Ult. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Un altro indizio, qual e' l'ordine di valutazione delle due istruzioni di inizializazione nel costruttore? E random? Dipende dal compilatore? E' sempre lo stesso? Perche'? Il risultato cambia se scrivo invece questo? Codice:
class A
{
public:
A(void)
: b(10)
, a(b + 1)
{
}
int b;
int a;
};
void main(void)
{
A obj;
printf("a = %d\nb = %d\n", obj.a, obj.b);
}
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Re: C++ Guru della Settimana #1
Quote:
b = 1 Perche: Perche a nn è inizializzato. IMHO
__________________
Gnu/Linux User
Ultima modifica di Luc@s : 18-12-2003 alle 16:38. |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Quote:
Finche nn sappiamo cosa è a , b sara sempre 1 IMHO
__________________
Gnu/Linux User
|
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Jul 2003
Città: pisa
Messaggi: 141
|
l'inizializzazione viene nell'ordine in cui sono dichiarati a e b all'interno nella classe, per cui nel primo caso a viene un numero a caso perché b non è ancora stato inizializzato; se invece cambio l'ordine come nel secondo esempio avrò a=11 b=10
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2003
Città: Napoli
Messaggi: 6193
|
Quote:
__________________
Diablo3 PF | MyPC(liquidato) - Case Corsair Obsidian 800D / PSU Enermax Galaxy 1000W / MB GA-EX58A-UD7 / CPU Intel I7 920 [email protected] / MEM Corsair Dom. GT@1680mhz / GPU R9 290X / HD 2xWD 150GB raid 0/ SO - Windows 7 Ult. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Quote:
__________________
Gnu/Linux User
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Nov 2003
Città: Napoli
Messaggi: 6193
|
Quote:
__________________
Diablo3 PF | MyPC(liquidato) - Case Corsair Obsidian 800D / PSU Enermax Galaxy 1000W / MB GA-EX58A-UD7 / CPU Intel I7 920 [email protected] / MEM Corsair Dom. GT@1680mhz / GPU R9 290X / HD 2xWD 150GB raid 0/ SO - Windows 7 Ult. |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Quote:
__________________
Gnu/Linux User
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Nel primo caso il compilatore produce un costruttore che assomiglia a: Codice:
int a;
int b;
// [...]
{
a = b + 1;
b = 10;
}
Mentre nel secondo caso il costruttore assomiglia a: Codice:
int b;
int a;
// [...]
{
b = 10;
a = b + 1;
}
Questo comportamento e' dettato dallo standard C++ e va implementato cosi' da ogni compilatore conforme. Detto questo, si impara che e' buona abitudine non usare gli inizializzatori quando il valore di un membro della classe dipende dal valore di uno o piu' membri della classe. Usare normale codice nel costruttore. Questo vale anche quando di mezzo ci sono chiamate a costruttori di classi padri In tutti gli altri casi e' buona norma abituarsi a usare gli inizializzatori che aiutano a scrivere codice piu' pulito e leggible. Se vi e' piaciuto, fra qualche giorno propongo un altro quesito.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:50.



















