Zusammenfassung
Diese Lektion eröffnet die dritte Einheit des Kurses, die den Ausdrücken und ihren Operatoren gewidmet ist. Sie erklärt, wozu die Einheit dient: zu lehren, Ausdrücke zu bilden, deren Wert sich mit Gewissheit vorhersagen lässt, weil man weiß, welche Operation zuerst ausgeführt wird, welchen Typ das Ergebnis hat, welche Nebeneffekte sie haben und welche Ausdrücke keine Bedeutung haben; sie stellt ihre vier Lektionen vor und den Faden, der sie verbindet, von der ganzzahligen und reellen Arithmetik bis zu den Bits und der Mathematikbibliothek, über die Bedingungen und den Katalog des undefinierten Verhaltens; sie erinnert daran, was die Einheit aus der zweiten voraussetzt, nämlich den Typ jedes Datums, seine Grenzen und seine Konvertierungen; sie formuliert das Problem, das die Einheit löst, das eines Programms, das ohne eine einzige Warnung kompiliert und dessen Antworten auf sechs Schulfragen alle falsch sind, wenn sie nicht ganz fehlen; und sie zeigt, wohin sie führt, in den folgenden Einheiten und im Kurs Programmieren in C++ II.
Lernziele
- Die Abfolge der Inhalte der Einheit beschreiben und erklären, was jede Lektion zur nächsten beiträgt.
- Das Nötige aus Einheit 2 (die ganzzahligen und reellen Typen, ihre Wertebereiche, den Überlauf und die Konvertierungen) in Erinnerung rufen und es bei Bedarf wiederholen.
- An einem Beispiel vorwegnehmen, dass der Wert eines Ausdrucks von Auswertungsregeln abhängt (dem Vorrang, dem Typ der Operanden, der Reihenfolge der Wirkungen), die nicht immer mit denen der Schulmathematik übereinstimmen.
- Erkennen, was man am Ende der Einheit können soll, und es von dem unterscheiden, was man in den folgenden Einheiten lernen wird.
Eingangstest
Bevor man die Einheit durcharbeitet, lohnt es sich, den Ausgangspunkt zu bestimmen. Dieser Test ist eine Selbstüberprüfung: Er wird nicht benotet, und sein einziger Zweck ist es, das Lernen zu leiten. Die ersten vier Fragen prüfen, was die Einheit aus der zweiten voraussetzt: die Division zwischen ganzen Zahlen, das Schreiben zur Basis 2, die vorzeichenlose Subtraktion und den vorzeichenbehafteten Überlauf. Die sechs folgenden behandeln in der Reihenfolge der Lektionen die zentralen Ideen der Einheit, und mehrere von ihnen gehen von der Schulmathematik oder von der elementaren Logik aus. Niemand muss sie schon richtig beantworten, und bei zweien von ihnen ist „Das weiß ich noch nicht“ eine ehrliche Antwort: Jede Antwort, ob richtig oder nicht, erklärt den Punkt und nennt die Lektion, die ihn behandelt. Dieselben Fertigkeiten werden am Ende erneut gemessen, in der Synthese-Lektion.
Miss vor Beginn der Einheit deinen Ausgangspunkt. Es ist eine kurze Selbsteinschätzung: Sie wird nicht benotet, und das Ergebnis wird nur in deinem Browser gespeichert.
Frage 1Aus früheren EinheitenEin Programm deklariert
const double r{7 / 2};und schreibtr. Was erscheint?Glaubt, der Typ der Variablen entscheide, wie dividiert wird; das entscheidet der Typ der Operanden.Glaubt, die ganzzahlige Division runde; sie verwirft die Nachkommastellen.Der Wert 3 ist konstant und lässt sich in einemdoubleexakt darstellen: Es gibt keine Einschränkung, die abzulehnen wäre.Die Division7 / 2findet zwischen ganzen Zahlen statt und ergibt den ganzzahligen Quotienten, 3; erst danach wird diese 3 indoublekonvertiert. Der Typ der Operanden entscheidet über die Operation, nicht der Typ der Variablen, die das Ergebnis aufnimmt. Lektion 3.1 macht aus dieser Beobachtung eine allgemeine Regel: Der Typ wird in jedem Knoten des Ausdrucks entschieden.Wiederholen: Zeichen, boolesche Werte, Umwandlungen und Konstanten
Frage 2Aus früheren EinheitenWie schreibt man die Zahl 13 zur Basis 2, mit acht Bits?
Addiert die Stellenwerte falsch: .Schreibt die Reste der fortgesetzten Division in der Reihenfolge, in der sie entstehen; man liest sie vom letzten zum ersten.Dieses Muster ist 26, das Doppelte von 13: Die Bits sind um eine Stelle verschoben.Jede Stelle wiegt doppelt so viel wie die rechts von ihr: Die Einsen stehen an den Stellen mit dem Stellenwert 8, 4 und 1. Lektion 3.4 arbeitet direkt mit diesen Bits, sodass es sich lohnt, sie fließend zu lesen.Wiederholen: Ganze Zahlen und ihre Darstellung
Frage 3Aus früheren EinheitenWas schreibt
std::println("{}", 0u - 1);mit einemunsigned intvon 32 Bit?Berücksichtigt das Suffixunicht: Ein vorzeichenloser Typ hat keine negativen Werte.Verwechselt die vorzeichenlose Arithmetik, die modulo definiert ist, mit dem vorzeichenbehafteten Überlauf.Glaubt, die Subtraktion halte beim kleinsten Wert des Typs an; sie läuft im Kreis herum.Die vorzeichenlose Arithmetik rechnet modulo : . Das Ergebnis ist definiert, und deshalb meldet es kein Sanitizer. Die Einheit trifft es wieder in den Konvertierungen eines gemischten Ausdrucks und in den Bitoperatoren, die man mit vorzeichenlosen Typen schreibt.Wiederholen: Ganze Zahlen und ihre Darstellung
Frage 4Aus früheren EinheitenEin Programm führt
int count{std::numeric_limits<int>::max()};und danachcount = count + 1;aus. Was garantiert der Standard über den Wert voncount?Verwechselt, was man manchmal beobachtet, mit dem, was der Standard garantiert; das Zurückspringen zum Minimum ist das, was die vorzeichenlosen Typen tun, nicht die vorzeichenbehafteten.Übersieht die Grenze des Typs: Diese Zahl passt nicht in einenintvon 32 Bit.Der Compiler kennt die Werte nicht, die das Programm bei der Ausführung haben wird; er kompiliert fast immer, ohne etwas zu sagen.Die Addition hat eine Vorbedingung, dass das Ergebnis in den Typ passt, und außerhalb davon verspricht der Standard nichts. Der Sanitizer des Kurses hält das Programm an; ohne ihn kann alles Mögliche ausgegeben werden. Lektion 3.3 fasst diesen Fall mit den anderen seiner Art in einem Katalog zusammen.Wiederholen: Ganze Zahlen und ihre Darstellung
Frage 5Welchen Wert haben und ?
Rechnet von links nach rechts, ohne den Vorrang des Produkts zu beachten.Übersieht die Klammern des zweiten Ausdrucks.Schreibt jedem Ausdruck den Wert des anderen zu: kehrt die Wirkung der Klammern um.Das Produkt bindet stärker als die Summe: In wird zuerst multipliziert, und die Klammern ändern diese Reihenfolge. C++ folgt derselben Konvention, und Lektion 3.1 erweitert sie auf die Division, den Rest und die Assoziativität, mit dem Baum des Ausdrucks als Werkzeug.Wiederholen: Arithmetik
Frage 6Welche Werte haben nach dem Divisionssatz der Mathematik, mit dem Rest unter der Bedingung , der Quotient und der Rest von geteilt durch ?
Das berechnet C++, aber es erfüllt nicht : Der Rest der Mathematik ist nicht negativ.Prüft die Identität nicht: , nicht .Erfüllt die Identität ebenso wenig: .Der Satz verlangt mit , und diese beiden Zahlen sind die einzigen, die das erfüllen. C++ dagegen schneidet den Quotienten zur Null hin ab:-7 / 2ergibt und-7 % 2ergibt . Lektion 3.1 erklärt den Unterschied und lehrt, den Rest der Mathematik aus dem von C++ zu gewinnen.Wiederholen: Arithmetik
Frage 7Wie lautet die Negation von „Es regnet und es ist kalt“?
Verneint jeden Teil, ohne den Junktor zu ändern: Das behauptet viel mehr als die Negation, weil es auch den trockenen und kalten Tag ausschließt.Verneint nur einen der beiden Teile.Sagt dasselbe wie die zweite Option, mit demselben Fehler.Die Negation einer Konjunktion ist die Disjunktion der Negationen: Das ist eines der De Morganschen Gesetze. Es genügt, dass eines der beiden Dinge fehlt, damit die Aussage falsch ist. Lektion 3.2 wendet dasselbe Gesetz auf die Bedingungen eines Programms an.Wiederholen: Relationen und Logik
Frage 8Was schreibt
std::println("{}", 3 < 5);?Glaubt, der Wahrheitswert werde als Zahl geschrieben; mit dem Platzhalter{}schreibtstd::printlndas Wort.Glaubt, der Ausdruck werde als Text geschrieben; geschrieben wird sein Wert.Er ist einer: Ein Vergleich ist ein Ausdruck vom Typbool.Ein Vergleich ist ein Ausdruck wie jeder andere: Er hat einen Wert, vom Typbool, undstd::printlnschreibt ihn alstrueoderfalse. Lektion 3.2 geht von dieser Beobachtung aus: Eine Bedingung wird berechnet, und deshalb hat sie Vorrang, Baum und Algebra.Wiederholen: Relationen und Logik
Frage 9Welche Werte haben
aundbnachint a{5};undint b{a++ * 2};?Das ist eine ehrliche Antwort: Lektion 3.3 lehrt den Unterschied zwischen dem Wert eines Ausdrucks und seiner Wirkung, und der Abschlusstest wird erneut danach fragen.Vergisst die Wirkung:a++inkrementierta.Verwendet den neuen Wert vona; das Postfix-Inkrement liefert den vorherigen Wert.Der Ausdrucka++hat einen Wert, nämlich den, denahatte (5), und eine Wirkung, dieaauf 6 setzt. Das Produkt verwendet den Wert, nicht die Wirkung. Lektion 3.3 lehrt, beides zu trennen und zu erkennen, wann zwei Wirkungen in ein und demselben Ausdruck diesem jede Bedeutung nehmen.Wiederholen: Zuweisung, Nebeneffekte und undefiniertes Verhalten
Frage 10Was schreibt
std::println("{}", 2 ^ 3);?Das ist eine ehrliche Antwort: Lektion 3.4 erklärt es, und der Abschlusstest wird erneut danach fragen.Liest das Zirkumflex als Potenz, wie in der Schreibweise vieler Taschenrechner; in C++ ist es keine.Liest es als Produkt.In C++ ist das Zirkumflex nicht die Potenz, sondern das bitweise exklusive ODER: und unterscheiden sich nur im Bit mit dem Stellenwert 1, sodass das Ergebnis 1 ist. C++ hat keinen Potenzoperator; Lektion 3.4 lehrt, wann manstd::powverwendet und wann eine Verschiebung.Wiederholen: Bits und Mathematikbibliothek
Inhalt wird geladen…
Abgeschlossen
Melde dich an, um deinen Fortschritt zu speichern