Il modo migliore per spiegare l'errore dichiarativo in C++?
-
20-09-2019 - |
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?
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.