Programmierkurs C++ Variablen und Datentypen Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer
#2 Überblick Welche Datentypen gibt es in C++? Wie werden Variablen eines Typs deklariert? Zusammengesetzte Datentypen (Arrays, ) Literale
#3 Variablen Adresse Inhalt Eine Variable ist ein Speicherplatz Eine (Start-)Adresse im Arbeitsspeicher Programme verwenden Namen statt Adressen (z.b. jahr, i, hallo) Compiler bzw. Betriebssystem kümmert sich um konkrete Zuordnung...... 1001 12 1002 123 1003 7 1004 7 1007 9 1008 11 Größe des belegten Speichers bestimmt durch Datentyp 32-Bit Ganzzahl 8-Bit vorzeichenbehaftete Ganzzahl...... 800023 800024 4 800025......
#4 Datentypen: Zahlen in C++ Datentyp Bemerkung Min (typisch) Max (typisch) char 8 Bit*, 2er-Komplement -128 +127 short int 16 Bit*, 2er-Komplement -32.768 +32.767 int 16 Bit*, 2er-Komplement -32.768 +32.767 long int 32 Bit*, 2er-Komplement -2.147.483.648 +2.147.483.647 long long int 64 Bit*, 2er-Komplement -9.223.372.036.854.775.808 +9.223.372.036.854.775.807 Datentyp Bemerkung Min Max (typisch) unsigned char 8 Bit* 0 +255 unsigned short int 16 Bit* 0 +65.535 unsigned int 16 Bit* 0 +65.535 unsigned long int 32 Bit* 0 +4.294.967.295 unsigned long long int 64 Bit* 0 +18.446.744.073.709.551.615 Datentyp float double long double Bemerkung 32 Bit* IEEE 754 floating point 64 Bit* IEEE 754 floating point 80-128 Bit* IEEE 754 floating point * Achtung: Die Bit-Längen sind nicht standardisiert, sondern hängen von der jeweiligen Plattform ab! Siehe nächste Folie!
#5 Beispiel: sizeof Operator Datentyp Intel, 32-bit Windows 7 (unsigned) char 8 bit (1 Byte) (unsigned) short int 16 bit (2 Byte) (unsigned) int 32 bit (4 Byte) Entspricht long int (unsigned) long int 32 bit (4 Byte) (unsigned) long long int 64 bit (8 Byte) float 32 bit (4 Byte) double 64 bit (8 Byte)
Beschreibung der Datentypen Ganze Zahlen: char, short int, long int, long long int Können mit oder ohne Vorzeichen (signed / unsigned) verwendet werden Signed: 1er oder 2er Komplement in Abhängigkeit von der jeweiligen Plattform Gleitkomma float: Dieser Datentyp verwendet die IEEE 754 Gleitkomma-Darstellung mit einfacher Genauigkeit (32-bit). Dieser Datentyp sollte niemals verwendet werden, wenn eine sehr hohe Genauigkeit gefordert ist, wie z.b. in der Finanzbuchhaltung double: Dieser Datentyp verwendet die IEEE 754 Gleitkomma-Darstellung mit doppelter Genauigkeit (64-bit). Dieser Datentyp stellt die häufigste Wahl für Gleitkommazahlen dar. Genau wie bei float gilt auch hier: Dieser Datentyp sollte niemals verwendet werden, wenn eine sehr hohe Genauigkeit gefordert ist, wie z.b. in der Finanzbuchhaltung Sonstige bool: Der Datentyp bool hat lediglich zwei mögliche Werte: TRUE und FALSE (Wahr und Falsch). Aus dieser Grund werden Variablen vom Typ bool häufig für Flags (Merker/Signale) und Statusindikatoren verwendet, welche dann logisch Werten wie 0/1 oder An/Aus entsprechen. Obwohl dieser Datentyp lediglich ein Bit an Information beinhaltet, benötigt er häufig trotzdem 8-Bit Speicherplatz (hängt von der Plattform ab) char: Kann auch als Character (Zeichen) interpretiert werden und so zur Speicherung von Zeichen(-ketten) verwendet werden #6
Variablen und Variablendeklaration #7
Deklaration von Variablen Eine Variable ist ein Speicherplatz Repräsentiert einen Wert aus einem bestimmten Wertebereich Wertebereich durch verwendeten Datentyp festgelegt Speicherbereich wird über einen Namen referenziert Eine Variable wird deklariert (d.h. erzeugt) Syntax: <Typ> <Name>; Dadurch wird Speicher reserviert Beispiele long int myint; char c1; bool flag; short int myshort, myshort2; mehrere Variablen gleichen Typs #8
#9 Beispiel Was tut dieses Programm?
Was tut dieses Programm? Auf den ersten Blick: Nichts Zumindest erwartet es keine Eingabe Und es macht keine Ausgaben Es berechnet offensichtlich nichts Aber: es reserviert Speicher für Variablen Und gibt ihn sofort wieder frei Mit diesen Variablen könnten wir jetzt aber arbeiten Zwischenergebnisse und Ergebnisse von Berechnungen ablegen Diese Ergebnisse über den Namen der Variablen ansprechen #10
#11 Deklaration von Variablen: Identifier Wiederholung Deklaration: <Typ> <Name>; Der <Name> einer Variable ist ein Identifier Über diesen Identifier wird eine Variable eindeutig bezeichnet Es können nicht zwei Variablen den gleichen Identifier haben Zumindest nicht im gleichen Kontext (später) Identifier dürfen nur aus gewissen Zeichen bestehen Regeln für Identifier: nächste Folie
#12 Legale Identifier Bestehen aus Buchstaben (a-z, A-Z) Nummern (0-9) Unterstrich _ Dürfen theoretisch beliebig lang sein Einschränkungen Darf nicht mit einer Nummer beginnen Kein reserviertes Schlüsselwort(class, public, etc.). Keine Leerzeichen Identifier sind case-sensitive (Unterscheidung von Groß- und Kleinschreibung)
Beispiele Legale Identifier variable Besteht nur aus Buchstaben und ist daher korrekt. variable Groß/Kleinschreibung unterscheidet sich von variable dies_ist_1_ne_variable_11elf Enthält nur Buchstaben, Zahlen und Unterstriche DAS_IST_TOTAL_TOLL Unterstriche sind erlaubt (auch am Anfang Ungültige Identifier 2good4u Erstes Zeichen darf keine Nummer sein das ist toll Leerzeichen sind nicht erlaubt Krass! Ausrufezeichen sind, wie viele Sonderzeichen, ungültig namespace Der Schlüsselbegriff ist schon von C++ belegt (Namespace wäre ok) #13
#14
Konventionen Normalerweise hält man sich auch an gewisse Konventionen Coding Style / Code Style Code Style für Identifier (Kurzfassung) Für Variablen keine Identifier mit GROSSBUCHSTABEN verwenden GROSSBUCHSTABEN nur für Konstanten oder Macros verwenden Camel Case / Java Style Klein beginnen und im Camel Case weiterschreiben Beispiel: einevariablemiteinemlangennamen Alternative (K&R / Kernigham & Ritchie Style) Klein beginnen und einzelne Bestandteile durch _ trennen Beispiel: eine_variable_mit_einem_langen_namen Details unter http://lxr.linux.no/#linux+v3.15.4/documentation/codingstyle http://sydney.edu.au/engineering/it/~scilect/tpop/handouts/style.htm #15
Literale #16
#17 Datentypen von Literalen (Ganzzahlen) Ganzzahlige Typen (standardmäßig vom Typ int) 10 (Dezimal) 012 (Oktal, Basis 8, wegen führender Null) 0xA (Hexadezimal, Basis 16 wegen führendem 0x, Groß-/Kleinschreibung egal) 0b1010 (Binär, Basis 2, wegen führendem 0b) Suffix u oder U Datentyp ist unsigned Suffix l oder L Datentyp long Suffix ll oder LL Datentyp long long Beispiel: 12273; 12733L; short int i = 10; long int l = 10L;
Datentypen von Literalen (Floating Point) Floating Point Werte sind standardmäßig vom Typ double Durch Anhängen von f/f wird ein Literal vom Typ float Optional kann ein l/l angehängt werden, um long double explizit zu fordern Schreibweise von Floating Point Literalen Normale Schreibweise: 10.0 (alternativ: 10.) Normale Schreibweise: 0.1 (alternativ :.1) Eng. Schreibweise: 1E1 (entspricht 1 * 10 1 ) Float erzwingen: 10.0f Long Double erzwingen: 10.0l #18
Beispiel: Initialisierung von Variablen #19
Zusammengesetzte Datentypen #20
Zusammengesetzte Datentypen Es existieren unterschiedliche Arten, von denen die folgenden hier vorgestellt werden: Enumeration Array Strings Structure Dienen der Erweiterung der existierenden durch benutzerdefinierte Datentypen #21
#22 Zusammengesetzte Datentypen: Enumerations Enumerations Begrenzter Wertebereich, der durch Aufzählung definiert wird Wird wie ein int behandelt und startet mit dem Wert 0 Definition: enum TYPENAME { werte, }; Beispiel (Definition) enum Farbe { ROT, ORANGE, GELB, BLAU}; enum Zahl { EINS = 1, ZWEI, DREI, VIER, FUNF }; Beispiel (Verwendung) enum Farbe farbe1 = ROT, farbe2 = GELB; enum Type {AUTO, MOTORRAD} t = AUTO; enum Farbe c = (enum Farbe) 1;
#23 Zusammengesetzte Datentypen: Arrays Arrays Lineare Anordnung von gleichartigen Elementen Erstes Element hat die Position 0 (Achtung: Nicht 1) Beispiel (Definition) int prime[5] = { 2, 3, 7, 11 }, a[4], tmp[19]; char string[100] = test ; Beispiel (Verwendung) prime[4] = 12; prime[4]++; prime[5] = 12; Dieser Fehler wird vom Compiler nicht erkannt! Erster Index (0) Achtes Element an Index 7 0 1 2 3 4 5 6 7 8 9 5 66 777 338 1-56 4 0 1 4 Länge des Arrays: 10
#24 Zusammengesetzte Datentypen: Strings Es existiert kein Datentyp für Zeichenketten Zeichenketten werden als Array von Zeichen repräsentiert Das Ende der Zeichenkette wird mit dem Zeichen \0 markiert Funktionen zur Manipulation von Zeichenketten sind in der Datei <string.h> verfügbar Manche Zeichen werden mit Backslash (\) escaped '\n' Zeilenumbruch '\'' Das Zeichen ' '\\' Das Zeichen \ selbst Examples char s1[] = Test ; char s2[10] = ; char s3[2]; strcpy(s3, toolong ); char s4[2]; strncpy(s4, toolong, 2); #define S5_SIZE 2 char s5[s5_size]; strncpy(s5, toolong, S5_SIZE-1); s5[s5_size-1] = \0 ; T e s t \0 \0????????? t o o l o n g \0 t o t \0
#25 Zusammengesetzte Datentypen: Structures Structures (struct) Structs dienen der Gruppierung von logisch zusammenhängenden Daten (Verbund) Zugriff auf die Elemente erfolgt mittels. (Punkt) Beispiel struct Punkt {int x; int y; }; struct Punkt p; p.x = 10; p.y = 20;