Hallo und herzlich willkommen.
In diesem Vortrag möchte ich über ein paar Operatoren sprechen, die in dem Sinne etwas seltsam sind, dass
Sie nicht unbedingt denken würden, dass sie Operatoren sind.
Da alle Operatoren, die wir bis zu diesem Punkt gelernt haben, wirklich nur darauf hinweisen, dass Sie wissen,
wie Sie das Symbol verwenden, um Berechnungen für Zahlen durchzuführen.
Und diese Operatoren sehen tatsächlich wie Funktionen aus.
Sprechen wir also über die Besetzung im Operator sizeof.
Um zunächst über den Cast-Operator zu sprechen, muss
ich Ihnen ein wenig über Typkonvertierungen und die Konvertierung von Daten erzählen.
Wir haben alles über Datentypen und verschiedene Datentypen gelernt.
Wenn Sie jedoch tatsächlich versuchen, Daten verschiedenen Typen zuzuweisen, gibt es
einige implizite Konvertierungen, die in der Programmiersprache c ausgeführt werden.
Die Konvertierung von Daten zwischen verschiedenen Typen kann also automatisch erfolgen. Dies
wird als implizite Konvertierung durch die
Sprache oder explizit durch das Programm durch das Programm oder bezeichnet.
Der Programmierer selbst, der Entwickler, kann etwas tun.
Sie können einen Cast-Operator im Wesentlichen verwenden, um eine Konvertierung durchzuführen.
Die Daten, die implizit konvertiert werden, sind wirklich
wichtig, da Sie dies verstehen müssen, da die meisten c-Programme,
die Sie entwickeln werden, um sie effektiv zu entwickeln, diese Regeln
für diese Konvertierungen verstehen müssen.
Weil Sie häufig Ganzzahlen und Gleitkommazahlen, Dezimalzahlen
und ganze Zahlen haben.
Und du wirst sie benutzen, um sie manchmal zu vermischen.
Und wenn Sie dies tun, müssen Sie wissen, wie Dinge konvertiert werden.
Jetzt sollten Sie versuchen, dies so weit wie möglich zu vermeiden, indem Sie den Cast-Operator verwenden.
Aber wenn Sie den Cast-Operator nicht verwenden, verstehen Sie, was los ist.
Und was hier los ist, wenn Sie Daten verschiedenen
Float- und Double-Typen zuweisen,
werden die Daten entweder abgeschnitten oder heraufgestuft.
Dies sind zwei Begriffe, die Sie hören werden.
Abgeschnittene Mittel werden ungenauer
und beförderte Mittel werden präziser.
Versuchen Sie also, diese Typen nicht zu mischen, aber sie können nützlich sein.
Das Wichtigste, was wir verstehen müssen, ist, dass wir aus früheren Vorlesungen wissen, dass c sehr flexibel ist.
Und das ist eine bewusste Entscheidung der Designer der Sprache.
Wenn sie es flexibel haben wollten, aber wieder als Kompromiss, da Ihnen
diese zusätzliche Freiheit gegeben wird, können
Sie es missbrauchen. Und missbrauchen Sie
diese Idee des Mischens von Typen nicht.
Versuchen Sie, dieselben Typen zu verwenden, wenn Sie können, Ganzzahlen mit Ganzzahlen, Gleitkommazahlen mit Gleitkommazahlen.
Wenn Sie dies
jedoch nicht können, verstehen Sie entweder die impliziten Konvertierungen oder führen
Sie die expliziten Konvertierungen mit dem Cast-Operator durch.
Also noch einmal ein anderes Problem
oder ein anderes Konzept, bei dem c flexibel ist, aber Sie sollten es nicht missbrauchen.
Wenn also einer Ganzzahlvariablen in c ein Gleitkommawert zugewiesen wird,
haben Sie int x, float y, x
ist gleich y.
Der Dezimalteil der Zahl wird abgeschnitten.
Wenn Sie also eine Zahl int x gleich 0 haben, ist
float f gleich 12. 125 und Sie weisen
x f zu, der Wert von x wird 12 sein.
Sie werden diese Präzision verlieren. Der Wert wird abgeschnitten,
weil Sie einem Int einen Float zuweisen. Ein Int weiß nur, wie man eine ganze Zahl speichert.
Es wird also automatisch von der Programmiersprache konvertiert, vom Compiler auf 12.
Es wird nur der Import gespeichert.
Wenn Sie nun einer Gleitkommavariablen eine ganzzahlige Variable zuweisen, was das Gegenteil ist, führt
dies zu keiner Änderung des Werts der Zahl.
Der Wert wird vom System konvertiert und in der Floating-Variablen gespeichert.
Damit Sie sich keine Sorgen machen müssen, ordnen Sie es einem Flow zu.
Wenn Sie einem Flow 12 zuweisen, ist es immer noch 12, nur 12. 0.
Wenn Sie Arithmetik für Ganzzahlen ausführen und dies anders
ist als nur das Zuweisen von Werten, die es einem Float oder Float zu Int zuweisen. Wenn
Sie einen Ausdruck haben, führen Sie
eine Addition und Subtraktion durch, was auch immer der Fall sein mag.
Wenn Sie eine Subtraktion oder eine Addition durchführen, haben Sie zwei Operanden.
Ein Operator kann also ein int sein, ein Operand kann ein float sein.
Sie müssen wissen, wie diese Konvertierung stattfindet.
Wenn Sie also zwei Operanden in einem Ausdruck haben und
beide Ganzzahlen sind, wird jeder Dezimalteil, der sich aus einer Divisionsoperation ergibt, verworfen.
Wenn Sie also eine Ganzzahl x haben, sind das 20.
Sie haben eine ganze Zahl y, es ist 12. Und du machst 20 geteilt durch 12.
Sie werden nicht 1 Punkt etwas etwas etwas bekommen. Du wirst nur 1 bekommen.
Es wird alle Ergebnisse verwerfen und eine neue setzen, da wiederum ein int nur eine ganze Zahl speichert.
Zwei Zahlen sind also Ints und sie teilen sich.
Sie erhalten keine Gleitkommazahl. Sie werden keine Dezimalzahl erhalten.
Wenn nun ein Operator ein int und der andere ein float ist,
wird die Operation als Gleitkommaoperation gebildet. Wenn Sie also float haben, ist f 20. 0, float a ist 10,
a int, wenn Sie dort eine Division durchführen
oder 12 Es tut mir leid, dass dies zutreffender ist, dann wird das
Ergebnis eine Gleitkommazahl und das Ergebnis 1 Punkt sein
8888 oder was auch immer es ist 1 Punkt, was auch immer
der Fall sein mag.
Sie weisen diese Daten nichts zu. Dies ist ein Ausdruck, was es zurückgeben wird.
Also zwei Ints in einer Division, es wird eine ganze Zahl sein.
Ein int und double oder float, es wird immer ein float sein, es wird immer
eine dezimale dezimale Gleitkommaoperation sein.
Und das ist die implizite Konvertierung. Das ist wirklich das, was Sie brauchen,
um zu verstehen, was das Programm für Sie vornimmt und tut, wenn Sie nichts tun.
Sie sollten jedoch versuchen, einige explizite
Konvertierungen durchzuführen, die Sie mit dem Cast-Operator durchführen können.
Und das wird einfach mehr oder weniger als Casting bezeichnet.
Und Sie sehen Casting in vielen Sprachen, wenn Sie konvertieren möchten.
Und alles, was Sie tun, ist eine
explizite Konvertierung. Sie sagen, was die Daten sein sollen.
Sie möchten dies also tun, wenn Sie können,
da sonst Daten herabgestuft werden und verloren gehen können.
Wenn Sie zwei Ints machen und eine Division durchführen
und diese nicht gleichmäßig geteilt werden, verlieren Sie all diese Daten.
So können Sie die gewünschte Typkonvertierung anfordern, indem
Sie sie explizit angeben.
Dies wird als Besetzung bezeichnet und besteht darin, der Menge
den Namen des gewünschten Typs in Klammern voranzustellen.
Klammern und Typname
bilden also den
Cap-Operator.
Sie machen eine linke Klammer und geben dann den Datentyp an und schreiben dann eine Klammer.
Und das wird konvertieren, was rechts davon ist, was
auch immer der Ausdruck rechts davon ist, oder selbst wenn es nur eine einzelne Variable
ist, wird es das konvertieren, was jemals in Klammern steht.
Der eigentliche Typ ist also erwünscht, z. B. ein langer, er ersetzt diesen Worttyp.
Der vom Typ übergebene Operator hat also eine höhere Priorität als alle arithmetischen Operatoren mit Ausnahme des
einheitlichen Minus und des einheitlichen Plus. Wir haben noch nichts über Vorrang gelernt.
Wir werden in der nächsten Vorlesung. Vorrang ist im Grunde
das, was passiert, die Reihenfolge der ausgeführten Operationen.
Wir werden einige Beispiele dafür liefern. An dieser Stelle müssen Sie lediglich verstehen, dass
der Typecast-Operator Vorrang vor allen anderen Operatoren hat, mit Ausnahme von zwei unären Minus- und unären Plus-Operatoren.
Hier haben wir also beispielsweise eine Nummer 21. 51 und wir haben den
Cast-Operator, weil wir wissen, dass es sich um einen Cast-Operator handelt, weil er
in Klammern steht und einen Typ hat. Und was wir im Grunde sagen,
ist nehmen 21. 51 konvertiere es in ein int.
Wenn Sie eine in sie konvertierte Gleitkommazahl nehmen,
wird sie einfach zum int, zur ganzen Zahl 21.
Das gleiche gilt für die rechte Seite, es konvertiert 26. 99 zu einem int.
Was würde hier also tatsächlich passieren, wenn Sie diesen Ausdruck in einer Anweisung verwenden würden, würde
er mit 21 plus 26 bewertet. Es würde die Daten
von 0 abschneiden. 51 zu einer ganzen Zahl und das gleiche wie 0. 99.
Das ist also der Cast-Operator, alles in Klammern, das einen Datentyp enthält.
Du wirst das viel sehen.
Wenn Sie 21 plus 26 sagen und es in Floats umwandeln würden, würde es nur
einen Punkt 0 hinzufügen.
Normalerweise wird kein präziserer Typ verwendet, da Sie
nicht präziser werden.
Sie gießen von einem genaueren Typ zu einem weniger präzisen.
Also eher wie ein Float zu einem Int.
Sie werden dies also gelegentlich in einigen Programmen sehen, wenn
Sie verschiedene Typen verwenden. Sie sollten versuchen, die Verwendung unterschiedlicher Typen
zu vermeiden, wenn Sie rechnen. Aber wenn Sie dies tun, werden Sie dies sehen.
Die Größe des Operators, ein anderer Operator, der irgendwie seltsam ist
und vielen anderen nicht ähnlich ist. Und das sieht tatsächlich nach einer Funktion aus.
Aber die Größe von ist ein Operator. Es führt eine Aktion aus.
Es macht nichts funktionsorientiert.
Es sagt Ihnen, wie viele Bytes von einem bestimmten Typ
im Speicher belegt sind. Es sieht also wie eine Funktion aus, weil es ein Argument braucht.
Und wir werden ein Beispiel dafür geben Es wird jedoch nur die Anzahl der Bytes im Speicher zurückgegeben. Denken Sie daran, dass je
nach dem System, das Sie ausführen,
der Plattform, die Sie ausführen, dem Betriebssystem, der Architektur des
Computers, der Hardware und verschiedenen Datentypen Speicher mit unterschiedlichen Größen dargestellt werden.
Beispielsweise kann ein int 4 Bytes auf einem System 8 in einem anderen sein.
Sie können also den Operator sizeof als spezielles Schlüsselwort für einen Operator in c verwenden und
einen Datentyp übergeben, der Ihnen sagt, wie viele Bytes im Speicher verwendet werden.
Sizeof ist also eigentlich ein Operator, es ist keine Funktion.
Es wird zur Kompilierungszeit und nicht zur Laufzeit ausgewertet, es sei denn, in seinem Argument wird ein Array mit variabler Länge verwendet.
Und so werden wir das erwähnen. Dies bedeutet im Grunde, dass eine Variable,
die innerhalb der Größe eines Arrays
liegt, zur Kompilierungszeit zur Laufzeit nicht aufgelöst wird. Daher ist es nicht so
wichtig, dies zu wissen.
Das Argument für den Operator sizeof kann eine Variable,
ein Array-Name, der Name eines Basisdatentyps wie
int float, der Name eines abgeleiteten Datentyps oder ein Ausdruck sein.
Man könnte also Größe von x plus y sagen.
Und das ist im Grunde nur die Größe von x
plus die Größe von y oder die resultierenden Zahlen. Wenn x ein int ist, y int ist und eine Größe von 16
hat, würde dies einen Zoll von 4 Bytes bedeuten.
Wenn int int ein Float wäre und das Ergebnis eine Gleitkomma-Arithmetik wäre,
wäre es float 8 Bytes oder so.
Aber Sie können es für viele Dinge verwenden, und Sie sollten es für viele Dinge verwenden. Die Größe von int führt beispielsweise zu
der Anzahl der Bytes, die von einer Variablen vom Typ int belegt werden.
Dies würde also je nach System 4 oder 8 zurückgeben.
Sie können den Operator sizeof auch auf einen Ausdruck anwenden, wie bereits erwähnt.
Das Ergebnis ist die Größe des Werts.
Das ergibt sich aus dem Flächenausdruck. Wenn also zwei Ints zusammen sind, werden sie immer noch ein Int sein.
Es wird also immer noch eine Größe sein. Sie werden jedoch sehen, dass der Operator sizeof auch verwendet wird, wenn wir über Zeiger sprechen.
Ich wollte jetzt darüber sprechen, weil es ein Operator ist.
Aber wir werden in der gesamten Klasse noch viele weitere Beispiele dafür und Castings liefern,
wenn wir über weitere Konzepte sprechen.
Insbesondere der Operator sizeof spielt eine viel größere Rolle, wenn
es um Zeiger geht, denn wenn
Sie berechnen, wie viel Speicher zugewiesen werden soll, um welche Zeiger es sich handelt,
verwenden Sie sizeof, weil Sie präzise sein möchten.
Sie können es aber auch für andere Zwecke verwenden.
Verwenden Sie daher nach Möglichkeit den Operator sizeof, um zu vermeiden, dass in Ihrem Programm
Hardcode-Größen berechnet werden.
Harte Codegrößen Magische Zahlen sind keine gute Sache, denn wenn Sie sich auf einem
anderen System befinden, wenn Sie 4 auf 1 System für ein
int hart codieren, auf dem anderen System möglicherweise eine 8, verwenden Sie also sizeof
so viel wie Sie können und wir werden sehen, dass dies viel relatabler
wird, wenn wir über Zeiger sprechen.
Andere Operatoren, die
etwas seltsam sind, sind der Sternchenoperator.
Sie haben sich vielleicht ein Sternchen gesagt, darüber haben wir bereits in Multiplikation gesprochen.
Für dieses Sternchen sind jedoch zwei Operanden erforderlich, einer links und einer rechts.
Wenn Sie den Sternchenoperator auf eine Variable
anwenden und nur den Namen der Sternvariablen mit nur einem Argument rechts sagen,
steht er für etwas anderes. Es ist tatsächlich ein Zeiger.
Es dereferenziert einen Zeiger.
Und wieder, das ist, dass ich jetzt nicht darauf harfen werde, weil wir das
durchgehen werden, wenn wir über Zeiger sprechen.
Aber wenn Sie so etwas wie Stern a sehen, flippen Sie nicht aus, das ist tatsächlich gültig.
Das ist das Sternchen des Zeigeroperators.
Möglicherweise wird auch der Fragezeichen-Doppelpunkt angezeigt.
Dies ist ein Operator, der zur Entscheidungsfindung verwendet wird.
Wenn die Bedingung wahr ist, wenn die Sache links wahr ist, dann
wird der Wert rechts nach dem Doppelpunkt ausgewertet und so weiter.
Es ist eine Kurzschreibweise für eine if-else-Anweisung.
Es ist ein ternärer Operator, heißt es. Aber auch hier möchte ich diese
jetzt nicht wirklich detailliert diskutieren, da
wir darüber sprechen werden, wenn wir über unsere spezifischen
Themen sprechen.
Wir werden über den Drehoperator sprechen, wenn wir über Entscheidungsaussagen sprechen. Wir werden über
den Sternchenoperator unary sprechen, wenn wir über Zeiger sprechen.
Aber wenn Sie das jetzt sehen und ich wollte es jetzt erwähnen, weil sie technisch gesehen Operatoren sind, aber
wir werden ihre Anwendungsfälle verstehen, wenn wir über diese Konzepte sprechen. Vielen Dank.