Domanda

Come si potrebbe creare una buona spiegazione del motivo per cui il codice seguente non è corretto, in quanto l'autore sta tentando di scrivere codice C++ in modo dichiarativo anziché procedurale?

const double NEWTONS_PER_POUND = 4.448;

int main()
{
   double pounds, newtons;
   pounds = newtons/NEWTONS_PER_POUND; /* pounds equals 'unassigned variable'/4.448 */
   newtons = 10.0;
   cout << pounds << endl;             /* a big number, not 10.0/4.448 */
   return 0;
}

L'autore si aspettava cout per visualizzare un calcolo corretto, ma ottiene invece un "numero folle".

Lo spiegherei come "C++ è procedurale, e quindi al momento della dichiarazione

pounds = newtons/NEWTONS_PER_POUND;

newtons non è stato assegnato un valore.

Qualche suggerimento migliore?O una spiegazione del motivo per cui il C++ non è abbastanza "intelligente" da eseguire il comportamento erroneamente previsto dall'utente?

È stato utile?

Soluzione

Dillo l'autore che

pounds = newtons/NEWTONS_PER_POUND;

comanda la CPU

  • prendere il valore all'indirizzo denominati "newton"
  • prendere il valore all'indirizzo denominato "NEWTONS_PER_POUND"
  • dividerli
  • memorizzare il risultato all'indirizzo denominati "chili"

quello che sta cercando è molto probabilmente una funzione in termini imperativi:

double newtons_to_pounds(double newtons) {
  return newtons/NEWTONS_PER_POUND;
}

...

newtons = 10.0;
cout << newtons_to_pounds(newtons) << endl;    /* a big number, not 10.0/4.448 */
return 0;

Altri suggerimenti

C++ è un linguaggio di programmazione imperativo, non un risolutore di equazioni.

Il C++ esegue le istruzioni nell'ordine in cui le scrivi.Il C++ non inizializza le variabili a meno che non gli venga chiesto di farlo.C++ ti consente di utilizzare una variabile il cui valore non è stato inizializzato, ma quando lo fai il risultato lo è non specificato.Non specificato significa che può succedere di tutto, comprese cose brutte come la produzione di "numeri pazzi".

Ecco la spiegazione dettagliata:

double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;

La prima istruzione dichiara due variabili senza inizializzarle.A questo punto, i loro valori non sono specificati.

La seconda istruzione legge il valore di newtons (che potrebbe essere qualsiasi cosa) e lo divide per NEWTONS_PER_POUND.Il risultato (che potrebbe essere qualsiasi cosa) viene assegnato a pounds.

La terza istruzione viene inizializzata newtons, ma è troppo tardi per influenzare il calcolo che abbiamo appena eseguito.

Bene che non dovrebbe essere troppo difficile da spiegare, a prescindere dal fondo degli studenti: basta Thell che C ++ valuta i programmi di un passo alla volta, dichiarazione dopo dichiarazione (nonostante gli artefatti del compilatore quali riordino ...)

Non c'è assolutamente niente di speciale per C ++’modo di gestire questo, né è ancora limitato alla programmazione -. Piuttosto, è un modo di tutti i giorni di trattare con una lista ordinata di istruzioni

Non è pigro newton valutazione

In quanto tale il calcolo viene effettuato al momento della dichiarazione, non al momento della richiesta. E 'dopo il codice funzionale, non ciò che C ++ farà.

Se la persona non è eccessivamente tecnica si potrebbe provare:

"Le dichiarazioni contenute nel presente programma C ++ sono come i passi necessari per fare una torta. È necessario eseguire i passi uno per uno e che deve essere deve essere eseguito in un certo ordine per essere un successo".

Spiega che sterline è assegnato un valore in linea con l'operatore di assegnazione:

pounds = newtons/NEWTONS_PER_POUND;

Se questo non fosse il caso, ma che è stata valutata chili quando è stato utilizzato (come con l'istruzione cout), quindi se il valore di newton cambiato, allora il valore di sterline cambierebbe pure. Poiché sterline non è un qualsiasi tipo di puntatore, ma è un intero semplice, questo non è possibile.

Che dire fare un passo attraverso il codice in un debugger?

IME non c'è niente come questo per capire l'esecuzione di un programma scritto in un linguaggio procedurale (vale a dire, sul modello come la CPU in realtà esegue il codice).

Si sta tentando di ottenere l'ascoltatore a subire un cambiamento di paradigma -. Di cambiare la sua / il suo intero approccio per comprendere questo codice

  

"chili" è solo un numero. E 'ottenuto senza   concetto di come la sua creazione. dite   "Libbre" come è stato creato, non lo farà   ricorda. E 'solo ricordare che cosa   è, non come è stato creato.

Può sembrare un po 'strano antropomorfizzandoli un blocco di memoria. : -)

Dai esempio leggermente più complesso in cui una variabile come newtons viene riutilizzato e valori assegnati più di una volta. Per esempio:

double pounds, newtons;

newtons = 10.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

newtons = 15.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

return 0;

Mostra lui sia il codice e l'output. Allora gli chiedo di spiegare come e perché il programma produce un numero diverso per ogni linea. Mi piacerebbe pensare che dovrebbe aiutarlo a spingere nella direzione della visione del programma come una procedura che va dall'alto verso il basso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top