/* C-Quelldatei (z.B. hw1.c) wird folgendermassen verarbeitet: (1) C-Praeprozessor transformiert die Praeprozessor- Anweisungen in der Quelldatei z.B. #include Anweisung fuer das Einfuegen des Quelltextes aus Datei stdio.h in die vorliegende Quelldatei. <...> weist darauf hin, das der Praeprozessor die Datei im Verzeichnisbaum /usr/include zu suchen hat. Weiterhin loescht er C-Kommentare aus der Datei, weil diese nicht uebersetzt werden muessen. In C werden Kommentare in SCHRAEGSTRICH-STERN ... STERN-SCHRAEGSTRICH geklammert. (2) Der C-Compiler liest das Ergebnis des C-Präprozessors ( zB hw1.cpp) und uebersetzt dieses in Assembler (hw1.s). (3) Der Assembler nimmt das vom Compiler erzeugte Assemblerfile ( hw1.s) und erzeugt hieraus ein Objektfile (hw1.o). (Objektcode = Maschinencode, aber die Adressen sind nocht nicht "aufgelöst") (4) Der Linker nimmt die Objektdateien und erzeugt daraus das ausführbare Programm (hw1) */ #include /*--- ab hier der eigentliche C-Code ----*/ /* Ein C-Programm besteht aus einer oder mehreren Funktionen, das Programm wird immer mit der main()-Funktion ("Hauptfunktion") gestartet. Jede C-Funktion kann einen Rueckgabewert definieren. Die Main-Funktion hat den Typ desRueckgabewertes int. Die Anweisungen, die zu einer Funktion gehoeren, werden in einem Block mit { .... } zusammengefasst. Der C-Code laesst sich gliedern in - Deklarationen: Spezifikationen der Objekte, welche im Programm eingefuehrt und ggf manipuliert werden. Die Deklarationen werden zur Uebersetzungszeit vom Compiler ausgewertet. - Anweisungen: Ausführbare Instruktionen. Lassen sich gliedern in (1) Eingabeanweisungen (2) Ausgabeanweisungen (3) Leere Anweisung (4) Kontrollflussanweisungen ........... Anweisungen werden durch ; abgeschlossen ; allein ist die leere Anweisung */ int main() { /* printf gibt Informationen aus dem Programm auf die Konsole (dh. das Fenster, in dem das Programm gestartet wurde aus. Gliederung der printf-Parameter: Formatanweisung: Spezielle Formatparameter: \n : Zeilenumbruch \t : Tabulator %f : Ausgabe einer float-Variable %d : Ausgabe einer int-Variable %c : Ausgabe einer char-Variable %s : Ausgabe eines Strings Variablenliste (optional) */ /* Variablendeklaration In C werden nur getypte Variablen verwendet. Eine Variablendeklaration besteht aus VARIABLENTYP VARIABLENNAME; Vordefinierte Basistypen sind int ganze Zahlen float Gleitkommazahlen char Buchstaben weitere Basistypen: long long long unsigned int insigned char unsigned long unsigned long long double (float mit 64-Bit-Codierung) int8_t; int16_t; int32_t; int64_t; int64_t; Repräsentation OHNE Vorzeichen: uint8_t; uint16_t; uint32_t; uint64_t; werden in der naechsten Vorlesung und Uebung besprochen. */ float x; float y; int i; char a; /* mit Zuweisungen werden Variablenwerte verändert: "Im fuer x reservierten Speicher lege den Wert 3.5 ab" (Andere Programmiersprachen verwenden haeufig x := .... */ x = 3.5; /* speichere bei y den Wert 1.5 PLUS aktueller Inhalt der Variablen x */ y = 1.5 + x; printf("Hello World! x has value %f y has value %f, x = %f \n", x,y,x); printf(" Ein Prozentzeichen : %% \n"); printf(" Ein Anfuehrungszeichen: \" \n"); printf(" Ein Rueckwaerts-Schraegstrich : \\ \n"); /* Character-Literale werden in Hochkomma ' eingeschlossen: */ a = 'X'; printf("%c",a); a = 'Y'; printf("%c",a); a = 'Z'; printf("%c\n",a); /* In C werden Zeichen im ASCII-Code repräsentiert. Hiermit koennen 256 Zeichen codiert werden. Für internationale Anwendungen wird heutzutage UNICODE verwendet (wird zB von Java unterstuetzt). In C ist die Repräsentation als Byte und als Zeichen äquivalent: Daher sind auf char-Variablen die Rechenoperationen (+,*,/,%....) definiert. */ a = 'X'; i = a; printf("%c und als int = %d\n",a,i); a = a+1; i = a; printf("%c und als int = %d\n",a,i); }