Informatik IIGrundlagen der Programmierung
Programmieren in C
Variablen, Konstanten, Typen
Hochschule Fulda – FB ET
Sommersemester 2014
http://c-et.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Variablen 1
• Variable sind Platzhalter für Daten• haben einen festgelegten Speicherort,
an dem der aktuelle Wert gespeichert wird• der aktuelle Wert (an seinem Speicherort)
ist veränderbar• Attribute von Variablen:
– Datentyp– Namen (Bezeichner, Identifier)– Lebensdauer / Speicherklasse– evtl. initialer Wert– Sichtbarkeit (Scope) im Programm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Variablen 2
• Variablen-Definitionen, z.B.double u;short int i, tab = 5;char *hallo = "Hallo, Welt!";
• Position im Programm:– außerhalb von Funktionen– am Anfang eines Blocks, also nach {
• Wert ist veränderbar (Zuweisung, Operation)• Programmstruktur Lebensdauer / Scope
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Wie speichert C? 1
• Hauptspeicher
Wie speichert C? 2
• Beispiel: Zugriff auf Variable
Wie speichert C? 3
• Vor Programmstart
Wie speichert C? 4
• Programmstart und Aufruf von main()
Wie speichert C? 5
• Zuweisung a = 4;
Wie speichert C? 6
• Zuweisung b = 8;
Wie speichert C? 7
• Berechnung a * b;
Wie speichert C? 8
• Zuweisung c = a * b;
Wie speichert C? 9
• Danach
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Datentypen 1
• Menge von Werten undMenge von Operationen auf diesen Werten
• Konstanten / Variablen• Datentypen bestimmen
– Darstellung der Werte im Rechner– benötigten Speicherplatz– zulässige Operationen
• Festlegung des Datentyps– implizit durch Schreibweise bei Konstanten– explizit durch Deklaration/Definition bei Variablen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Datentypen 2
• Vordefinierte Grunddatentypen
char Zeichen (ASCII-Kode, 8 Bit)int Ganzzahl (maschinenabhängig, meist 16 oder 32 Bit)float Gleitkommazahl (32 Bit, IEEE, etwa auf 6 Stellen genau)double doppelt genaue Gleitkommazahl (64 Bit, IEEE, etwa auf 12 Stellen genau)void ohne Wert (z.B. Zeiger)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Datentypen 3
• Type-Modifier spezifizieren Grunddatentypen
short int, long int- legen Länge der Ganzzahl fest- maschinenabhängig, 16 Bit, 32 Bit - int kann auch fehlenlong double - Gleitkommazahl, erw. Genauigkeit- oft 128 Bit, IEEEsigned, unsigned - char/int mit/ohne Vorzeichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Datentypen 4
Typ Wertebereich Größe
char -128 bis 127 1 Byte
unsigned char 0 bis 255 1 Byte
short int -32.768 bis 32.767 2 Byte
unsigned short int 0 bis 65.535 2 Byte
int -2.147.483.648 bis 2.147.483.647 4 Byte
unsigned int 0 bis 4.294.967.295 4 Byte
long int -2.147.483.648 bis 2.147.483.647 4 Byte
unsigned long int 0 bis 4.294.967.295 4 Byte
long long -9.223.372.036.854.755.808 bis 9.223.372.036.854.755.807
8 Byte
unsigned long long 0 bis 18.446.744.073.709.551.615 8 Byte
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Datentypen 5
• Gleitkommatypen• Normaler Typ ist double• Typ float mit 6 Stellen Genauigkeit für die
meisten Anwendungen nicht geeignet• Type long double für Spezialfälle mit hohen
Anforderungen an Genauigkeit und Breite
•
Typ Bereich Genauigkeit Größe
float 1.2e-38 bis 3.4e38 6 Stellen 4 Byte
double 2.3e-308 bis 1.7e308 15 Stellen 8 Byte
long double 3.4e-4932 bis 1.2e4932 33 Stellen 16 Byte
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
Konstante Werte 1
• Dezimal, sedezimal (Hex), oktal– 4711, 0x1267, 011147
• Ganze Zahlen– signed (ist Standard)– unsigned: 4711u oder 4711U– long: 4711l oder 4711L– unsigned long: 4711ul oder 4711UL
• Warum? Der Datentyp bestimmt über Speicherplatz und Ergebnisse bei Rechnungen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Konstante Werte 2
• Gleitkommakonstanten– mindestens ein Punkt (kein Komma!)– Exponential- oder Festkommaschreibweise
• Fließkommazahlen– float: 5.f oder 5.0e1F (nicht 5f)– double (Standard): 3.14– long double: 7.l oder 7.L
• Warum? Der Datentyp bestimmt über Speicherplatz und Ergebnisse bei Rechnungen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Konstante Werte 3
• Zeichen char– 1 Byte, i.d.R. 8 Bit– char c = 'A';– Konstanten in Hochkommata / einfachen
Anführungszeichen– Kodierung nach ASCII-Code
• Keine Codierung nach UNICODE– 2 Byte / 16 Bit für internationale Zeichensätze– Datentyp wchar_t definiert in <stddef.h>– dazu eine Fülle von passenden Funktionen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
Konstante Werte 4
• Zeichenketten / Strings– char *s = "Fulda";
– Konstanten in Hochkommata / doppelten Anführungszeichen
– Terminiert mit NUL (ASCII-NUL)– im Speicher immer ein Byte mehr als gültige
Zeichen für terminierendes NUL-Zeichen– kann Steuerzeichen (wie '\n') enthalten
F u l d a \0
70 117 108 100 97 0
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Variablen und Typen
• Typbindung bedeutet:– Variable ist von einem bestimmten Typ– Funktion liefert einen bestimmten Typ
• Variable und Typ im Quelltext festgelegt• Zuweisungen a = b;
– Typ von b wird zum Typ von a gewandelt– Der Wert wird a zugewiesen– Bsp: int a = 4711; // ok– Bsp: int pi = 3.1415; // pi liefert 3!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Typwandlung 1
• Implizite Typwandlung durch Compiler– erweiterund von "kleiner" zu "größer" – Bsp: unsigned long l = 3;– Achtung: unsigned long l = -1;– l hat dann den Wert 4294967295, da unsigned!
• Implizit char int– Compiler rechnet intern mit int– Achtung char im Bereich -127 bis 128
oder 0 bis 255 (unsigned)– Achtung: Konstante EOF ist mit -1 definiert!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Typwandlung 2
• float double wie char int– Berechnungen erfolgen im ranghöchsten Typ– char < short < int < long < long long– float < double < long double– integer < "floating point"– signed und unsigned vom selben Rang
• Typwandlung höherwertig niederwertig kann Informationsverlust bedeuten
• int geteilt durch int gibt int: 1 / 2 = 0• Plattform- und Compilerabhängigkeiten!
Typumwandlung 3
• Automatische implizite Typumwandlung bei unterschiedlicher Typen in Ausdrücken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Typumwandlung 4
• Explizite Typumwandlung (Typecast)– Fehlervermeidung durch implizite Typwandlung– (typ) ausdruck // typecast– Bsp: (float) i / (float) j;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Definition und Deklaration 1
• Pseudocode lax, interpretierbar• C-Code strikt, eindeutig• Variablen können nicht einfach so verwendet
werden, sie müssen vor Verwendung definiert und deklariert werden
• Deklaration– es gibt eine Variable
– von diesem Typ
– mit diesem Namen
– irgendwie, irgendwo, irgendwann ...
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Definition und Deklaration 2
• Definition: Typ, Name und Speicher für die Variable werden festgelegt
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Definition und Deklaration 3
• Deklaration / Definition von Variablen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Speicherklassen 1
• Funktionen können nur global, d.h. ausserhalb von Blöcken definiert werden– Sichtbarkeit global– static Sichtbarkeit nur im Quelldateikontext
• Variablen können ausserhalb von Blöcken, d.h. global definiert werden– Sichtbarkeit global– static Sichtbarkeit im Quelldateikontext
• Variablen können innerhalb von Blöcken, d.h. lokal oder automatisch definiert werden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Speicherklassen 2
• auto– nur innerhalb eines Blocks, Standardklasse– Variable existiert / ist sichtbar nur im Block
• static– in Block: Variable erhält ihren Wert
– sonst: Variable/Funktion nur in C-Quelle sichtbar• extern
– Variable ist in anderer C-Quelle definiert
• register– Variable CPU-Register, hat keine Adresse!
• volatile– Variable kann ausserhalb Programm verändert werden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Sichtbarkeit 1
• Der Sichtbarkeitsbereich (Scope) einer Variablen Programmabschnitt, in dem die Variable sichtbar/nutzbar/gültig ist
• Der Scope wird durch den Ort der Definition bzw. Deklaration der Variablen festgelegt– innerhalb eines Blocks sichtbar von der Stelle der
Definition bis zum Blockende– ausserhalb sichtbar von Stelle der Definition bzw.
Deklaration bis zum Ende der Quelldatei– mit static definierte Variablen sind nur im Modul
(entspricht C-Quelle) sichtbar
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Sichtbarkeit 2
• Globale Variable müssen ausserhalb von Blöcken definiert sein
• Variablen aus anderen Modulen (globale Variable) müssen explizit als extern deklariert werden
• Scope einer Funktion: Bereich auf Ebene des Programms, in der die Funktion nutzbar ist– global– sollte dann vor Nutzung bekannt sein (Prototype)– lokal nur im Modul bei Definition als static
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
Sichtbarkeit 3
• Beispiel: 2 Module / Quelldateien
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
Sichtbarkeit 4
• Beispiel: scope.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Sichtbarkeit 5
• Welche Ausgaben erzeugt scope?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Lebensdauer 1
• Lebensdauer einer Variablen ist die Zeit,in der diese Variable Speicherplatz belegt
• lokale / automatische Variable– „lebt“, d.h. hat einen Speicherort vom Anfang bis
zum Ende des Blocks, in dem sie definiert ist– Speicherplatz wird bei Verlassen des Blocks
wieder freigegeben Variable ist ungültig!– Zugriff darauf ist dann undefiniert
• Globale oder statische Variable– „lebt“ vom Anfang bis zum Ende des Programms
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Lebensdauer 2
• Beispiel: lifetime.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Lebensdauer 3
• Welche Ausgaben erzeugt lifetime?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Speichersegmentierung 1
• Programmcode und Programmdaten eines Programms werden von Betriebssystem in unterschiedliche Speichersegmente geladen
• Programmcode Textsegment• globale / statische Daten Datensegmente
– Konstanten– initialisierte Daten– nicht initialisierte Daten
• automatische Daten Stacksegment– Daten werden erst bei Eintritt in Block erzeugt
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41
Speichersegmentierung 2
• Beispiel (Sun Solaris)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
Speichersegmentierung 3
• Warum Speichersegmentierung?Welche Vorteile hat das?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43
Speichersegmentierung 4
• Beispiel: segment.c