Informatik II
Grundlagen der Programmierung
Programmieren in C
Grundlagen C 2
Hochschule Fulda – FB ET
Sommersemester 2010
http://www.rz.hs-fulda.de/et
Peter Klingebiel, HS Fulda, DVZ
Anweisung / Ausdruck 1
• Programm setzt sich aus vielen Anweisungen
(Zuweisungen, Vergleichen, Operationen,
Funktionsaufrufen, usw.) zusammen
• Anweisung (statement) im strengen Sinn in C
unbekannt
• Anweisung hat kein verwertbares Ergebnis
• Beispiel: Zuweisung in Pascal, Ada, …
integer i;
i := 123;
• Variable i hat nach Zuweisung den Wert 123,
die Zuweisung selbst ist allerdings nicht
weiter auswertbar!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
2
Anweisung / Ausdruck 2
• C kennt keine Anweisungen (statements),
sondern nur Ausdrücke (expressions)
• Ausdruck hat einen Wert (wie in Assembler!)
• Beispiel: Zuweisung in C
int i;
i = 4711;
• Zuweisung kann auch ausgewertet werden:
int a, b, c, i, j;
a = b = c = 3;
if(i = 4711)
...
while(j = 1)
...
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
3
Anweisung / Ausdruck 3
• Ausdruck  Gültige Kombination von
Konstanten, Variablen, Operatoren, Funktionen
• Reihenfolge der Auswertung
– Vorrangregeln der Operatoren legen Reihenfolge
der Auswertung implizit fest
– Klammern ( ) legen Vorrangregeln explizit fest
– Sind Vorrangregeln nicht eindeutig
 Reihenfolge der Auswertung nicht definiert
– Compiler kann Ausdrücke / Teilausdrücke in
effizient auswerten / optimieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
4
Datentyp short, int, long 1
• Ganze Zahlen
• Typen short, int, long, long long
• Speicherbedarf maschinenabhängig
– short <= int <= long <= long long
– Heute z.B: short 16 Bit, int 32 Bit, long 64 Bit
• Vorzeichen
– signed
– unsigned
mit Vorzeichen
vorzeichenlos
• Konstanten, Beispiele:
int a = 4711, b = -18;
short x = 0x20
int y = 020;
dezimal
sedezimal (Basis 16)
oktal (Basis 8)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
5
Datentyp short, int, long 2
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
6
Datentyp short, int, long 3
• Dezimal-, Sedezimal-, Binärdarstellung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
7
Datentyp short, int, long 4
• Operatoren / Operationen:
• Zuweisung =
– Beispiel:
int i;
i = 4711;
• Vorzeichen + – Beispiel:
int j = -4711;
• Arithm. Op. + - * / %
– Beispiel:
k = 2010 - i + j * 3 % 8;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
8
Datentyp short, int, long 5
• Vergleichsoperatoren == != < > <= >=
• expr1 op expr2
int a = 3, b = 8, c = 5;
a < 3
a >= b
b != 5
a == 3
a != b
b <= a + c
• Ergebnis: wahr  1, falsch  0
• Ergebnistyp  int
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
9
Datentyp short, int, long 6
• Logische Operatoren !
&&
||
• Ergebnis: wahr  1, falsch  0 (Typ int)
• expr1 op expr2
int a = 3, b = 8, c = 5;
(a < b) && (c < b)
(a == b) || (c >= a)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
10
Datentyp short, int, long 7
• Bitoperatoren
~
&
|
^
• expr1 op expr2 bzw. ~expr
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
11
Datentyp short, int, long 8
• Bitshiftoperatoren << >>
• expr1 op expr2
• Bits in expr1 um expr2 Bits verschoben
– Bsp. 1 << 2 1 um 2 Bits nach links
– Bsp: n >> 5 n um 5 Bits nach rechts
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
12
Datentyp short, int, long 9
• Inkrement- / Dekrementoperatoren ++
• Linkseitiger Operator ++n --n
--
– Wert von n wird inkrementiert / dekrementiert
– das Resultat wird als Ergebnis geliefert
• Rechtsseitiger Operator n++
n--
– Wert von n wird als Ergebnis geliefert
– Danach wird n inkrementiert / dekrementiert
int a = 8, b, c, d;
b = ++a;
c = a--;
d = --a;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
13
Datentyp char 1
• Einzelzeichen oder Integer 8 Bit
• Speicherbedarf 1 Byte (8 Bit)
• Konstanten, Zeichen durch ' ' geklammert
char c1 = 'A', c2 = '1', c3 = '\n'
• Sonderzeichen mit \ beschrieben, Bsp:
'\n'
'\t'
'\0'
'\"'
'\\'
Zeilentrenner (NL)
Tabulator (TAB)
Stringende (NUL)
Anführungszeichen
Backslash, Fluchtzeichen
• Darstellung im ASCII-Code
 char Untertyp von Ganzzahlen int
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
14
Datentyp char 2
• ASCII-Zeichensatz 7 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
15
Datentyp char 3
• ASCII-Zeichensatz 8 Bit (PC, MS-DOS)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
16
Datentyp char 4
• ANSI-Zeichensatz 8 Bit (Windows)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
17
Datentyp char 5
• Repräsentation (ASCII):
• Sinnvolle Operatoren/Operationen bei char:
=
(Zuweisung)
+ (arithm. Operationen)
== != < > <= >=
(Vergleich)
• Wird char als Byte (8 Bit-Integer) genutzt
 alle int-Operationen sinnvoll
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
18
Datentyp char 6
• Ascii-Tabelle ausgeben: ascii.c
/*
*
*
*
*/
ascii.c
ASCII-Tabelle 7Bit und 8Bit auf std
klin, 26.03.2010
#include <stdio.h>
int main(void)
{
int c, w;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
19
Datentypen float, double, long double 1
• Fließkommazahlen
• Typen float, double, long double
• Speicherbedarf
– float < double < long double
– float 32 Bit, double 64 Bit, long double 128 Bit
• Repräsentation nach IEEE 754
– Beispiel: float 32 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
20
Datentypen float, double, long double 2
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
21
Datentypen float, double, long double 3
• Konstanten, Beispiele:
float p = 3.141, a = -21.56, b = 0.5467
1.0 0.0 (Obacht: 1 oder 0  int)
7.0e-3 (0.007) 7.6543e2(765.43)
• Operatoren / Operationen:
=
+ + - * /
== != < >
<=
>=
(Zuweisung)
(Vorzeichen)
(arithm. Op.)
(Vergleich)
• Vorsicht bei Vergleichsoperationen wegen
Ungenauigkeiten in Darstellung (z.B. bei 0.0)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
22
Weitere Operatoren 1
• Spezielle Zuweisungsoperatoren  verkürzte
Schreibweise für Operationen auf Variablen
• a op= b  a = a op b
• Arithm. Operatoren: + - * / %
• Bitoperatoren:
<< >> & | ^
• Beispiele:
int n = 12
n -= 24
n /= 3
n <<= 3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
23
Weitere Operatoren 2
• Operator sizeof
• Ermittelt Größe von Typ / Variablen in Bytes
• Beispiel:
long l;
sl = sizeof(l)
sd = sizeof(double)
• Beispiel: Sun Sparc 32 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
24
Weitere Operatoren 3
• Komma-Operator ,
• Erlaubt die Aneinanderreihung mehrerer
Ausdrücke
• Wert = Wert des letzen Teilausdrucks
• Beispiel (etwas sinnlos):
int a, b, c = 3;
printf("%d\n", 1, b = 2, 3, c *= 4);
printf("%d\n", (1, b = 2, 3, c *= 4));
• Beispiel (sinnvoller):
for(i = 0, j = 0, k = 1; … )
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
25
Weitere Operatoren 4
• Bedingte Bewertung ? :
expr1 ? expr 2 : expr3
• Verkürzte Formulierung von Bedingungen
• Auswertung
– Erst Auswertung von expr1
– Wenn expr1 ≠ 0 dann gesamter Ausdruck expr2
– Sonst gesamter Ausdruck expr3
• Beispiel max(a, b) und min(a, b):
int a = 2, b = 4, min, max;
max = (a > b) ? a : b;
min = (a < b) ? a : b;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
26
Vorrangregeln bei Operatoren
Operatorenklasse
Operatoren
Assoziativität
Unär
!
~
++
Multiplikativ
*
/
%
Additiv
+
-
Shift
<<
Relational
<
Gleichheit
==
Bitweise
&
Von links nach rechts
Bitweise
^
Von links nach rechts
Bitweise
|
Von links nach rechts
Logisch
&&
Von links nach rechts
Logisch
||
Von links nach rechts
Bedingte Bewertung
?:
Von rechts nach links
Zuweisung
=
Reihung
,
--
+
Von rechts nach links
Von links nach rechts
Von links nach rechts
>>
<=
-
Von links nach rechts
>
>=
!=
op=
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Von links nach rechts
Von links nach rechts
Von rechts nach links
Von links nach rechts
27
Typumwandlung in Ausdrücken 1
• Automatische Typumwandlung bei
unterschiedlicher Typen in Ausdrücken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
28
Typumwandlung in Ausdrücken 2
• Beispiel:
double d = 1.1, ed;
float f = 1.1, ef;
int i = 1, ei;
char c = 1, ec;
ec = (char) (d + f + i + c);
ei = (int) (d + f + i + c);
ef = (float) (d + f + i + c);
ed = d + f + i + c;
• Explizite Typumwandlung (casting)
(type) expr
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
29
Felder 1
• Ein Feld (array) ist die Zusammenfassung
von Daten gleichen Typs in einer Variablen
• Felder haben eine oder auch mehrere
Dimensionen (Vektoren, Matrizen, …)
• Definition von Feldern:
char sbuf[128];
int arr[] = { 1, 8, 7, -1, 2 };
short mat[2][2] = { 11, 12, 21, 22};
• Mit der Felddefinition wird der benötigte
Speicherplatz für die Variable reserviert
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
30
Felder 2
• Zugriff auf Feldelemente mit Index in []:
char c;
c = sbuf[32];
sbuf[0] = 'A';
• Die Feldindizierung beginnt immer mit 0!
short s, mat[3][3];
s = mat[0][0];
• Felder werden elementweise und Zeile für
Zeile hintereinander abgespeichert
• Es gibt beim Zugriff keinerlei Überprüfungen
auf Bereichsgrenzen von Feldern!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
31
Felder 3
• Feldnamen sind eigentlich Pointer, zeigen auf
das erste Element im Feld
int i, *ip, ia[4] = {11, 22, 33, 44};
ip = ia;
i = *++ip;
• Felder werden mit Adresse an Funktionen
übergeben (wie Pointer)
• Feldindizes sind eigentlich Offsets und geben
den Abstand zum Feldanfang an
Bsp: ia[3]  *(&ia[0] + 3 * sizeof(int))
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
32
Felder und Zeiger
• Felder reservieren bei der Definition den
benötigten Speicherplatz
• Zeiger erhalten den Speicherplatz erst bei der
Zuweisung des Objekts, auf das sie zeigen,
oder bei dynamischer Speicherallokation
• Ähnlichkeit von Feldern und Zeigern
 mächtige Pointerarithmetik möglich
• Manchmal ein wenig unverständlich!
• Pointer essentiell bei Zeichenketten (strings)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
33

Informatik II Programmieren in C - Webserver - DVZ