Zum Inhalt springen
Topos Uranos

Zusammenfassung

Diese Lektion schließt die dritte Einheit des Kurses ab, die den Ausdrücken und ihren Operatoren gewidmet ist. Sie rekonstruiert die Kette der Begriffe, die vom arithmetischen Operator bis zur Bibliotheksfunktion reicht, und dabei über den Baum des Ausdrucks und den Typ jedes Knotens, die Bedingungen und ihre Algebra, den Kurzschluss, den Nebeneffekt und die Auswertungsreihenfolge sowie die Bits führt; sie trennt, was davon in jeder Sprache gilt, von dem, was C++ eigen ist; sie fasst das undefinierte Verhalten der Einheit zusammen, mit dem, was der Compiler erkennt, was der Sanitizer erkennt und was niemand erkennt; sie wiederholt in ihrem Abschlusstest die Fertigkeiten des Eingangstests; und sie endet mit sechs Herausforderungen, die die ganze Einheit verbinden.

Lernziele

  1. Den Wert, den Typ und die Wirkung jedes Ausdrucks des Kurses vorhersagen, ausgehend von seinem Baum und von den Konvertierungen in jedem Knoten.
  2. Zusammengesetzte Bedingungen schreiben und verneinen und den Kurzschluss nutzen, um eine Operation abzusichern, die sonst keine Bedeutung hätte.
  3. Die Ausdrücke erkennen, die keine Bedeutung haben (den Katalog des undefinierten Verhaltens der Einheit), sagen, welches Werkzeug jeden von ihnen erkennt, und sie ohne es umschreiben.
  4. Für eine gegebene Rechnung zwischen der Arithmetik, den Bitoperatoren und der Mathematikbibliothek wählen und die Wahl begründen.
  5. Im Gelernten der Einheit trennen, was in jeder Sprache gilt, von dem, was C++ eigen ist.

Was die Einheit erreicht hat

Die Einheit hatte sich vorgenommen zu lehren, Ausdrücke zu bilden, deren Wert sich mit Gewissheit vorhersagen lässt: welche Operation zuerst ausgeführt wird, welchen Typ das Ergebnis hat, welche Nebeneffekte es gibt und welche Ausdrücke keine Bedeutung haben. Das Ziel wurde erreicht, gestützt nur auf das, was die Einführung als bekannt vorausgesetzt hat: die Typen der Einheit 2, ihre Wertebereiche und ihre Konvertierungen. Das Programm der sechs Fragen, mit dem die Einführung das Problem gestellt hat, lässt sich jetzt so lesen, wie der Compiler es liest, und Ausdruck für Ausdruck korrigieren.

Arithmetik

Die Lektion Arithmetik hat das genaue Verhalten der fünf arithmetischen Operatoren festgelegt. Die ganzzahlige Division schneidet zur Null hin ab und erfüllt die Identität (a / b) * b + a % b == a, sofern der Quotient eine Bedeutung hat, sodass der Rest, wenn er nicht null ist, das Vorzeichen des Dividenden trägt; daher hat -7 / 2 den Wert −3-3 und -7 % 2 den Wert −1-1, und die Ungeradheit wird mit n % 2 != 0 geprüft. Sie hat dies mit dem euklidischen Rest in Beziehung gesetzt, ((a % b) + b) % b für b>0b > 0, und beide benutzt, um Mengen zu zerlegen. Sie hat gezeigt, wie man den Baum eines Ausdrucks nach Vorrang und Assoziativität zeichnet und den Typ in jedem Knoten nach den üblichen arithmetischen Konvertierungen bestimmt. Sie hat mit den Quotienten ohne Bedeutung geschlossen (der ganzzahligen Division durch null und der kleinsten ganzen Zahl geteilt durch −1-1) und mit dem Überlauf eines Zwischenergebnisses, der für undefiniertes Verhalten genügt, auch wenn das Endergebnis passt.

Relationen und Logik

Die Lektion Relationen und Logik hat gelehrt, dass eine Bedingung ein Ausdruck vom Typ bool ist, mit ihrem Platz im Baum: Die Relationen binden schwächer als die Arithmetik, && stärker als || und ! stärker als alle. Sie hat gelehrt, sprachliche Aussagen in Bedingungen zu übersetzen und diejenigen zu erkennen, die mit einer anderen Bedeutung kompilieren, wie 1 < x < 5 und day == 6 || 7. Sie hat gezeigt, dass && und || ihren zweiten Operanden nur auswerten, wenn der erste nicht entscheidet, und dass dieser Kurzschluss es erlaubt, eine Operation mit einem Wächter zu ihrer Linken abzusichern. Sie hat mit den De Morganschen Gesetzen geendet, die eine zusammengesetzte Bedingung verneinen, und mit ihrer Grenze: Bei einem Nicht-Zahl-Wert ist !(a < b) nicht gleichwertig mit a >= b.

Zuweisung, Nebeneffekte und undefiniertes Verhalten

Die Lektion Zuweisung, Nebeneffekte und undefiniertes Verhalten hat den Wert eines Ausdrucks von seiner Wirkung unterschieden: Die Zuweisung ist ein Ausdruck, der den zugewiesenen Wert hat und eine Variable ändert, und x++ hat den vorherigen Wert, während ++x den neuen hat. Sie hat gezeigt, dass der Baum eines Ausdrucks nicht die Reihenfolge festlegt, in der seine Zweige berechnet werden, sodass zwei Wirkungen auf dieselbe Variable, oder eine Wirkung und ein Lesen, ohne Reihenfolge zwischen ihnen, dem Ausdruck jede Bedeutung nehmen, und sie hat präzisiert, was C++17 geordnet und was es unspezifiziert gelassen hat. Sie hat den Katalog der vier Grade zusammengestellt (definiert, implementierungsdefiniert, unspezifiziert und undefiniert), erklärt, dass der Compiler unter der Annahme schließt, das Programm habe kein undefiniertes Verhalten, und für jeden Fall des Katalogs gesagt, welches Werkzeug ihn erkennt.

Bits und Mathematikbibliothek

Die Lektion Bits und Mathematikbibliothek hat gelehrt, dass eine ganze Zahl auch eine Folge von Bits ist: &, | und ^ wenden eine Verknüpfung auf jede Spalte an, ~ kehrt alle Bits um, und die Verschiebungen multiplizieren und dividieren mit Potenzen von 2, unter der Bedingung, dass die Weite der Verschiebung weder negativ ist noch die Breite des Typs erreicht. Mit ihnen hat sie die Masken gebaut, die ein Bit prüfen, setzen, löschen und umschalten. Sie hat gewarnt, dass diese Operatoren schwächer binden als die Relationen, sodass x & 1 == 0 nicht fragt, was es zu fragen scheint, und dass ^ nicht die Potenz ist. Sie hat mit der Bibliothek geschlossen: <cmath>, <numbers>, <numeric> und <bit> liefern korrekte und erprobte Rechnungen, mit ihren eigenen Vorbedingungen, wie der des Absolutbetrags, der für die kleinste ganze Zahl nicht existiert.