Frage

Wie könnte man Handwerk eine gute Erklärung, warum der folgende Code nicht korrekt ist, dass der Autor versucht, C ++ Code deklarativ und nicht prozedural zu schreiben?

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;
}

Der Autor erwartet cout eine korrekte Berechnung angezeigt werden, sondern bekommt eine „verrückte Nummer.“

Ich würde erklären, dies als „C ++ ist prozedurale und daher zum Zeitpunkt der Erklärung

pounds = newtons/NEWTONS_PER_POUND;

newtons wurde kein Wert zugewiesen.

Jede bessere Vorschläge? Oder eine Erklärung, warum C ++ ist nicht „smart“ genug, um das Verhalten auszuführen der Benutzer fälschlicherweise erwartet?

War es hilfreich?

Lösung

Sagen Sie den Autor, dass

pounds = newtons/NEWTONS_PER_POUND;

Befehle, um die CPU zu

  • nimmt den Wert an der Adresse bezeichnet als „Newton“
  • nimmt den Wert an der Adresse bezeichnet als „NEWTONS_PER_POUND“
  • teilen sie
  • speichern Sie das Ergebnis unter der Adresse bezeichnet als „Pfund“

, was er sucht, ist höchstwahrscheinlich eine Funktion in imperativen Bedingungen:

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;

Andere Tipps

C ++ ist eine imperative Programmiersprache kein Gleichungslöser.

C ++ führt Anweisungen in der Reihenfolge, dass Sie sie schreiben. C ++ nicht initialisiert Variablen, es sei denn es erzählt wird. C ++ können Sie eine Variable, deren Wert verwenden, wurde nicht initialisiert, aber wenn Sie diese das Ergebnis zu tun ist nicht spezifiziert . Nicht spezifizierte Mittel als alles passieren kann, auch schlechte Dinge wie die Herstellung von „verrückt Zahlen“.

Hier ist die detaillierte Erklärung:

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

Die erste Anweisung deklariert zwei Variablen, ohne sie zu initialisieren. Zu diesem Zeitpunkt sind ihre Werte nicht spezifiziert.

Die zweite Anweisung liest den Wert von newtons (was alles sein könnte) und teilt es durch NEWTONS_PER_POUND. Das Ergebnis (was alles sein könnte) auf pounds zugeordnet.

Die dritte Anweisung initialisiert newtons, aber es ist zu spät, um die Berechnung beeinflussen wir gerade durchgeführt wird.

Nun, das ist nicht zu hart sein sollte, unabhängig von dem Schüler Hintergrund zu erklären: nur Thell sie, dass C ++ auswertet Programme eines Schritt zu einer Zeit, Anweisung nach Anweisung (ungeachtet Compiler Artefakte wie Neuordnen ...)

Es gibt absolut nichts Besonderes zu C ++ Art und Weise des Umgangs mit diesem, noch ist es sogar auf Computer-Programmierung beschränkt -. Vielmehr ist es eine alltägliche Art und Weise mit einer geordneten Liste von Anweisungen des Umgangs

Es ist nicht faul Auswertung newtons

Als solche werden die Berechnung zum Zeitpunkt der Erklärung durchgeführt wird, nicht zum Zeitpunkt der Anfrage. Er ist nach funktionalem Code, nicht das, was C ++ tun wird.

Wenn die Person nicht zu technisch ist, könnte man versuchen:

„Die Aussagen in diesem C ++ Programm sind wie die Schritte erforderlich, um einen Kuchen zu machen. Sie müssen die Schritte nacheinander durchführen, und sie müssen in einer bestimmten Reihenfolge durchgeführt werden, werden für sie ein Erfolg werden.“

Erklären Sie, daß Pfund einen Wert auf der Linie mit dem Zuweisungsoperator zugewiesen:

pounds = newtons/NEWTONS_PER_POUND;

Ist dies nicht der Fall wäre, aber das Pfund bewertet wurde, wenn es (wie bei der cout-Anweisung) verwendet wurde, dann, wenn der Wert von Newton geändert, dann würde der Wert von Pfund als auch ändern. Da Pfund nicht jede Art von Zeiger, sondern ist eine einfache ganze Zahl ist, ist dies nicht möglich.

Was in einem Debugger durch den Code zu treten?

IME gibt es nichts wie dies die Ausführung eines Programms zu verstehen, in einer prozeduralen Sprache geschrieben (das heißt, nach dem Vorbild, wie die CPU tatsächlich führt Code).

Sie versuchen, den Hörer zu bekommen, einen Paradigmenwechsel zu unterziehen -. Ihren / seinen gesamten Ansatz zu ändern diesen Code zu Begreifen

  

„Pfund“ ist nur eine Zahl. Es hat keine   Konzept, wie sein erstellt. Du erzählst   „Pfund“, wie es erstellt wird, wird es nicht   merken. Es wird nur daran erinnern, was   es ist nicht, wie es erstellt wird.

Es kann ein wenig seltsam erscheinen, einen Speicherblock vermenschlichen. : -)

Nehmen Sie ein etwas komplexeres Beispiel, in dem eine Variable wie newtons wiederverwendet wird und Werte zugewiesen als einmal. Zum Beispiel:

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;

sowohl Zeigen Sie ihm den Code und die Ausgabe. Dann fragen Sie ihn, wie zu erklären, und warum das Programm erzeugt eine andere Nummer für jede Zeile. Ich würde denken, dass helfen soll ihn in Richtung schiebt das Programm als ein Verfahren, das läuft von oben nach unten betrachtet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top