Transcript for:
Einführung in die Programmierung mit C

Ich begrüße euch herzlich zur ersten Vorlesungsstunde Einführung in die Programmierung. Sicherlich eine eurer ersten Lehrveranstaltungen überhaupt für die meisten von euch in eurem Studium. Also ein doppeltes herzlich willkommen. Mein Name ist Justus Piater. Ich leite die Arbeitsgruppe für intelligente und interaktive Systeme, IIS am...

Institut für Informatik der Universität Innsbruck. Und ich habe diese Lehrveranstaltung letztes Jahr von meinem Kollegen Stefan Podlipnik übernommen, der nicht mehr unter uns ist am Institut. Leider ist er weggegangen. Aber das Lehrmaterial stammt auch von ihm. Deswegen hier die Credits.

Alles, was daran gut ist, geht auf seine Kappe. Alles, was an Fehlern drin ist, dafür bin ich verantwortlich. Worum geht es in dieser Vorlesung? Ein wichtiger Teil der Informatik ist das Programmieren.

Und in dieser Lehrveranstaltung geht es um folgende Ziele. Einmal allgemein einen Überblick über das Programmieren zu gewinnen. Was ist das? Wie funktioniert das? im Allgemeinen, elementare Grundlagen der Programmierung zu verstehen.

Insbesondere geht es aber um die Programmiersprache C. Also ihr werdet im Laufe dieser Lehrveranstaltung die Programmiersprache C sehr gründlich kennenlernen. kennenlernen, gründlich in dem Sinne, dass ihr fast alle sprachlichen Elemente, die die Sprache C zur Verfügung stellt, kennengelernt haben werdet. Um richtig flüssig zu werden in der Programmiersprache, werden die meisten von euch sicherlich noch ein bisschen mehr praktische Übung brauchen hinterher.

Darüber hinaus werdet ihr die wichtigsten Entwicklungstools kennenlernen, Programme, mit denen ihr arbeiten werdet, um ins in C zu programmieren und Programme in C zu entwickeln. Das ist ein Überblick über den Inhalt dieser Lehrveranstaltung. Eine lange Liste von Themen.

Die meisten dieser Themen sind für euch zu diesem Zeitpunkt wahrscheinlich hineingeschrieben. Phänomenalgesisch, Einführung, damit geht es gleich los, diese Lehrveranstaltung hier heißt Einleitung, sie wird gefolgt von der Einführung, was ist der Unterschied? Keine Ahnung.

Dann geht es um Variablen und Datentypen, Operatoren und Ausdrücke, Kontrollstrukturen. Ich brauche, glaube ich, die Liste nicht durchzugehen, denn die meisten dieser Begriffe werden euch zu diesem Zeitpunkt sicherlich wenig sagen. Aber all das werdet ihr im Laufe der Lehrveranstaltung sehr genau kennenlernen.

Was vielleicht wichtiger ist, ist das, was hier auf der rechten Seite steht. Wir fangen mit den einfachen Grundlagen an, dann kommen die schwierigeren Grundlagen. Und zu guter Letzt... geht es dann um Ergänzungen, die wichtig sind, um wirkliche Anwendungsprogramme schreiben zu können. Noch etwas Metainformationen über diese Folien.

Hin und wieder tauchen diese Symbole auf. Das obere Symbol heißt Literaturverweis, das untere Symbol heißt nur zur Information. Diese Folie ist nicht prüfungsrelevant.

Okay? Diese Folie ist also prüfungsrelevant. Ich werde jeden Buchstaben abfragen in der Klausur. Nein, hier sind nur ein paar Literaturvorschläge.

Es wird sicherlich vielen... Also ich denke, diese Lehrveranstaltung ist... self-contained, sie ist unabhängig von anderen Quellen, das Material ist sehr vollständig, aber das Material ist der Gestalt, dass sie der verbalen Erklärung bedarf.

Das heißt, wenn ihr zusätzliche Erklärungen braucht oder dieselben Erklärungen nochmal hören wollt, könnt ihr euch die Aufnahme, die dieses Jahr erstmalig stattfindet, hier nochmal anschauen, anhören. Oder viele von euch werden sicherlich auch mal in der Literatur... nachlesen wollen und hier sind vier empfehlungen für bücher die er sich in der bibliothek finden werdet und die jedenfalls weiterhelfen eine kleine bemerkung zu dem zweiten buch dem königin richie Königin und Ritchie waren die beiden Herren, die die C-Programmiersprache ihrer Zeit entwickelt haben.

Und es gibt ein Buch, das heißt Programmieren in C, in der ersten Auflage, das die Originalsprache beschreibt. Die Sprache hat sich zwischen der... der ersten Version und der ersten Standardversion 1990 deutlich weiterentwickelt und ihr solltet diese erste Auflage nicht verwenden, denn sie wird euch auf falsche Fährten führen. Also die zweite Auflage hier ist sehr wichtig. Und zu guter Letzt das GNU-C-Reference-Manual, wir werden den GNU-C-Compiler benutzen, wenn ihr genau wissen wollt, welche Konstrukte er zulässt und wie die entsprechenden Sprachkonstrukte von C funktionieren, dann ist das eine gute und vollständige Referenz, aber es ist eine Referenz und kein Lehrbuch.

Und dazwischen besteht ein großer Unterschied, wie ihr sicherlich feststellen werdet, wenn ihr den Link, und das ist tatsächlich ein Link, der in der ausgedruckten Version sicherlich nicht funktionieren wird, aber in der PDF-Version könnt ihr draufklicken und dann landet ihr dort und könnt euch den Inhalt ansehen. Etwas zur Organisation. Wir haben im Prinzip zwei Ressourcen für diesen Kurs, die liegen beide im OLAT. Wer von euch kennt das OLAT bereits? Wer hat das schon gefunden?

So gut wie alle, muss ich dazu gar nicht viel sagen. Also wir haben einen OLAT-Kurs für die Vorlesung, einen OLAT-Kurs für die... assoziierten Po-Seminare.

Und dort findet ihr alles, was ihr für diese Lehrveranstaltung braucht. Der Link für die Vorlesung steht hier oben. Einfach damit ihr alles in einer Hand habt.

Dort könnt ihr auch diese Folien runterladen und etwas Ergänzungsmaterial, das ich im Laufe des Semesters dort hochladen werde. Okay, das ist eure wichtigste Ressource. Ich würde euch empfehlen, das Material jeweils relativ kurz vor der Vorlesung runterzuladen, dann habt ihr das da und könnt gegebenenfalls während der Vorlesung das mitverfolgen, Notizen machen und so weiter. Prüfung.

Es gibt eine Klausur für diese Vorlesung. Das ist per Definition eine Vorlesung. In einer Vorlesung besteht der Prüfungsakt in einer einzigen oder die Note besteht in...

wird per eines einzigen Prüfungsaktes vergeben in einer Vorlesung. Das heißt, alles auf eine Karte. Karte Sitten, okay.

Also es wird eine Klausur am Ende des Semesters stattfinden. Der Termin steht schon fest. Ihr könnt euch jetzt schon dazu anmelden.

habt ihr vielleicht im LfU Online schon gesehen. Darüber hinaus wird es Wiederholungstermine geben für diejenigen, die die Klausur am ersten Termin nicht gepackt haben. Diese Termine stehen noch nicht fest und zwar deshalb, weil die Lehrveranstaltungstermine für das nächste Semester noch nicht feststehen. Dann kann ich die also nicht einsortieren. Zum Termin der ersten Klausur wird nicht nur die Vordringungsklausur stattfinden, sondern auch die Klausur der ersten Klausur.

auch eine Pro-Seminar-Klausur. Pro-Seminare sind Lehrveranstaltungen mit sogenannten immanenten Prüfungscharakter. Das heißt, das hängt nicht alles von dieser einen Klausur ab.

Und obwohl es eine Wiederholungsklausur geben wird, ist der Modus ein anderer in der Pro-Seminar-Klausur. Ihr habt also nicht das Recht, relativ häufig zu wiederholen beim Pro-Seminar. Ja, ihr solltet unbedingt alles darauf setzen, die... die erste Pro-Seminar-Klausur zu bestehen, denn sonst steht ihr schon mit einem Bein in großen Schwierigkeiten.

Alle sollten beim ersten Klausurtermin anwesend sein, entsprechend gut vorbereitet und mitschreiben und erfolgreich bestehen. Taktieren und auf den zweiten Termin spekulieren führt in der Regel zu nichts erfahrungsgemäß. Okay, die Termine, wisst ihr alle, stehen im LfO Online, also die Termine für die Klausuren, beziehungsweise für den ersten Termin, der erste Termin steht schon im LfO Online.

Darüber hinaus gibt es noch eine äußerst informative Webseite. deren Link hier unten aufgeführt ist. Das ist auf der Seite meiner Forschungsgruppe, wo alle unsere Kurse ihre eigene Webseite haben.

Aber für diese Lehrveranstaltung... findet sich dort lediglich eine kleine Tabelle mit den Links ins OLAT und ins Vorlesungsverzeichnis. Also was ihr euch eigentlich nur merken müsst oder was ihr euch nur bookmarken müsst, sind die OLAT-Links.

Da werdet ihr alle Informationen, Announcements, Ankündigungen usw. finden. Gibt es Fragen zur Organisation der Vorlesungen? Vortragender, ich stehe vor euch, Institut für Informatik. Und so weiter habe ich schon gesagt.

Wenn ihr mich kontaktieren wollt, bevorzugt per E-Mail. Ihr könnt auch versuchen, mich anzurufen, aber ich bevorzuge E-Mail. Denn das Telefon unterbricht mich in dem, was ich gerade tue. Und außerdem bin ich oft nicht in meinem Büro anwesend. Aber wenn ihr Fragen habt, kontaktiert mich gerne.

Sprechstunden nach Vereinbarung, das heißt wiederum Kontakt per E-Mail. Ihr findet mich dann im Büro 3N06 im ICT-Gebäude im zweiten Obergeschoss. Da kommt gleich dann noch eine Karte, genau, wo ihr mich findet.

Ihr alle wisst, wo wir jetzt sind. Wir befinden uns oben links. Das ICT-Gebäude ist hier unten rechts.

Wer weiß, wo das ICT-Gebäude sich befindet? Wer kennt das? Okay, das sind noch nicht alle, die sich da sicher fühlen, aber anhand dieser Karte werdet ihr das alle finden. Man muss dazu nur sagen, wie ihr festgestellt habt, ist der mittlere Bereich derzeit eine große Baustelle.

Das heißt, der normale Weg, der quer über den mittleren Bereich des Campus führen würde, zum Haupteingang, der im Norden ist. des ICT-Gebäudes liegt, ist bis auf Weiteres nicht gangbar, sondern ist hier zwischen den Containern und dem Architekturgebäude durchgehend nach Süden und dann von unten, von Süden her in das ICT-Gebäude einsteigen. Und wie auch angezeigt ist, im Architekturgebäude westlich des ICT-Gebäudes befinden sich die Rechnerräume, in denen die Pro-Seminare stattfinden werden. Das heißt, einige Pro-Seminare finden... soweit ich mich jetzt erinnere, auch im Bauingenieur-Hörsaal-Trakt statt.

Der befindet sich, Laserpointer, hier. Also ich weiß nicht genau, wenn es Pro-Seminarien gibt mit der Hörsaalbezeichnung HSB, dann ist das in diesem Trakt hier oben. Und wenn ihr euch dann durchgeschlagen habt, das ist ein ICT-Gebäude, in das zweite Obergeschoss, das im Fahrstuhl hilfreicherweise mit 3 markiert ist, findet ihr euch auf diesem Stockwerk wieder. Und ich befinde mich oben in der Ecke, wo 3N06 steht.

Dieser Plan ist etwas... Ah, ne, der ist eigentlich nicht verdreht, das stimmt schon so. Das ist jedenfalls die Nordostecke des Gebäudes. Zur Übung, genauso gibt es hier im OLAT die Homepage, wo ihr alles Material findet. Es gibt fünf Gruppen, finden alle Mittwochs statt.

Hier auch für die Termine das LFU Online. Der erste Termin ist kommenden Mittwoch. Pro-Seminare, wie gesagt, haben immanenten Prüfungscharakter, das heißt, es besteht Anwesenheitspflicht.

Auf der Basis, dass ihr Pro-Seminare versäumt, könnt ihr mit einer 5 davonziehen für die Pro-Seminare. Der erste Termin ist darüber hinaus doppelt wichtig, denn dort werden wichtige organisatorische Details besprochen, wie die Poseninhalte gehalten werden, wie die Note am Ende zustande kommt und so weiter. Also ganz wichtig, zum ersten Termin müsst ihr unbedingt anwesend sein, wie zu allen anderen Terminen auch. woraus setzt sich die note dann zusammen in der für die für die pro seminare anwesenheitspflicht lösung von programmieraufgaben also ihr werdet den größten teil der prozesseit damit verbringen programmieraufgaben zu lösen und diese im Pro-Seminar selber dann zu präsentieren.

Das heißt, ihr löst sie zu Hause in eurer eigenen Zeit und in den Pro-Seminaren werden dann einzelne von euch eure Lösungen präsentieren. Dann gibt es eine Klausur, darüber habe ich schon gesprochen und die anderen Details werden euch dann am ersten Termin bekannt gegeben. Gibt es Fragen dazu?

Ja. Das mache ich gleich. Aber das ist eine sehr berechtigte Frage, denn die Pro-Seminar-Gruppen sind derzeit sehr unterschiedlich groß und das werden wir gleich versuchen zu bereinigen.

Aber bevor wir das machen, schnell noch eine letzte Folie hier zum Tutorium auf der LFO. Online-Seite zur Vorlesung. Habt ihr sicherlich bemerkt, dass es nicht nur die Vorlesungen selber gibt, sondern auch ein sogenanntes Tutorium. Wozu ist das da? Das ist ein Angebot für diejenigen unter euch, die Bedarf haben an mehr Hilfe.

Und zwar steht euch dienstags von viertel nach vier bis sechs im Rechnerraum 15 im Architekturgebäude Daniel Gasteiger zur Verfügung. ein netter Mensch, der euch Fragen beantworten kann. Dazu sitzt er da.

Das fängt jetzt am kommenden Dienstag an. Es ist nicht ganz ausgeschlossen, dass einige von euch da vielleicht schon Fragen haben. denn es gibt im Pro-Seminar bereits eine erste Aufgabe, die bereits am kommenden Mittwoch fällig ist.

Also die Pro-Seminare fangen an, bevor die Pro-Seminare anfangen. Die meisten von euch können das OLAT des Pro-Seminars noch nicht erreichen, soweit ich weiß, weil eure Anmeldegesuche für das Pro-Seminar noch nicht bestätigt sind. Und das liegt daran, dass die...

gruppengrößen sehr unterschiedlich sind wir das erst bereinigen müssen das wird sich aber heute oder morgen klären dann könnt ihr dort zugreifen da findet ihr dann alles was ihr für diese erste aufgabe braucht darüber hinaus werde die erste aufgabe per e mail bekommen um jede das problem auszuschließen also die erste aufgabe wird äußerst simpel aber die sie sorgt dafür dass ihr schon mal eine arbeitsgrundlage habt auf der ihr später dann weitermachen könnt also was wird im tutorial besprochen also wenn der allgemeine Fragen zum Stoff habt, Verständnisprobleme und so weiter oder mit der Rechnung umgebung nicht klarkommt, wie geht ihr mit den ZIT-Rechnern um und so weiter, also den Rechnern der zentralen Informatikdienste. Alle solche Fragen könnt ihr dort stellen und werden euch beantwortet. Wenn ihr konkrete Fragen dazu habt, wie bestimmte Aufgaben gelöst werden fürs Pro-Seminar, dann könnt ihr diese auch stellen, aber sie werden euch nicht beantwortet werden, denn die müsst ihr selber lösen. Im Tutorium geht es darum, allgemeine Fragen und Verständnisprobleme zu klären, aber nicht darum, sich fertige Lösungen abzuholen für die Pro-Seminare. Darüber hinaus, ich denke das Tutorium ist sicherlich eure erste Anlaufstelle bei Fragen und Problemen, genauso wie die Pro-Seminarleiter während der Pro-Seminare oder ich während der Vorlesung.

Und falls das alles nicht reicht, seid ihr herzlich willkommen, die Pro-Seminarleiter oder mich jederzeit per E-Mail zu kontaktieren und gegebenenfalls Termine auszumachen, um Fragen und Probleme zu klären. Wenn jemand von euch Schwierigkeiten haben sollte, diese Lehrveranstaltung zu bestehen, dann darf das nicht daran liegen, dass ihr nicht genug Interaktionen mit euren Lehrveranstaltungsleitern hattet. Also gebt nicht auf, sondern ergreift die Initiative und wendet euch an uns, damit wir eine Chance haben, euch zu helfen. Okay, wo wir gerade dabei sind. Es gibt ein paar Sachen, die möchte ich noch loswerden.

Und die habe ich mal kurz hier aufgeschrieben. Studierende sind Erwachsene. Mir ist kein besseres Wort eingefallen, um das alles zusammenzufassen.

Also habe ich das mal Erwachsene genannt. Was sind ein Erwachsener? Als Kind habe ich immer gedacht, ein Erwachsener ist jemand, der immer genau weiß, was zu tun ist. In dem Sinne warte ich immer noch darauf, erwachsen zu werden.

Aber ich glaube, Erwachsensein heißt hauptsächlich, was hier steht, was ich hier hingeschrieben habe, unter Studierende werden wie Erwachsene behandelt. Eigenverantwortung, Selbstmotivation, Zuverlässigkeit, formale Korrektheit. Ihr habt hier viel Freiheiten im Studium, aber täuscht euch nicht, ihr habt hauptsächlich die Freiheit, euch selbst zu schaden. Wenn ihr von dieser Freiheit nicht weise Gebrauch macht, dann werdet ihr nicht optimal durchstudieren können.

hier im gegensatz zur schule ist ja keiner der euch in den hintern tritt wenn ihr nicht eure aufgaben nicht macht oder wenn er nicht erscheint in der vorlesung besteht keine anwesenheit pflicht aber was ich beobachte in meinen vielen jahren mittlerweile als professor ist ein starker zusammenhang zwischen nicht in den vorlesungen anwesend sein und bei den prüfungen durchfallen okay die lernstil ist ein unterschiedlich Natürlich, einige von euch werden die Vorlesung nicht brauchen, aber geht erstmal dafür, dass ihr euch nicht so viel Zeit verpasst. davon aus, dass ihr sie brauchen werdet, bis ihr euch das Gegenteil beweisen könnt. Denn sonst geht ein riesengroßes Risiko ein. Also ihr habt die Verantwortung, euer Studium selbst in die Hand zu nehmen und verantwortlich durchzuziehen. Wie gesagt, es kümmert sich sonst keiner um euch.

euch werden Fragen beantwortet, aber ihr seid diejenigen, die sie stellen müssen. Ihr seid diejenigen, die die Initiative ergreifen müssen. Ihr müsst die Motivation selber aufbringen, hier das Studium durchzuziehen. Dazu gehört eine entsprechende Zuverlässigkeit. Ihr schreibt euch irgendwo ein in eine Lehrveranstaltung, dann sagt ihr damit, ich nehme an dieser Lehrveranstaltung teil, ich mache alle Hausaufgaben, ich lerne das Material, ich bereite mich auf die Prüfung vor, ich melde mich für die erste Prüfung an und ich bestehe diese erste Prüfung.

Es gibt immer wieder Leute, die das Ganze lockerer sehen und sagen, ich bin zwar angemeldet, aber ich komme dann doch nicht oder drei Tage vor dem ersten Prüfungstermin habe ich einen anderen Prüfungstermin bei einer anderen Lehrveranstaltung, dann mache ich bei der lieber den zweiten Prüfungstermin. Es gibt eine hohe Korrelation zwischen solchem Taktieren und das Studium nicht packen. Ihr entscheidet euch, Informatik zu studieren, ihr studiert Informatik.

Ich habe den Punkt formale Korrektheit hier mit aufgenommen und zwar deshalb, weil es Regeln gibt und Regeln sind dazu da, den Ablauf zu organisieren. Wenn man kleine Gruppen hat und eine Person, die sich in den Ablauf befindet, dann ist das eine gute Idee. Verhältnis, dann kann man improvisieren. Okay, dann kann man im Einzelfall entscheiden, wie es in der jeweiligen Situation am besten ist. Aber wenn man auf einmal hunderte von Leuten hat, mit denen man umgehen muss, dann kann man ganz schnell seine gesamte Zeit damit aufwenden.

aufwenden, Einzelfälle zu entscheiden. Deswegen gibt es Regeln und deswegen werden diese Regeln eingehalten. Und im Einzelfall kann es dann sein, dass jemand ungerecht behandelt wird, aber das liegt eben genau daran, ab einer gewissen Masse kann man nicht mehr jeden Einzelfall nach gesundem Menschenverstand entscheiden.

Deswegen gibt es Regeln und an diese solltet ihr euch auch halten. Nicht wahr? Ein erstes Beispiel dazu ist Leute, die nicht zum Pro-Seminar angemeldet sind, obwohl der Anmeldschluss vorbei ist. Rüge, okay. Okay, ihr fangt alle an, alle müssen mal irgendwo anfangen und das lernen und so weiter.

Deswegen sind wir jetzt noch nicht hart an dieser Stelle und es sind zum Glück nur sehr wenige. Manche haben vielleicht sogar eine tatsächlich... Erklärung dafür, aber das ist ein Beispiel für Regeln, an die man sich halten muss, zum Beispiel. Als nächstes, es handelt sich um ein Vollzeitstudium, das heißt, ihr müsst davon ausgehen, dass ihr auch tatsächlich Vollzeit studieren werdet. Ich weiß nicht, was für ein Bild ihr vom Studium habt, vielleicht ein bisschen romantisiert mit viel Party und so weiter.

Das darf alles nicht fehlen. zwischen den Partys müsst ihr wirklich ran. Ein Vollzeitstudium geht davon aus, dass ihr acht Stunden, fünf Tage die Woche arbeiten werdet.

Manche von euch werden mehr tun müssen. Das liegt in der Natur der Sache. Leute haben verschiedene Niveaus an Vorbildungen, verschiedene Begabungsniveaus. Einige werden mehr tun müssen als andere.

Also ihr wisst, worauf ihr euch einlasst. Deswegen entscheidet euch jetzt durchzuziehen und dann zieht durch. Zur verantwortungsvollen Organisation eures eigenen Studiums gehören ein paar einfache Punkte. Als erstes folgt dem Regelstudienplan. Wenn ihr im LfU online schaut, was es für Kurse gibt, die im ersten Semester dieses Studiums angeboten werden.

Dann steht da drin, ob das Pflicht-oder Wahlveranstaltungen sind. Im Moment sind alles Pflichtveranstaltungen. Und die Tatsache, dass ihr alle hier seid, beweist, dass ihr das soweit begriffen habt. man kann natürlich, und das machen auch einige einzelne Vorlesungen, auch später verschieben, aber dann verzögert sich euer Studium und dann gibt es Terminkonflikte und so weiter.

Daher mein dringender Rat, folgt dem Regelschmiedenplan, so weit wie möglich. Denn sobald ihr davon abweicht, kann man schnell Probleme mit den Terminen bekommen. Dann ein weiterer Punkt, der eine große Umstellung ist für den weitaus größten Teil aller Studierenden.

In der Schule wird man kontinuierlich auf die Schule geflogen. Ich bin aufgefordert, Aufgaben abzugeben und über das Jahr verteilt finden mehrere Klausuren statt. Hier in der Vorlesung gibt es nur eine Klausur am Ende des Semesters.

Das ist alles. Ihr könnt also theoretisch zur Vorlesung kommen und dann euch in die Klausur setzen am Ende des Semesters. Und dann kommt das große Erwachen, oh, ich habe ja eigentlich gar nichts verstanden.

Ich habe viel weniger verstanden, als ich gedacht hätte, dass ich verstanden hätte. Okay, deswegen sind wir wieder bei dem Punkt der Eigenverantwortung. Ihr seid selber dafür verantwortlich, den Stoff aufzuarbeiten, dass ihr jederzeit den aktuellen Stoff gelangt.

gelernt habt, wenn ihr das durchzieht, dann habt ihr für die Klausur nachher kaum noch was zu lernen. Dann ist es nur noch ein kurzer Rückblick und ein Zusammenfassen und Wiederholen des Stoffs, den ihr sowieso schon drauf habt. Natürlich ist es nicht ganz so schlimm, denn wir haben ja die Pro-Seminare und in den Pro-Seminaren werden ja tatsächlich aufgefordert, Aufgaben zu lösen. Wenn ihr die Pro-Seminar-Aufgaben alle erledigt, dann solltet ihr mit dem Vorlesungsstab keine Probleme haben.

Es gibt immer ein paar Dinge, die die Pose-Seminare nicht abdecken können, ein paar Feinheiten der Sprache C, die vielleicht abgefragt werden in der Klausur, aber das sind dann nur noch Einzelheiten. Wenn den Pose-Seminar lückenlos folgt, dann seid ihr eigentlich auch für die Vorlesungsklausur zu drei Vierteln vorbereitet. Und dann habe ich bestimmt schon zweimal gesagt, aber ich sage es noch ein drittes Mal aus schmerzlicher Erfahrung, lasst keine Prüfungstermine aus. Es ist wirklich besser für euch.

Bereitet euch gut vor und lasst dann keine Prüfungstermine aus. Und zu guter Letzt, auch aus schmerzlicher Erfahrung, Täuschungsversuche sind keine Kavaliersdelikte. Auch das sicherlich für viele eine Umstellung von der Schule. In der Schule hat man mal einen Spickzettel oder so.

Oder man versteckt sein Mobiltelefon in der Toilette im Mülleimer oder so was und holt sich dann Rad zwischendrin. drin. In der Schule wird da vielleicht noch ein bisschen drüber gelächelt oder es gehört zur kreativen Ausbildung dazu oder so, keine Ahnung.

Aber hier sind wir im richtigen Leben. Hier seid ihr erwachsen und keine Schulkinder mehr. Und im richtigen Leben sieht das anders aus.

Im richtigen Leben ist ein Täuschungsversuch ein krimineller Akt. Und Studium kann nur funktionieren, wenn wir alle ehrlich zu uns selbst und ehrlich zu den anderen sind. Okay? An...

an amerikanischen Universitäten insbesondere gibt es Honor Codes, wo Studierende unterschreiben, wie sie sich verhalten in diesem Sinne. Das gibt es bei uns leider nicht. Ich fände es gut, wenn es das gäbe, gerade weil es von der Schule eine Umstellung ist für viele. Also Täuschungsversuche werden hart geahndet.

Und wie das konkret aussieht, zum Beispiel in der Klausur, wer beim Täuschungsversuch erwischt wird, der kriegt eine 5. Klar. Automatisch okay. Und im Pro-Seminar, das werden euch die Pro-Seminarleiter noch genauer erläutern. Aber ich denke, wenn ihr euch wie Erwachsene verhaltet, so wie ihr behandelt werdet, dann werdet ihr Spaß haben am Studium und die Erfolge einfahren von euren Bemühungen.

Okay? Also auf geht's. Wir haben jetzt eine Dreiviertelstunde verbraucht.

Wir machen noch keine Pause, oder? Es ist zu früh. Fragen an dieser Stelle? Wenn nicht, dann gehen wir jetzt gleich von der Einleitung über in die Einführung. Ich werde ein bisschen Sachen sagen zur Programmierung allgemein, ein bisschen was über die Programmiersprache C sagen und dann bekommt ihr euer erstes C-Programm zu sehen.

Wozu überhaupt programmieren? Also ein Computer hat in seinem Herzen einen Mikroprozessor, der Befehle liest und ausführt, die CPU. Und ein Programm ist jetzt eine Sequenz von solchen Befehlen, die der Computer oder der Prozessor einer nach dem anderen einliest und ausführt.

Und das alles funktioniert auf sehr niedriger Ebene. Das sind also ursprünglich, inzwischen sieht das auch schon ein bisschen anders aus, Aber ursprünglich waren das alles in Hardware kodierte Schaltkreise, die eine Bitsequenz eingelesen haben, eine Folge von Nullen und Einsen, und den Befehl, den diese Bitsequenz kodiert, ausführen, wie zum Beispiel einen Wert von einer bestimmten Speicheradresse in ein bestimmtes Prozessorregister laden. Die Zahlen, die in zwei Prozessorregistern gespeichert sind, addieren und das Ergebnis in ein drittes Prozessorregister schreiben. Auf dieser Ebene spielen sich diese Maschinenbefehle ab.

Sagt euch das was und ich sage Register, schon mal gehört. In irgendeiner anderen Lehrveranstaltung im ersten Semester werdet ihr damit konfrontiert werden, auf jeden Fall. Was jetzt an dieser Stelle wichtig ist, ist, dass diese Befehle sich auf sehr niedriger Ebene befinden. Da geht es darum, Zahlen zwischen Speicherplätzen hin und her zu schieben und zwischen Speicherplätzen und dem Register des Prozessors hin und her zu schieben und einfache Operationen auszuführen, wie addieren, multiplizieren, zu einer anderen Programmstelle springen und so weiter.

Und das ist alles in Hardware implementiert, die Ausführung dieser einfachen Befehle. Und wenn ihr jetzt ein Programm haben wollt, das der Rechner ausführt, dann müssen sie in diese Sprache umgewandelt werden. Zum Beispiel, hier ist ein Beispiel eines Maschinenbefehls der 32-Bit-MIPS-Architektur, die heute nur noch eine untergeordnete Rolle spielt.

Das ist also eine Folge von 32 Nullen und Einsen, die jetzt den Befehl repräsentiert, addiere binäre Werte in den Architektur. den Registern 8 und 9 und speichere das Ergebnis im Register 10. Das bedeutet diese Folge von Nullen und Einsen. Macht Spaß, so zu programmieren, oder?

Ihr setzt euch an den Editor, tippt 000000001, 0000001, 0000001 und so weiter. Und dann habt ihr einen Befehl geschrieben. Super. Das macht natürlich nicht so viel Spaß. Aber um das besser lesen und schreiben zu können, kann man diese Maschinenbefehle 1 zu 1 übersetzen in ein lesbares Äquivalent.

Und das lesbare Äquivalent steht hier drunter. Add. 10, Register 8, Register 9. Das heißt, Add, und dann kommt das Register, wo das Ergebnis reinkommt, und dann kommen die beiden Register, wo die Operanden der Operationen zu finden sind.

Das kann man sich, glaube ich, gut vorstellen, dass man solche einfachen Befehle gut ineinander umwandeln kann, zwischen der Maschinenrepräsentation und der menschenlesbaren Repräsentation. Diese menschenlesbare Repräsentation ist bekannt unter dem Namen Assembler, oder Assembler. Assembly-Sprache oder Assembly-Code.

Also diese Umwandlung zwischen diesen beiden Reparationen ist 1 zu 1 und trivial. Die Codierung kann man sich vielleicht auch ein bisschen anschauen. Die Farben korrespondieren hier. Die 10 ist hier binär.

Hier binär kodiert, rot, rot, nicht wahr? Das ist eine binäre 10. Und warum ist das eine 10 binär? Kann das jemand erklären? Genau, in unserem bekannten Dezimalsystem funktioniert das folgendermaßen.

Die ganz rechts stehende Ziffer ist der Multiplikator für 10 hoch 0. Die Ziffer da von links ist der Multiplikator für 10 hoch 0. 10 hoch 1 und immer so weiter. Das heißt, das hier ist 10 hoch 1 plus 10 hoch 0 macht zusammen 10. Binär-System funktioniert ganz genauso, nur dass die Basis nicht die 10 ist, sondern die 2. Das heißt, hier haben wir 0 mal 2 hoch 0 plus 1 mal 2 hoch 1 plus 0 mal 2 hoch 2 plus 1 mal 2 hoch 3. Also 2 hoch 3 ist 8, 2 hoch 1 ist 2, 8 plus 2 ist 10. Hier haben wir die 8. Warum das eine 8 ist? Ne, das ist die 8 hier.

Das ist die 8, hier haben wir die 9 und diese beiden Teile zusammen repräsentieren genau diese Form der Add-Operation. Okay. Wollen wir jetzt in dieser Sprache programmieren?

Add. Man kann, ja. Ja, die grünen 5 Nullen, die werden in diesem Fall nicht gebraucht bei diesem Befehl.

Die MIPS 32-Bit-Architektur ist eine sogenannte RISC-Architektur für Reduced Instruction Set Computer. Und eine der Eigenschaften von RISC-Architekturen ist, dass alle Befehle genau dieselbe Länge haben, in diesem Fall 32-Bit. Denn deswegen bleiben da manchmal Puzzles übrig. Also diese Sprache, die wir hier haben, die ist natürlich auf einer sehr niedrigen Ebene.

Wir können addieren und die Werte aus Registern auslesen und wieder zurückschreiben. Aber es ist natürlich offensichtlich, dass es schwierig ist, große Programme in dieser Art zu schreiben. wünscht sich bessere Abstraktionen, um einfach mit weniger Schreibarbeit komplexere Zusammenhänge ausdrücken zu können. Darüber hinaus ist der Befehlssatz, den ein Prozessor zur Verfügung stellt, zwischen verschiedenen Prozessorarchitekturen sehr unterschiedlich.

unterschiedlich das heißt ihr müsstet für jede prozessor architektur dasselbe programm komplett neu implementieren das ist natürlich extrem ineffizient nicht wahr ihr wollt ein programm einmal schreiben und das dann auf allen möglichen verschiedenen computern laufen lassen okay auf dem laptop auf eurem desktop zu hause auf dem smartphone und auf eurem google glass und so weiter Ja, also wenn man sehr hardware-nahe Sachen programmieren muss, dann muss man schon mal auf diese Ebene runter. Aber das sind nur sehr, sehr kleine Bereiche dessen, was überhaupt insgesamt programmiert wird. Also unterschiedliche Architekturen haben sehr unterschiedliche, teilweise sehr unterschiedliche Maschinensprachen.

Und wie gesagt, ist diese Sprache zu fein, wie soll man sagen, zu detailliert. um praktisch zu sein, um große Programme zu programmieren. Daher die Idee, wir brauchen eine höhere Programmiersprache, die uns erlaubt, auf einem höheren Abstraktionsniveau und auf strukturierte Weise zu arbeiten. arbeiten, sodass Menschen gut darin schreiben und den Programmtext gut lesen können und dann überlassen wir das einem Übersetzer, das Programm dann aus dieser höheren Programmiersprache in die eine oder andere oder verschiedene Assembler-Sprachen zu übersetzen. Okay, dann haben wir diese beiden Probleme auf einen Schlag gelöst.

Und dieser Übersetzer, der wird allgemein als Compiler bezeichnet. Und für uns ist das zunächst mal einfach nur der Compiler. Programmtext rein, ausführbares Programm raus. In Wirklichkeit liegen dazwischen mehrere Schritte. Die sind erstmal nicht wichtig, darüber kommen wir dann im Detail noch später zu sprechen.

Hier ist ein Beispiel. oben rechts eine kleine Funktion in einer höheren Programmiersprache, in C. Was haben wir hier? Wir haben eine Funktion, die heißt swap. Man sieht also schon, was diese Funktion macht.

Sie wird irgendwas vertauschen, nicht wahr? Und dieser Programmtext wird durch den Compiler geschickt und der Compiler produziert und Assembly-Code. Also hier haben wir dann den Assembly-Code auf derselben, das ist jetzt Code auf genau derselben Ebene wie hier unten. Add $10, $8, $9, das ist genau das gleiche wie diese Instruktionen, die wir hier sehen. Das ist die menschenlesbare Form maschinenlesbaren Codes.

Hier wird ein Registerwert mit einem Integer multipliziert. Hier ist das gleiche Add, wie wir vorhin hatten. Load Word relativ zu einem Speicher, zu einem Indexregister und so weiter.

Store Word und Jump Back von dieser Funktion an die Adresse, die im Register 31 gespeichert ist und so weiter. Okay. Und dieser... Dieser menschenlesbare Text, der Prozessorbefehle enthält, der wird dann durch den Assembler in die binäre Maschinensprache übersetzt, was dann eine triviale Operation ist. Und jetzt haben wir hier diese sieben Befehle, die genau diesen sieben Befehlen hier oben entsprechen.

Die Trennung zwischen Compiler und Assembler ist in der Praxis für uns nicht wichtig die meiste Zeit. Für uns ist einfach der Compiler der Übersetzer, der einen menschenlesbaren Text in einer Hochsprache, sprich C, übersetzt in ein ausführbares Programm. Okay. Das habe ich im Prinzip alles schon gesagt. Es ist nicht praktisch in Assembly zu schreiben, weil die Sprache einfach viel zu detailliert ist.

Wir brauchen Hochsprachen. Der Programmierer soll sich nicht um solche Details kümmern müssen, wie welche Register wofür verwendet werden, sondern soll sich auf die... Lösung eines Anwendungsproblems konzentrieren können. Und es gibt sehr viele Programmiersprachen. Und unter anderem in Wikipedia findet ihr einen Link auf eine Liste mit Programmiersprachen.

Was meint denn, wie viele Programmiersprachen gibt es? Zehn? Hundert?

Tausend? Wer meint eher zehn? Wer meint eher 100?

Wer meint eher 1000? Ja, da seid ihr wahrscheinlich schon auf der richtigen Fährte. Es werden natürlich nicht alle Programmiersprachen gleichmäßig verwendet, aber es gibt tatsächlich eine sehr große Zahl von Programmiersprachen, die in der Praxis teilweise im Nischenbereich verwendet werden. Jetzt mal ein kleines bisschen Hintergrund zu C.

C wurde Anfang der 70er entwickelt in den AT&T Bell Labs. Und zwar wurde C dadurch motiviert, dass sich AT&T Bell Labs hingesetzt hat und gesagt hat, wir wollen ein modernes Betriebssystem entwickeln. Aber was ist denn wirklich ein Betriebssystem? Kann das jemand von euch erklären? Also, ich habe gesagt, ja.

Ja, das ist schon gut gesagt. Ja, noch eine Ergänzung? Ja, also...

Ja. So hat es tatsächlich angefangen. Die ersten Betriebssysteme waren wirklich nicht mehr als nur die Schnittstelle zwischen Hardware und Software.

Heute machen Betriebssysteme sehr viel mehr, wie Verwaltung mehrerer simultan laufender Prozesse und so weiter. Ein Betriebssystem ist sozusagen die Softwarelage, die direkt auf der Hardware läuft und die Anwendungsprogramme eine bekannte und standardisierte Schnittstelle sind. zur Verfügung stellt, auf der die dann ablaufen können. Das heißt, ein Programm kann dann eine Funktion aufrufen, die sagt, ich brauche jetzt von dieser Datei die ersten 20 Bytes.

Das Betriebssystem kümmert sich dann darum, wie die Hardware angesteuert werden muss, um diese Datei auf der Festplatte zu finden und dann die ersten 20 Beise auszulesen. Liegt nahe, dass solche Betriebssysteme sehr eng mit der Hardware zusammenarbeiten müssen. Man wird vielleicht um Assembler-Code nicht drum herum kommen. Moderne Betriebssysteme enthalten sehr viel Funktionalität, die eigentlich von den Details der Hardware unabhängig ist.

Und genau damit sahen Sie... sich die AT&T Bell Labs damals konfrontiert. Die wollten also ein modernes Betriebssystem entwickeln und zwar nicht in Assembly, weil das dann wieder spezifisch für eine bestimmte Architektur gewesen wäre, sondern sie wollten ein Betriebssystem, das portable ist und mit einfachsten Mitteln auf verschiedene Hardware angepasst werden kann.

Dazu brauchten sie also eine höhere Programmiersprache. Nun, was gab es in den 70er Jahren für Programmiersprachen? Fortran.

und nicht viel mehr COBOL. Es gab schon Programmiersprachen, höhere Programmiersprachen, aber keine davon war geeignet, hinreichend Hardware-orientiert zu programmieren. Denn ein Präzisionsystem muss ja mit Hardware sehr direkt umgehen können. Also Sie brauchen eine Sprache, die hohe Abstraktionen erlaubt, aber gleichzeitig genug Kontrolle bietet, um fast bis auf Assembler-Niveau runtergehen zu können, um ein Betriebssystem Betriebssystemen damit zu entwickeln.

Und dann haben sie also angefangen, eine Pro-Emi-Sprache zu entwickeln. Und weil ihnen kein besserer Name eingefallen ist, haben sie sie A genannt. Und dann haben sie daraus gelernt und das Ganze verworfen und neu gestartet mit der Sprache B. Und dann könnt ihr euch vorstellen, wie die Sprache C zustande kam. Und weiß jemand, wie das Betriebssystem oder die Betriebssystemfamilie hieß, die damit dann entwickelt wurde? Glatte Einser, Unix.

Unix stammt aus den 70er Jahren und man kann glaube ich mit Fug und Recht sagen, dass die Unix Betriebssystemfamilie immer noch das modernste ist, was es in diesem Bereich gibt. Und die Programmiersprache C hat darüber hinaus einen Siegeszug angetreten. Man hat darin Unix entwickelt und die ersten Anwendungsprogramme, also die ganzen Systemprogramme, um mit dem System zu interagieren, unter Unix wurden auch in C geschrieben und die ersten Anwendungsprogramme wurden auch in C geschrieben.

dadurch hat sich C in den 80er Jahren dann sehr schnell verbreitet und ist 1989 erstmalig standardisiert worden. hat es immer wieder neue Standards gegeben. Das hat der 1099-Standard verabschiedet worden, der in dieser Lehrveranstaltung verwendet wird.

Die Bemerkung, dass es nicht von allen Compilern komplett unterstützt wird, trifft immer noch zu, aber... Alles, was für uns wichtig ist, wird von den meisten Compilern unterstützt. Und C11 ist, soweit ich weiß, bis heute der aktuelle Standard.

C, was ist C für eine Sprache? Eine imperativee Poemiersprache, was heißt denn das? Wenn es eine imperative Prolmiersprache gibt, dann gibt es auch nicht-imperative Prolmiersprachen, oder? Weiß jemand schon, was das bedeutet, imperativ?

Genau, Imperativ heißt, ein Befehl oder eine Instruktion folgt der nächsten. Und was wichtig ist, diese Befehle bewirken die Veränderung eines Zustandes. Das heißt, in der Regel ein Wert einer Variablen wird verändert. Okay, das ist ein Charakteristik von imperativen Formiersprachen.

Es gibt andere Formiersprachen, die nicht imperativ sind, zum Beispiel funktionale Sprachen. Die funktionieren wie mathematische Funktionen. Okay, da wird nicht eine Variable...

immer wieder, da wird nicht einer Variablen immer wieder ein neuer Wert zugewiesen, auf diese Weise Fortschritt gemacht, sondern alles wird funktional ausgedrückt. Es ist jetzt schwer zu sehen, was der Unterschied ist für euch, aber der Unterschied ist groß und ihr werdet eine Lehrveranstaltung haben, eine Pflichtlehrveranstaltung, die heißt funktionale Programmierung. Und dann werdet ihr genau wissen, was der Unterschied ist.

Und dann gibt es deklarative Programmierung noch, wo gar nicht beschrieben wird, wie ein Problem zu lösen ist, sondern es werden nur zum Beispiel Prädikate aufgeschrieben, die sagen, wie die Lösung auszusehen hat. Und dann muss das Programm selber hergehen und versuchen, den Zustand des Programms so hinzubiegen, dass die Prädikate erfüllt sind. Okay? Werdet ihr auch noch kennenlernen. Aber in der Praxis werden die meisten Anwenderprogramme in einer imperativen Sprache geschrieben oder in einer objektorientierten Sprache, werdet ihr auch noch kennenlernen, was im Prinzip eine Obermenge der imperativen Sprachen darstellt.

C hat wenige Schlüsselwörter, das war damals eine Revolution. Eine der Programmiersprachen, die es damals gab, war ADA, die sehr viele Befehle hatte. Schwer zu handhaben, so eine Programmiersprache. C hat daraus und aus anderen gelernt und ist eine sehr kleine Sprache mit sehr wenigen Sprachkonstrukten.

die aber trotzdem sehr mächtig ist, weil man diese Sprachkonstrukte mit enormer Flexibilität miteinander kombinieren kann. Und wie gesagt, einfach durch die Historie von C, C erlaubt es einem sehr hardwarenah zu programmieren, weil eben C entwickelt wurde, um zunächst Betriebssysteme zu entwickeln damit. Also C ist eine sehr mächtige Sprache, obwohl es eine sehr kleine Sprache ist, hat Vor-und Nachteile. Der C-Programmierer hat enorm viel Freiheit.

Das schließt die Freiheit ein, sich selbst ins Knie zu schießen. Und das werdet ihr auch alle praktisch erleben, wenn ihr eure ersten Schritte mit C macht. Und ihr werdet es weiter erleben, auch wenn ihr eure zweiten und dritten Schritte mit C macht.

dritten Schritte mit C macht. C ist eine sehr gefährliche Sprache in dem Sinne, dass... Praktisch alles, was denkbar ist, auch erlaubt ist, aber von dem, was erlaubt ist, ist nur ein kleiner Teil tatsächlich sinnvoll.

Und ihr werdet alle viel Zeit damit verbringen, in diesem Bereich rumzustochern, wo ihr erlaubte Sachen macht, die aber nicht sinnvoll sind. So was nennt sich dann Fehler oder Bug oder so. Und die müsst ihr dann finden. Das bedeutet auch, dass C nicht unbedingt die beste Sprache ist, um im ersten Semester gelehrt zu werden. Es gibt Formiersprachen, die sind viel einfacher zu lernen, weil eben nur Sachen zum Beispiel erlaubt sind, die auch sinnvoll sind.

Warum fangen wir trotzdem mit C an? Weil wir Sadisten sind. Nein, sondern, also einmal gibt es tatsächlich unterschiedliche Ansichten. Es spricht sehr viel dafür, mit einer anderen Sprache anzufangen, aber es gibt tatsächlich auch Gründe dafür, mit C anzufangen.

Und das ist so ein bisschen Geschmackssache, dass wir hier mit C anfangen. war nicht meine Wahl und trotzdem denke ich, gibt es gute Gründe dafür. Wenn man C lernt, muss man, um vernünftig mit C arbeiten zu können, eine ganze Menge anderer Konstrukte bereits verstanden haben. Man muss sehr viel darüber verstehen, was ein Prozessor ist, was Register sind, wie der Speicher eines Rechners organisiert ist in Heap, Stack und so weiter. Begriffe, die den meisten von euch jetzt noch nicht sagen werden.

Das liegt daran, dass C wie gesagt aus der Entwicklung eines Betriebssystems stammte. Und viele dieser Konzepte, die ihr versteht, müsst um zu verstehen wie ziel funktioniert die kennt er jetzt noch gar nicht ihr müsst also quasi beides gleichzeitig lernen und vieles davon wird auch mehr oder weniger gleichzeitig in anderen lehrveranstaltungen gelehrt das ist klingt erstmal nach einem nachteil Hat aber auch Vorteile, denn indem ihr beides gleichzeitig lernt, habt ihr ein viel besseres Gesamtbild davon, was da eigentlich vor sich geht. Deswegen würde ich sagen, für einen Informatiker oder einen angehenden Informatiker macht es tatsächlich... Sinn, C sehr früh zu lernen, denn die Begriff, diese Schwierigkeiten, die ihr dann habt, um alles verstehen zu können, diese Dinge, die müsst ihr sowieso alle lernen, früher oder später.

Als Informatiker müsst ihr das eher alles verstehen. Können wir genauso gut gleich als am Anfang machen. dadurch ist die Hürde am Anfang etwas höher aber der gesamte Lerneffekt unterm Strich ist dennoch beträchtlich also stellt euch schon mal darauf ein, es wird eine eine schwierige Reise für viele von euch, aber wenn ihr am Ziel seid, dann habt ihr wirklich was gelernt und zwar nicht nur über die Sprache C und Programmieren allgemein, sondern ihr habt auch eine Menge darüber verstanden, wie ein Rechner intern funktioniert Wo wird sie heute verwendet? Natürlich in Betriebssystemen, wie zum Beispiel Linux.

Linux gehört auch zu der Unix-Familie. Was für Betriebssysteme gehören noch zur Unix-Familie? BSD, genau. OSX gehört auch zur Unix-Familie.

HWX auch, genau. Was noch? Wer von euch hat ein Android-Smartphone? Linux. Okay.

C wird immer noch verwendet in Hardware-nahe Programmierung und wird es auch auf absehbare Zeit bleiben. Eingebettete Systeme. Was ein eingebettetes System ist, verändert sich ständig.

Früher betrachtet man ein Telefon als eingebettetes System. Heute ist ein Telefon... ein vollwertiger Computer. Spieleprogrammierung, und zwar deswegen, weil man dank der Hardwarenähe in C sehr effizient, laufzeiteffizient und auch speichereffizient programmieren kann. C ist darüber hinaus die Grundlage vieler weiterer Programmiersprachen.

C++, eine objektorientierte Variante von C. Objective C, eine objektorientierte Erweiterung von C ebenfalls, die von Apple entwickelt und popularisiert wurde unter MerkOS. Und dann gibt es jede Menge weitere Sprachen, die von C beeinflusst werden, weil in dem Sinne, dass C zum Beispiel eine sehr elegante Syntax hat, also die Java-Syntax wurde fast 1 zu 1 von C.

übernommen, einfach weil C eine sehr angenehme Syntax hat, die gut ankam bei den Programmierern. quasi Microsofts Antwort auf Java, Perl, Python, Skript, Sprachen, haben viele der Elemente oder sowohl der inhaltlichen als auch der syntaktischen Elemente von C übernommen. Und selbstverständlich, C-Compiler sind auf praktisch allen Systemen verfügbar. C, also man kann sagen, C könnte man mit Fug und Recht als die älteste Programmiersprache im moderneren Sinn bezeichnen und dennoch ist C jugendlich und frisch.

Programmiersprachen, hier ist mal eine kleine Auswahl von ungefähr zehn oder genau zehn Programmiersprachen und deren Popularität, wie sie sich über die letzten Jahre entwickelt hat, lautet diesem Tiobe-Index. C ist diese helle blaue Linie, weitgehend horizontal. Darüber haben wir Java, Objective-C, steigt stark an und so weiter und so fort. In dem Sinne von, glaube keiner Statistik, die du nicht selbst gefälscht hast, schauen wir uns das mal ein bisschen näher an hier.

Fahren wir gleich mal hinten an hier. Warum steigt hier Objective-C quasi aus dem Nichts raketenartig auf in den letzten fünf Jahren? Ja?

Genau, das ist das Aufkommen der iPhones, schlicht und einfach. Warum? Warum gibt es hier diesen Einbruch in der Popularität von Java im Bereich 2004 bis 2005?

Ja, und dann haben die Leute C-Sharp wieder verworfen und gesagt, C-Sharp ist doch Mist, wir gehen zu Java zurück. Also die Vermutung ist gut, aber sie trifft, denke ich, nicht zu oder ist sicherlich nicht der Hauptanteil. Jetzt müsst ihr mal in Feindbildern denken.

Wo könnte dieser Einbruch herkommen? Verschwörungstheorien, ja? Nein.

Es ist schlicht und einfach ein Artefakt der Datenerhebung. Der Theobe-Index verlässt sich auf Suchmaschinen, stellt bestimmte Suchanfragen, um die Popularität von Programmiersprachen zu erheben. Und in diesem Zeitraum hat Google ihr Page-Ranking verändert.

Das ist alles. Also Google hat damals gegengesteuert, weil bestimmte Seiten künstlich hochgepusht wurden. Und da haben sie gegengesteuert durch eine Änderung ihrer PageRank-Methoden. Und dadurch ist dieser Artefakt entstanden.

Also wie gesagt, man muss Statistiken sehr kritisch lesen. Letzte Frage. Hier in den letzten Monaten... geht die popularität von java stark zurück die von objectivc geht auch stark zurück und die von c++ geht auch stark zurück und alle gehen stark zurück keine steigt in ihrer popularität wie kann denn das angehen sind wir nicht mehr 100 prozent abschluss ja du bist ehrlich dran Das liegt einfach daran, das sind hier nur 10 Programmiersprachen und wenn man die aufaddiert, wenn man die Prozente aufaddiert, dann kommt man nicht auf 100, sondern darüber hinaus gibt es noch an die 100 weitere Programmiersprachen, die von dem Tjube-Index erfasst werden und die sind einfach nicht geplottet hier. und was der Trend, falls er überhaupt einer ist, andeutet, ist, dass spezialisierte Sprachen populärer werden in jüngerer Vergangenheit.

Das ist der einzige Schluss, den man daraus ziehen könnte. Dann muss man sich allerdings auch überlegen, hier handelt es sich um wenige Monate und wenn man sich anguckt, wie stark die Kurven schwanken, dann kriegt man auch einen Eindruck davon, wie zuverlässig diese Zahlen überhaupt sind. Dieser Einbruch hier ist ein Eindruck, der sich in der Zeit der Kurven schwankt.

signifikant? Glaube ich nicht, kann ich mir nicht vorstellen. Warum sollte eine Programmiersprache derartig an Popularität verlieren und hinterher wieder ansteigen?

Also diese Linien, die wir hier sehen, die müsst ihr euch eigentlich vorstellen als Balken, die mindestens so dick sind. Genauere Schlüsse kann man daraus nicht ziehen. Bereit für das erste C-Programm? Dann machen wir jetzt Pause.

Um Viertel vor 10 geht es weiter. Weiter geht es. Viertel vor 10 heißt Viertel vor 10. Also die, die noch nicht da sind, hier ist unser erstes... Also Lüftung aus.

Die Lüftung hat ein sehr interessantes User-Interface. Zwei Sekunden drücken, eine Sekunde warten, Lüftung geht an. Und dann zum Ausschalten, fünf Sekunden drücken, zwei Sekunden warten und dann geht sie aus.

Sehr interessant. Unser erstes C-Programm. So sieht es aus. Einfach, dass ihr sowas schon mal gesehen habt.

Alles, was hier in grün erscheint, sind Kommentare. Also ganz einfach in C, alles was ihr grün schreibt, ist ein Kommentar. Nein, natürlich nicht.

Das ist hier nur deswegen farbig, weil der... der Editor, der hier verwendet wurde, sogenanntes Syntax-Highlighting verwendet. Das heißt, der Editor kennt die Syntax der verwendeten Programmiersprache und setzt Farbe ein, um den Text für den Klaren lesbar zu machen.

Also die Farbe hat überhaupt keine Bewandtnis, sondern sie hilft nur dem Programmierer. Wie erkennt also der Compiler, dass es sich um Kommentare handelt? Hier gibt es zwei Möglichkeiten.

Ein Kommentar fängt mit einem Streckstrich und einem folgenden Stern an und endet mit einem Stern und einem Schrägstrich in ungefähr der Reihenfolge. Alles dazwischen ist ein Kommentar. Oder ein Kommentar fängt mit zwei Schrägstrichen an und endet am Ende der Zeile.

Also das sind die beiden Möglichkeiten in C, einen Kommentar zu schreiben. Dann haben wir hier eine Funktion. Diese Funktion heißt main. Sie nimmt keine Parameter, deswegen void als Parameterliste.

Void ist Englisch für leer. Was macht diese Funktion? Sie enthält zwei Befehle, beziehungsweise zwei Anweisungen ist der korrekte deutsche Begriff.

Nämlich eine Anweisung, die eine Funktion aufruft. Diese Funktion heißt printf. Als Argument wird dieser Funktion eine Zeichenkette übergeben.

Diese Zeichenkette enthält den Text Hello World und einen abschließenden Zeilenumbruch. Anschließend kehrt diese Funktion zurück. Und zwar liefert sie als Rückgabewert eine ganze Zahl, einen Integer. Und der genaue Wert wird durch diese Konstante exit underscore success repräsentiert.

So sieht also unser erstes C-Programm aus. Warum zeigt es Hello World an? Einfach deswegen, jetzt müssen wir mal warten, bis wieder Ruhe eingekehrt ist.

Vielen Dank. Vielen Dank fürs Türschließen. An dieser Stelle nochmal ein herzliches Willkommen den Nachzüglerinnen und Nachzüglern.

Viertel vor heißt Viertel vor, okay? Und nicht Acht vor. So, warum Hello World? Und zwar deswegen, weil Kernighan und Ritchie in ihrem ersten Buch, in dem sie C vorgestellt haben, mit genau diesem Beispiel oder diesem Beispiel in der damaligen Version von C angefangen haben.

Ich war mal schläg die erste Seite im Buch auf, da steht ein kleines Programm, das zeigt Hello World an. wie ein Baby, das auf die Welt kommt. Hello World. Und seitdem gibt es die Transition, dass das einfachste Beispielprogramm in jeder Programmiersprache, die seitdem erfunden wurde, erstmal daran besteht, Hello World auszudrücken. Okay.

Okay, also was macht ihr mit einem solchen Programm? Dieses Programm tippt ihr in einen beliebigen Texteditor. Okay, und zwar ohne diese Ziffern hier am Anfang, dieses 1., 2., 3., 4., 5. Das sind lediglich Referenzen für spätere Folien, damit wir uns auf die entsprechenden Zeilen zurückverweisen können.

der eigentliche Programmtext beginnt in dieser Spalte. Also diesen Text, den könnt ihr einfach in einen Editor tippen, in dieser Form. Und dann habt ihr erstmal nur einen Text. Die Datei speichert ihr ab. Zum Beispiel in einer Datei, die Test.c heißt.

Punkt c ist die konventionelle Endung für einen c-Programmquelltext. Und dann könnt ihr ihn lesen und andere Programmierer können ihn auch lesen. Und dank der vielen Kommentare können andere Programmierer und ihr selber zehn Jahre später diesen Text auch immer noch sehr gut und schnell lesen und verstehen. Aber ein Computer kann ihn nicht ausführen.

Denn das ist einfach nur eine Textdatei, die einen Text enthält, der in einer höheren Programmiersprache geschrieben ist. Müssen wir den also durch einen Compiler schicken, damit der Compiler daraus ein ausführbares Programm generiert, das aus diesen Maschinenbefehlen besteht, die als Sequenzen von Nullen und Einsen repräsentiert sind. Um das zu tun... Nutzen wir den C-Compiler, den GNU C-Compiler.

Das Programm, das das alles in einem Schritt macht, heißt GCC für GNU C-Compiler. Es folgen eine ganze Anzahl Argumente, Optionen, die wir in dieser Lehrveranstaltung immer verwenden werden. Und dann folgen zwei wichtige Dinge, nämlich einmal muss der Compiler wissen, welche Datei er übersetzen soll.

Das ist die Datei test.c, die genau diesen Text enthält. Und"-o test", heißt, dass der erzeugte Programm, ausführbarer Programmcode, in einer Datei abgelegt werden soll, die test heißt, ohne Endung. Wie es unter Unix üblich ist, eine Datei, die keine Endung hat, ist in der Regel eine ausführbare Datei. Dann haben wir also nach diesem Aufruf eine ausführbare Datei, die Test heißt.

Und um diese Datei auszuführen, um dieses Programm auszuführen, schreiben wir auf der Kommandozeile.slash test, Enter. Und das Ergebnis ist, dass diese Zeichenkette Hello World angezeigt wird. Okay.

Denjenigen von euch, für die das nicht vollkommen offensichtlich ist, was hier passiert, empfehle ich, das einfach mal zu machen. Diesen Text in eine Datei zu schreiben oder vielleicht von der Folie zu kopieren und pasten und abzuspeichern und diesen Compiler-Aufruf auf diese Weise zu starten und dann das Programm auszuführen. Okay.

Übrigens, das erste Übungsblatt, das am Mittwoch fällig ist, behandelt im Prinzip genau das. Darum geht es. Also, dass ihr einfach schon mal ein C-Programm kompiliert und laufen lasst. Das ist im Prinzip die Idee dieses ersten Übungsblattes. So, wir gehen jetzt ein bisschen mehr ins Detail, aber bevor wir das Programm Zeile für Zeile durchgehen und genau verstehen, was in jeder Zeile passiert, noch mal ein paar Hintergrundinformationen.

Also in C gibt es grundsätzlich zwei Arten von Dateien, nämlich Quelltextdateien und Headerdateien. Und Headerdateien enthalten im Prinzip auch C-Quelltext. Warum unterscheidet man dann zwischen Quelltextdateien und Headerdateien? Headerdateien verwendet man für Informationen, die selber beim Kompilieren Keinen Platz verbrauchen, also keinen ausführbaren Code, sondern nur Dinge wie Definitionen und Deklarationen, also sprich Dinge, auf die wir noch zu sprechen kommen werden. Also Informationen, die man für die Übersetzung benötigt, Informationen über neu definierte Datentypen und so weiter.

Und die separiert man deswegen in Header-Dateien aus, getrennt von den Quelltext-Dateien, weil dieselben Informationen dann von verschiedenen Quelltext-Dateien eingelesen werden können. Wie macht man das? Das passiert über diese Include-Anweisungen. Okay, und diese Quelltextdatei, die enthält also den Quelltext oder auf Englisch Source Code, das ist in diesem Fall das Programm in C. Plus Kommentare, die den Inhalt des Programms sinnvoll beschreiben.

Und was macht der Compiler mit diesen Kommentaren? Wegwerfen, ganz einfach. Die Kommentare sind wirklich nur für den menschlichen Leser.

Wobei das nur man eigentlich streichen kann, denn Programmquelltexte werden hauptsächlich von Menschen gelesen. Im Vergleich dazu, wie häufig sie von Menschen gelesen werden und wie viel Zeit damit vergeht, dass Menschen sie nicht lesen. sie lesen, ist die Zeit, die ein Computer sie liest, extrem kurz.

Also wenn ihr programmiert, könnt ihr euch gleich merken, ihr schreibt den Text hauptsächlich für Menschen. Der Computer übersetzt den dann und führt das Programm aus, aber der Text selber ist erstmal für Menschen, nicht wahr? Für euch selber zehn Jahre später, dass ihr dann noch versteht, was ihr gemacht habt oder dass andere Programmierer verstehen, was ihr gemacht habt und den Code korrigieren oder weiterentwickeln können.

Hier nochmal Schritt für Schritt, wobei immer noch vereinfacht, was hier passiert. Ihr setzt euch hin mit eurem Texteditor, tippt euer Programm hinein, speichert diese Textdatei, die den C-Code enthält, ab in einer Datei, die Test.c heißt. Dann ruft ihr den Compiler GCC auf und der produziert das ausführbare Programm, das Test heißt.

Was für einen Editor benutzt ihr? Notepad++? Okay, kann sein.

Ich kenne es nicht, könnt ihr benutzen. Die Antwort ist irgendeinen Editor. Wobei die Betonung auf Editor liegt und nicht Word Processor.

Also keine Textverarbeitung, denn eine Textverarbeitung ist etwas völlig anderes als ein Editor. Ein Editor dient dazu, dass ihr Texte reinschreibt und dieser Text wird genau in die Textverarbeitung eingeschaltet. dieser Form, Zeichen für Zeichen, wobei das auch schon nicht mehr ganz stimmt, immer vereinfacht gesagt, in der Datei abgelegt. Dagegen, wenn ihr in einer Textverarbeitung schreibt, dann sieht das von außen ganz ähnlich aus, aber die Datei, die abgespeichert wird, hat einen völlig anderen anderes Format und enthält Informationen über Zeichensatz, was weiß ich, verwendete Sprache, Formatierung und so weiter, die völlig irreland sind und die der Compiler überhaupt nicht lesen kann. Ein Compiler kann nur Textdateien lesen und keine Textverarbeitungsdateien.

Es ist schon vorgekommen, dass Leute eine Klausur abgegeben haben am Ende der Vorlesung in einer Word-Datei, also Quellcode in einer Word-Datei. Funktioniert nicht. Also ansonsten könnt ihr einen beliebigen Editor verwenden, solange es Emacs ist. Nein, ihr könnt natürlich wirklich jeden beliebigen Editor verwenden, aber es wird dringend empfohlen, dass ihr einen Editor verwendet, der die Syntax der Sprache C versteht und euch dabei unterstützt.

Und die beiden wichtigsten Merkmale dabei sind, die beiden wichtigsten Formen, in der der Editor euch unterstützen kann, ist einmal das Syntax-Highlighting. So wie hier. Dann zeigt er in schönen Farben an, die unterscheiden, um was für sprachliche Elemente es sich handelt. Das macht den Quelltext einfach einfacher zu lesen. Man erkennt, man findet sich schneller zurecht.

Das ist das eine. Und das andere ist die automatische Einrückung. Darauf werden wir noch zu sprechen kommen.

Wenn ihr euch den Text hier anseht, sind diese beiden Zeilen eingerückt von der ersten. Spalte. Warum diese Einrückung?

Man ist in einem Befehl. Ja, ist das signifikant? Ja, zur Übersicht, ist wirklich nur für den Leser, aber das ist dasselbe nur wie vorhin, okay? Es ist für den Leser und der Leser ist der Wichtige hier.

Also von einem sauberen Programmierstil hängt die Lesbarkeit eines Programmes extrem. stark ab. Darüber werden wir auch noch mehr sprechen im Laufe der Lehrveranstaltung.

Und ein Editor, der die Syntax versteht, wird es euch erlauben, zum Beispiel mit der Tabulator-Taste automatisch richtig einzurücken. Also ein guter Editor. an dieser Stelle wird den Tabulator nicht benutzen, um einen Tabulator einzufügen, sondern er wird die Zeile, in der er euch gerade befindet, einfach exakt richtig, genau richtig einrücken. Das macht es sehr viel einfacher und effizienter, einen konsistenten Programmierstil zu pflegen.

Also so viel zum Editor. Sucht euch einen Editor aus, der die Programmiersprache versteht. abspeichern unter einem beliebigen Namen, aber der Name sollte Sinn machen, nicht wahr?

Denkt wieder daran, ihr seid, dass die den Namen lesen müssen. Und er muss auf Punkt C enden. Und zwar ist es ein kleines C und kein großes C. Auch wichtig, denn in manchen Konventionen steht das große C für C++ und C++ ist nicht C, sondern eine andere Programmiersprache.

Okay? Okay, den Rest haben wir schon mal kurz besprochen mit der Übersetzung. Fragen hierzu? Soweit? Okay.

Achso, nochmal für die Praxis. Also wenn ihr... Wenn ihr dieses Programm auf diese Weise übersetzen und ausführen wollt, dann braucht ihr einen Editor und einen C-Compiler. Editor findet sich, glaube ich, auf jedem System, C-Compiler nicht unbedingt.

Das heißt, wenn ihr einen eigenen Rechner besitzt, der keinen C-Compiler installiert hat, dann müsst ihr selber herausfinden, wie ihr einen C-Compiler installiert bei euch. Oder wenn ihr keinen eigenen Rechner besitzt, oder... nicht herausfindet, wie ihr einen C-Compiler bei euch installieren könnt, dann könnt ihr einfach die ZIT-Rechner benutzen. Ihr geht einfach ins Architekturgebäude, im Untergeschoss sind Rechnerräume, die meisten davon sind den größten Teil der Zeit über nicht für andere Zwecke reserviert, da könnt ihr euch dann hinsetzen an einen freien Rechner und euch mit eurem Linux-Account einloggen und da findet ihr dann verschiedene Editoren und einen C-Compiler, bei dem ihr genau in dieser Zeit dieser Form aufrufen könnt. Okay, also wie gesagt, C-Compiler gibt es für praktisch alle Betriebssysteme und Architekturen und in den meisten Linux, also in allen praktisch verwendeten Linux-Distributionen mit wenigen Tastenklicks oder Mausklicks installierbar oder schon vorhanden.

Wenn der GTC... ohne Optionen aufruft, sondern nur mit dem einzigen Argument der Quelldatei, die ihr übersetzen wollt, dann sollte das in der Regel auch funktionieren. Aber es hat ein paar Seiteneffekte. Das Programm, das geschrieben wird, heißt dann A. Punkt Out aus historischen Gründen und unter Windows zum Beispiel A.exe. In der Regel wollt ihr explizit sagen, wie das ausführbare Programm heißen soll.

Der Name ist in der Regel in diesem einfachen Fall, wenn wir nur eine einzige Quelldatei haben, einfach der Name der Quelldatei ohne die Endung, per Konvention. Denn es gibt keinen Grund, einen anderen Namen zu verwenden. In der Praxis bestehen die meisten C-Programme aus mehreren Quelldateien. Und dann ist die Wahl nicht mehr ganz so eindeutig wie hier.

Okay, dann gibt es kompliziertere Aufrufe. Für unsere Zwecke besteht die Komplexität hauptsächlich darin, dass diese drei Optionen dazu kommen. Minus W all, Minus W error und Minus Standard gleich 1099. Was heißt Minus W all? Minus W steht generell für Warnoptionen. Und Minus-We-All aktiviert alle Warnungen, die man in der Regel durch Korrektur von Bugs und Stilproblemen eliminieren kann.

Also es wird dringend empfohlen, Minus-We-All zu aktivieren, weil das euch hilft, inhaltliche und Stilfehler zu machen. Was ich gesagt habe, hilft zu beseitigen. Wenn ihr das nicht macht, machen wir es und wenn dann Warnungen auftauchen, dann verliert ihr Punkte. Minus W, Error, bedeutet, dass Warnungen wie Fehler behandelt werden. Das ist ein sehr zweischneidiges Schwert, für euch das vielleicht am Anfang gut, denn das heißt, ihr erhaltet überhaupt erst ein ausführbares Programm, wenn keine Warnungen mehr erzeugt werden.

Das ist vielleicht ein Vorteil, in der Praxis kann man das nicht immer so machen. Und zu guter Letzt, minus Standard equals C99. Wir arbeiten hier mit dem C99-Standard. Es gibt verschiedene C-Standards, weil sich C ständig weiterentwickelt.

der Beispiele, die wir in der Lehrveranstaltung benutzen, brauchen tatsächlich diese Option minus Standard gleich 1099, um überhaupt fehlerfrei zu kompilieren. Okay? Deswegen solltet ihr euch auf jeden Fall angewöhnen, mindestens immer minus ball und minus Standard gleich 1099 anzugeben. Minus W-Error ist eine Geschmacksfrage.

Was zählt, ist, dass euer Programm keine Warnungen erzeugt, wenn es kompiliert wird. C-Umgebung in dieser Vorlesung. Die meisten, also die, okay, die, es geht jetzt hier erstmal um den Code, der in diesen Folien enthalten ist. Also die Folien und der Code. Code stammen fast ausschließlich von Stefan Portlipnik, meinem Vorgänger.

Die sollten alle auf ZIT-Rechnern ohne Warnung und Fehler lauffähig sein, bis auf ein paar Ausnahmen zu Und Lehrzwecken sind stellenweise Fehler drin, die aber absichtlich drin sind und die sind dann auch als solche gekennzeichnet. Also es sollte immer erkennbar sein, wo wir absichtlich Fehler eingebaut haben. Wo das nicht der Fall ist, sollte das fehlerfrei kompilieren und laufen auf den ZIT-Rechnern.

Und wenn ihr Code findet in dieser Lehrveranstaltung, den wir hier verwenden in der Lehrveranstaltung, der fehlerfrei sein sollte, es aber nicht ist, dann meldet mir das und dann gebe ich einen aus. Und da sage ich es nicht, weil ich so super sicher bin, dass alles fehlerfrei ist in den Folien, sondern deswegen, weil ich Fehler, die eventuell vorhanden sind, eliminieren möchte. Und das geht am besten mit eurer Mithilfe.

Es sei denn, ihr empfindet es als Bedrohung, wenn ich euch einen ausgebe, dann einigen wir es auf etwas anderes. Okay, der Rest ist unwichtig. Okay, nochmal ein bisschen mehr Detail.

Was passiert zwischen Quelldatei und ausführbarer Datei? Bisher haben wir gesagt, Die Quelldatei wird kompiliert und am Schluss haben wir ein Programm. Und das alles macht der Compiler.

Der Compiler selber besteht aber aus mehreren Schritten wieder. Und da zoomen wir hier jetzt mal ganz kurz ein bisschen rein. Und zwar ist der erste Schritt der Präprozessor.

Der Präprozessor analysiert einfach nur den Text und nimmt etwas Textersatz vor. Die Ausgabe ist wieder ein Text. Die Ausgabe ist wieder ein gültiger C-Quell-Code, der aber vielleicht ein bisschen anders aussieht als der Original-C-Quell-Code. Das kann mal sein, aber muss nicht so sein.

Man kann, auch der C-Compiler kann Kommentare noch handhaben. Ich glaube, das ist einstellbar, ob der Pre-Prozessor die Kommentare rauslöschen soll oder nicht. denn es macht manchmal sinn die kommentare nicht rauszulöschen an dem stadium wenn man sich nämlich das ergebnis des prozesses anschauen will man kann sich die ausgabe des prozesses anzeigen lassen und dass da findet man natürlich erheblich besser durch wenn die kommentare noch drin sind das werden wir irgendwann auch noch machen im lauf dieser lehrveranstaltung um zu sehen was da passiert dann kommt der eigentliche compiler der eine assembler datei erstellt Und der Assembler, zu guter Letzt, übersetzt den Assembly-Code, der menschenlesbar ist, dann in den Objekt-Code, der, wenn er abgespeichert wird, unter der Endung.o abgespeichert wird. Und dieser Objekt-Code enthält Maschinen-Code, der vom Prozessor ausführbar ist. Aber es ist noch kein vollständiges Programm.

Da fehlen zum Beispiel andere Programmteile, die in anderen.o-Dateien abgelegt sind und Bibliotheksfunktionen, die zum Beispiel von der Standardbibliothek, der C-Standardbibliothek bereitgestellt werden, auf die wir auch noch zu sprechen kommen werden. Ein Beispiel für eine solche Funktion ist diese Printf-Funktion. Printf ist eine Funktion und kein Konstrukt der Sprache C selber. Was ist der Unterschied? Int ist ein Schlüsselwort, void ist ein Schlüsselwort, return ist ein Schlüsselwort.

Das sind Schlüsselwörter, die zur Sprache C gehören. Printf ist kein Schlüsselwort. sondern der Name einer Funktion.

Diese Funktion kann überall definiert sein. Ihr könnt selber eine Funktion schreiben, die printf heißt. In der Regel werdet ihr aber die Funktion printf verwenden, die in der C-Standard-Bibliothek bereitgestellt wird. und die C-Standard-Bibliothek ist einfach eine Bibliothek von Funktionen, die euch zur Verfügung stehen, um euer Leben einfacher zu machen und unterscheidet sich aber ansonsten, also außer dass sie zum C-Standard gehört, unterscheidet sich in nichts von anderen Bibliotheken, die ihr selber schreiben könnt. Also die wurde auch in C programmiert und übersetzt und so weiter.

Man kann aus Maschinensprache wieder zurückkompilieren. Also man kann leicht zwischen Maschinensprache und Assembly hin und her übersetzen, aber man kann nicht mehr von Assembly in C zurückübersetzen oder in eine andere Hochsprache. Das geht nicht. Assembly Code großer Programme ist sehr schwer für Menschen zu verstehen.

Es gibt ja keine Kommentare, keine Struktur da drin, die irgendwelche Anhaltspunkte dazu gibt, was passiert, außer vielleicht ein paar Zeichenketten wie Hello World, die auch irgendwo umklappen. Quelltext im ausführbaren Programm abgelegt sein muss. Deswegen sind maschinenlesbare Programme für Menschen sehr schwer zu verstehen und darauf bauen gewisse Geschäftsmodelle auf.

Ich kann nicht einfach eine Textverarbeitung nehmen und dekompilieren und dann den Quellcode verändern und meine eigene verbesserte Textverarbeitung publizieren. Geht nicht. Okay, also wir haben jetzt in den.o-Dateien Maschinencode, also das Ergebnis des eigentlichen Compilers, der vom Assembly-Code dann in Maschinensprache übersetzt wurde.

Und ein Programm besteht jetzt aus einer Sammlung von verschiedenen.o-Dateien und Bibliotheksfunktionen, die wieder aus verschiedenen Bibliotheken zusammengesucht werden können. Und diese Sammlung muss irgendwie verbunden werden, um ein Programm zu erzeugen. Und verbinden heißt auf Englisch to link und deswegen heißt das Programm, der diese Operation ausführt, Linker. Okay, also das ist das, was hier passiert.

Mit dem Linker als gesonderten Schritt werden wir noch zu tun haben später, mit dem Assembler eigentlich nicht. Und es gibt eigentlich auch keinen Grund, warum der Compiler erst eine menschenlesbare Assembly-Datei erzeugen sollte, die dann anschließend in Maschinensprache assembled wird. Und der Schritt ist auch nicht unbedingt ein separater in der Praxis.

Der Präprozessor ist dagegen tatsächlich immer ein separater Schritt und der Compiler ist ein separater Schritt und der Linker ist auch immer ein separater Schritt. Okay, hier haben wir jetzt wieder dasselbe Beispielprogramm und zwar deswegen, weil wir uns jetzt wirklich Zeile für Zeile anschauen wollen, was hier passiert. Also, Erklärung zu 1, daher diese 1., 2., 3. in der ersten Spalte, die nicht zum C-Code gehören.

Das sind Kommentare. Kommentare sind nicht ausführbarer Code, sondern nur für den Menschen gedacht. Nur im Sinne von ausschließlich für den Menschen gedacht, aber ganz wichtig. Und es gibt diese beiden Formen der Syntax, nämlich slash Stern bis Stern slash oder die einzeilige Form.

Okay, wichtig zu wissen, ein Kommentar beginnt mit Slash Stern und endet am nächsten Slash Stern. Daraus folgt, diese Art von Kommentaren lassen sich nicht verschachteln. Okay, Licht auf der Hand.

Ich schreibe einen Kommentar. Was weiß ich? Ich schreibe einen Kommentar. Kommentar und so weiter. Okay.

Dann steht hier ein bisschen C-Code. Und dann steht hier ein bisschen C-Code. Okay. Und dann sage ich, hier ist irgendwo ein Fehler drin.

Ich will erstmal an anderen Stellen im Programm weitermachen. Also bevor ich hier zukomme, kommentiere ich das hier erstmal aus. Und kümmere mich darum später. Okay.

Klappt nicht. Denn jetzt haben wir einen Kommentar, der fängt hier an und endet hier. Dieser Code wird kompiliert und hier haben wir einen Syntaxfehler. Okay?

Um, eine Sekunde, um Programmteile zwischenzeitlich zu deaktivieren, kommentiert man sie nicht aus, sondern verwendet Präprozessorkonstrukte. Darauf werden wir später zu sprechen kommen. Ah, gute Frage.

Die Antwort ist nein, aber die Frage ist trotzdem gut. Man kann die Frage so stellen, warum steht hier ein Stern? Nicht wahr?

Ja, danke der Nachfrage. Das hat rein ästhetische Gründe. Da muss kein Stern stehen, aber es sieht einfach gut aus.

Ja, lacht nicht. Programmierstil inklusive solcher Details ist extrem wichtig. Stellt euch vor, ihr lest euer Lieblingsbuch, Dicker Wälzer. Ihr lest es schnell, weil es einfach super spannend ist. Aber dieses Buch ist von Hand geschrieben.

Nicht ihr selber, sondern irgendwer hat das von Hand geschrieben. Wird das Spaß machen, das zu lesen? Das würde keinen Spaß machen, das wäre viel zu anstrengend, das zu entziffern. Deswegen ist das wichtig, dass Bücher, die wir kaufen, schön aussehen, schön sauber aufgeschrieben sind, mit sehr konsistentem Blocksatz, links und rechts bündig und Absätze eingerückt und zwischen Absätzen immer genau der gleiche Abstand und so weiter. Jeder Text in genau der gleichen Schriftart, außer, was weiß ich, wörtliche Rede, die auch in ihrer eigenen Schriftart auftaucht.

und Zwischenüberschriften, die jeweils ihre eigene, aber durchgehend konsistente Schriftart haben. Das macht Lesen leicht. Genauso ist es auch mit Programmtext. Programmtexte werden wie gesagt hauptsächlich von Menschen gelesen und sie sollten so leicht wie möglich lesbar sein. Deswegen sollte Struktur und Inhalt immer übereinstimmen und der Stil, den er verwendet, sollte immer konsistent sein.

Da werden wir auch pingeligst darauf achten. Am Anfang wird euch das zu pingelig vorkommen. Und das hat gute Gründe.

Wenn ihr Leseanfänger seid, ihr habt gerade erst erklärt bekommen, wie der Buchstabe A aussieht. In Handschrift oder in Druckschrift. Dann ist es egal, ob ihr ein handgeschriebenes Buch lest oder ein gesetztes Buch. Denn ihr geht das Buchstabe für Buchstabe durch.

Ihr habt noch keine Erfahrung im Lesen. Lesen besteht für euch darin, Buchstabe für Buchstabe durchzulesen. zu gehen und da achtet überhaupt nicht auf schriftart und solche nebensächlichkeiten okay das dauert einfach lange und genauso ist das auch wenn er anfangen zu programmieren am anfang stehen hier hieroglyphen wie Hash include, so eine seltsame, so ein kleiner als Zeichen und so weiter und ihr lest das durch und guckt das Zeichen an, versucht zu verstehen, was das bedeutet.

Und es ist egal, ob das, ob zwischen dem Hash ein Leerzeichen ist, zwischen Hash und include ein Leerzeichen ist oder nicht. Wenn ihr aber erfahrene C-Programmierer seid eines Tages, dann werdet ihr C-Code lesen, wie ein erfahrener Leser ein Buch liest. Dann werdet ihr mit einem Blick eine ganze Funktion überblicken und sagen, ich verstehe, was es macht und wie und warum. Wenn der Code-Stil, wenn der Schreibstil, der Codierungsstil nicht sauber und einheitlich ist, dann wird euch das extrem stören, weil euch das eben daran hindert, sofort zu überblicken, was eine Funktion macht.

Und genau deswegen wird an dieser Stelle... in der ersten Spalte immer einen Stern geschrieben, weil sich hier ein visueller Zusammenhang ergibt, der auf den ersten Blick klar macht, das hier ist alles ein zusammenhängender Kommentar. Ganz oben zum Beispiel, da haben wir zwei Kommentare.

Das erste C-Programm und darunter Einbinden von und so weiter und so fort. Das sind zwei Kommentare, die nichts miteinander zu tun haben. Völlig verschiedener Inhalt. Und die sind auch visuell getrennt. Für einen Compiler wäre das egal.

Für einen Compiler könntet ihr auch dieses letzte Stern Slash hier ganz oben entfernen und dieses hier entfernen und dann habt ihr nur noch einen Kommentar. Genau dasselbe. Warum sind da zwei Kommentare? Aus genau diesem Grunde, der Leser sieht sofort, es sind zwei getrennte Kommentare, die enthalten verschiedenen Inhalt.

Also wenn ihr C-Code schreibt, stellt euch vor, ihr seid ein Setzer in einem Verlag, der versucht ein Buch richtig schön zu setzen. Okay, wir werden auch noch mehr später über Programmierstil reden. Okay, was ist das Nächste? Wir haben jetzt über die Kommentare gesprochen, jetzt kommen hier diese beiden Hash-Include-Direktiven.

Und das sind Präprozessor-Direktiven. Die werden also, also alles, was mit einem Hash anfängt, wird vom Präprozessor interpretiert und ersetzt. Und HashInclude macht eigentlich genau das, was die Direktive besagt. Die holt sich von irgendwoher eine Datei, die heißt stdio.h Das heißt, steht für standard input output Punkt header und fügt den Inhalt dieser Datei eins zu eins an dieser Stelle ein, an der Stelle des hash include Befehls. Und das Ganze ist rekursiv, also standard IO.h enthält wieder weitere hash include Direktiven und die werden in diesem Arbeitsschritt auch alle aufgelöst.

Okay, bis die Rekursion irgendwo endet. Und genauso mit der Funktion standardlibrary.h. Also das nächste heißt standardlibrary.h und darin stehen auch Sachen, die wichtig sind. Was steht da jetzt drin? Die Headerdatei standardio.h enthält Deklarationen unter anderem von Funktionen, die in der C-Standard-Bibliothek zur Verfügung gestellt werden.

die in der C-Standard-Bildung zur Verfügung gestellt werden, ist die Funktion printf. Und wir verwenden ja diese Funktion printf hier in Zeile 4. Und um zu wissen, wie diese Funktion aufgerufen werden muss, braucht der Compiler Zugang zu dieser Deklaration. Und diese Deklaration findet sich in der Datei standard.io.h. Und deswegen wird diese Datei standard.io.h an dieser Stelle eingelesen. Der linker holt sich nur die Funktionen raus, die tatsächlich genutzt werden.

Und selbst das ist noch eine Vereinfachung. Auf die Details kommen wir auch gegen Ende der Vorlesung noch zu sprechen. Die Vereinfachung besteht im Prinzip darin, dass Printf auf einem modernen Rechner nur ein einziges Mal im Speicher steht, auch wenn 50 Programme darauf gleichzeitig laufen, die Printf aufrufen. Okay, also jetzt wissen wir, warum hier standard.io.h hier inkludiert wird. Fragen dazu?

Warum wird standard.lib.h inkludiert? Hier in Zeile 5 steht die Anweisung return exit success und exit success ist und Ich habe vorhin gesagt, es sei eine Konstante, da habe ich eigentlich gelogen, eigentlich ist es gar keine Konstante, sondern es ist ein Makro. Das heißt, es ist Text, der durch den Präprozessor durch anderen Text ersetzt wird. Und durch welchen Text dieser Text Exit Success ersetzt wird, steht in der Datei Standard Library. Okay?

Dieser Text ist einfach die Zahl 0. Übrigens. Warum gehen wir da diesen Umweg über den Text Exit Success und den Pre-Prozessor? Lesbar. Genau. Das ist ein Grund.

Dann wissen wir, warum da eine 0 zurückgegeben wird. Nein, mit der Geschwindigkeit hat es nichts zu tun. Das Kompilieren dauert sogar länger, weil ich eine zusätzliche Header-Datei einlesen muss.

Ganz genau. Und das ist auch ein wichtiger Grund. Also es gibt hier zwei wichtige Gründe, würde ich sagen.

Das eine ist die Lesbarkeit. Wenn man eine 0 hinschreibt, kann man sich fragen, warum 0? Warum nicht minus 5?

Die Antwort ist, die 0 steht an dieser Stelle für eine erfolgreiche Ausführung der Funktion. Das ist der eine Grund. Dann kann man sich fragen, warum steht eine Null für eine erfolgreiche Ausführung der Funktion und nicht irgendwas anderes wie 1 oder true oder was weiß ich. Antwort darauf, das ist einfach Unix-Tradition. In Unix heißt es, dass man eine Null für eine erfolgreiche Ausführung der Funktion hat.

ein Rückgabewert von 0, alles okay. Aber unter anderen Systemumgebungen gibt es vielleicht andere Konventionen. Und wenn ich jetzt ein portables Programm schreiben will, das überall gleich funktioniert, dann verwende ich verwende ich diesen Umweg über den Präprozessor, denn auf dem System, wo 1 Success heißt und nicht 0, da steht einfach in der systemeigenen Datei standardlabel.h eine 1 drin anstatt einer 0. Aber mein Programm muss sich nicht ändern.

Das sind die beiden Gründe. Lesbarkeit und Portabilität. Also Portabilität bedeutet, dass derselbe Code unter verschiedenen Umgebungen, auf verschiedenen Architekturen und so weiter eingesetzt werden kann, ohne Änderungen.

Okay, Fragen dazu? Gehen wir nochmal in den Zusammenhang zurück. Hier ist das Programm.

Wir haben jetzt also die Kommentare und die Präprozessor-Direktiven abgearbeitet. Als nächstes haben wir hier die Definition der Funktion Main. Main ist zunächst nur einfach eine Funktion. Also ihr seht hier, wie eine Funktion definiert wird. Sie hat einen Rückgabewert, in diesem Fall int für ganze Zahl, einen Namen, hier main.

und eine Argumentenliste zwischen runden Klammern. Wenn diese Argumentenliste leer ist, dann schreibt ihr da void rein, und wenn eine Funktion keinen Rückgabewert hat, dann ist es genau genommen keine Funktion, sondern eine Prozedur, aber das ist in der Sprache C egal, dann braucht sie trotzdem einen Rückgabewert, syntaktisch, und dieser Rückgabewert heißt dann, vielleicht kann das jemand erraten, Void, genau. Genau wie die leere Argumentenliste.

Wenn eine Funktion keinen Rückgabewert hat, dann deklariert er sie void. An dieser Stelle gibt es doch noch einen Spezialfall. Diese Funktion heißt zwar einfach main, sie könnte auch irgendwie anders heißen, aber in C gibt es eine Konvention und die besagt, dass ein Programm mit der Funktion main anfängt. Das heißt, der Linker erzeugt einen Startup-Code, der das Programm einrichtet und so weiter, dass es laufen kann und anschließend die Funktion Main aufruft. keine Funktion main enthält, dann wird der Linker deswegen einen Fehler anzeigen.

Könnt ihr mal ausprobieren. Einfach das Programm hier eintippen und kompilieren laufen lassen und dann main umändern in irgendwas anderes und dann wieder kompilieren und linken. Und dann werdet ihr sehen, dass das nicht geht, weil die Funktion main fehlt. Also main ist eigentlich eine Funktion wie die andere, außer dass sie einen besonderen Namen hat.

Und das ist dieser Name main, der konventionellerweise... in C die Funktion bezeichnet, die den Eintrittspunkt eures Programmes darstellt. Okay?

Okay. Dann noch ein bisschen Syntax, also das ist hier der Kopf der Funktion und der Inhalt der Funktion befindet sich hier zwischen geschweiften Klammern. Diese geschweifte Klammer besagt, hier ist die Funktion zu Ende und diese besagt, das ist halt die zugehörige öffnende Klammer.

So definiert man eine Funktion mit Rückgabewert, Name, Argumentliste zwischen runden Klammern. Danach folgt ein Block zwischen geschweiften Klammern und alles, was dazwischen steht, ist der Code, der zu der Funktion gehört. Und was für ein Code ist das in diesem Fall?

An erster Stelle haben wir hier diesen Funktionsaufruf printf hello world. Also wie bereits gesagt, ist printf der Name einer Funktion und der Compiler weiß, dass diese Funktion existiert. Weil wir vorher per include standardio.h diese Deklaration dem Compiler zugänglich gemacht haben.

Okay. Wer genau aufgepasst hat, hat gemerkt, dass ich zwischen Deklaration und Definition unterscheide. So muss man unterscheiden.

Die Deklaration sagt dem Compiler, was es gibt. Und die Definition sagt dem Compiler, wie das, was es gibt, aussieht. Also in der standard.io.h stehen jede Menge Deklarationen drin. Eine davon deklariert die Funktion printf.

Man sieht im Compiler, wie diese Funktion printf aufgerufen werden muss. Aber definiert haben wir diese Funktion printf nirgendwo. Und das brauchen wir auch nicht, denn sie wird von der C-Standard-Bibliothek bereitgestellt. Und der Compiler weiß...

wie er sie dort findet. Print F heißt Print Formatted, das ist eine sehr mächtige Funktion. Mit diesem Formatting werden wir noch sehr viel zu tun haben im Laufe der Lehrveranstaltung. Hier haben wir den allereinfachsten Fall, wir geben einfach eine Zeichenkette und diese Zeichenkette wird, so wie sie drin steht, ausgegeben. Mit einer Ausnahme.

Dieses Backslash n, wie alle Backslash-irgendwas-Sequenzen innerhalb von Zeichenketten, sagen dem Compiler, dass an dieser Stelle ein Sonderzeichen eingefügt werden soll. Und da gibt es eine Reihe von Konventionen, was wir... Zeichen wie kodiert sind und eine, die ihr sicherlich am häufigsten verwendet werdet, ist die Sequenz backslash n, die besagt, dass anstatt des backslash n ein Zeilenumbruch ausgegeben werden soll.

Zeichenketten stehen immer zwischen diesen doppelten Gänsefüßchen. Dann endet diese Anweisung mit einem Semikolon. Warum?

Weil C-Anweisungen mit einem Semikolon enden. Okay, jedenfalls einfache Anweisungen. Keine Blockanweisung, kommen wir später drauf.

Okay, Fragen dazu? Dann haben wir nur noch eine Anweisung, nämlich das Return-Exit-Success, wiederum mit einem Simikon abgeschlossen. Haben wir, glaube ich, schon besprochen.

Hier bei Printf? Ja. Genau, warum steht die Argumentliste von Printf zwischen runden Klammern? Ist das die Antwort?

Ja, oder anders ausgedrückt, der Compiler weiß, dass es sich bei printf um eine Funktion handelt, die hier aufgerufen wird, genau deswegen, weil auf den Namen der Funktion die öffnende runde Klammer folgt. Das ist genau das, woran der Compiler erkennt, dass es sich hier um einen Funktionsaufruf handelt. Also, gute Frage. Noch mehr gute Fragen.

Oder dumme Fragen, könnt ihr auch stellen. Ah, jetzt melden sich welche. Doch, wir haben das Exit Success, was durch den Präprozessor durch eine Null ersetzt wird. Genau.

Die Print-Funktion hat aber verstanden. Ah, ja, okay. Jetzt habe ich deine Frage verstanden.

Also Printf ist eine Funktion. Diese Funktion hat tatsächlich auch einen Rückgabewert. Aber wir verwerfen den an dieser Stelle einfach.

In der Regel solltet ihr euch genau informieren, was die Rückgabewerte von Funktionen bedeuten und dann jedes Mal genau entscheiden, was ihr damit macht. An dieser Stelle, ganz häufig, handelt es sich um Fehlerindikatoren. Die sollte man nicht einfach so verwerfen.

Außer in Fällen, wo man wirklich keine Möglichkeit hat zu reagieren. An dieser Stelle liefert Printf tatsächlich nützliche Werte zurück. Aber wir haben in diesem Programm keinen Nutzen dafür. Also verwerfen wir den Rückgabewert einfach. Also es war doch eine gute Frage.

Ah, noch eine gute Frage. Das wäre dann sogenannter toter Code, weil er nämlich nicht erreichbar wäre. Und da wird der Compiler normalerweise warnen.

Das ist gültig, syntaktisch und semantisch, also gültiger C-Code, aber es ist sinnloser C-Code. Eine Funktion kann durchaus mehrere Return Statements haben und das ist häufig der Fall bei bedingten Verzweigungen. Falls dies passiert, mache ich das, falls etwas anderes passiert, gehe ich da lang und dann gibt es oft Möglichkeiten von mehreren alternativen Punkten zurückzuspringen innerhalb der Funktion. Also das ist durchaus üblich. Noch mehr Fragen an dieser Stelle?

Okay, dann haben wir damit dieses Beispielprogramm komplett abgearbeitet. Wenn es dazu dann keine weiteren Fragen mehr gibt, dann machen wir jetzt weiter mit ein paar langweiligen Details. Nämlich, welche Zeichen darf man jetzt hier verwenden? Diese Frage ist erstaunlich schnell beantwortet.

Die stehen nämlich alle hier. Wir können die 26 Buchstaben des Alphabets verwenden, und zwar als Großbuchstaben und als Kleinbuchstaben. Und die sind unterschiedlich.

C unterscheidet zwischen Groß-und Kleinschreibung. Also ihr könnt jetzt nicht einfach hergehen und sagen, und Printf großschreiben oder so. Dann wird es ein anderer Funktionsname. dazu gibt es auch konventionen die mit dem programmierstil zusammenhängen wie wendet ihr groß und kleinschreibung intelligent an um euer programm lesbarer zu machen und so weiter dann könnt ihr die dezimalziffern verwenden und dann gibt es 29 Sonderzeichen, Grafiksymbole, die ihr verwenden könnt und die sehr unterschiedliche Bedeutungen haben. Die sind einfach mal alle hier hintereinander geschrieben, aber die bedeuten sehr verschiedene Dinge.

Das Ausrufezeichen hat verschiedene Bedeutungen, wird als Operator verwendet. Das doppelte Anführungszeichen haben wir schon gesehen als Begrenzer von Zeichenketten. Und das ist tatsächlich der einzige Zweck. Prozent ist ein Operator und ist ein Operator, der auch verschieden verwendet werden kann und spielt bei verschiedenen Operatoren eine Rolle so rumgesagt der Schrägstrich hat eine ganze Menge von verschiedenen Bedeutungen, eine haben wir kennengelernt nämlich als Teil der Kommentarsyntax aber es gibt andere Verwendungen dafür runde Klammern haben auch verschiedene Verwendungen eine davon haben wir kennengelernt Zwei davon haben wir genau genommen schon kennengelernt, nämlich welche?

Genau, damit können wir beide Verwendungen umschreiben, nämlich die beiden Verwendungen müssen wir unterscheiden zwischen der Deklaration und Definition auf der einen Seite einer Funktion und dem Aufruf einer Funktion. Und in beiden Fällen umschließt, umschließen, runde Klammern, die Argumentliste. Okay?

Ja? Das hat mir entscheidend nicht mitgekommen. Ja? Ah, man kann das Void weglassen, aber es bedeutet dann was anderes.

Wenn man einfach nur eine leere Parenthese schreibt, dann bedeutet das, ich mache keine Angaben darüber, was dazwischen kommt. Und das ist in der Regel nicht gut. Man will immer so eindeutig wie möglich sein, um Fehler zu finden. Okay, die runden Klammern haben noch andere Verwendungen.

Eckege Klammern haben auch verschiedene Verwendungen. Die geschweiften Klammern, die haben auch verschiedene Verwendungen. Und eine davon haben wir schon kennengelernt, nämlich als Begrenzer des Rumpfes einer Funktion.

Okay. Backslash haben wir auch schon kennengelernt, nämlich zum Escapen von Sonderzeichen oder zum Einleiten von Sonderzeichensequenzen in Zeichenketten. Das Fragezeichen gibt es auch in C, ist Teil eines Operators. Das Gleichheitszeichen spielt bei verschiedenen Operatoren eine Rolle. Das einfache Anführungszeichen.

hat auch eine Rolle zum Begrenzen von Zeichen, aber nicht Zeichenketten. Das Hash-Symbol haben wir kennengelernt als erstes Zeichen einer Präprozessor-Direktive. Und das spielt auch noch bei anderen Formen von Präprozessor-Direktiven eine Rolle. Plus spielt bei verschiedenen Operatoren eine Rolle, genauso mal. Die Tilde ist ein Operator, Minus ähnlich wie Plus.

Der Unterstrich ist ein sehr besonderes Zeichen, extrem kompliziert. Solltet ihr euch aufschreiben und das Kopfkissen legen. Habt ihr es?

Der Unterstrich wird genauso verwendet wie ein Zeichen des Alphabets. Das ist alles. Also überall dort, wo ihr ABC oder sonst was benutzen könnt oder ein Zeichen des Alphabets benutzen könnt, überall und genau dort könnt ihr auch den Unterstrich verwenden.

Also stellt euch einfach den Unterstrich vor als einen 27. Buchstaben, der in groß und klein ist. schreibung genau gleich aussieht punkt hat verschiedene verwendungen doppelpunkt wozu wenn man doppelpunkt für labels hauptsächlich kann man auch darauf zu sprechen die mikroon schließt einfacher anweisung ab, Komma, Komma noch darauf zu sprechen, das Pipe-Symbol ebenfalls und größer und kleiner oder kleiner und größer, um in der Reihenfolge zu bleiben, hat auch verschiedene Bedeutungen. Eine Bedeutung haben wir schon kennengelernt, was war das?

Genau, bei den Präprozessordirektiven, bei den Hash-Include-Präprozessordirektiven steht der Name der System-Header-Dateien zwischen kleiner und größer. Also da spielen sie quasi die Rolle von Spitzenklammern. Genau. Und dieses Dachsymbol hat ebenfalls eine Funktion als Operator. Darüber hinaus gibt es Leerzeichen, die eine Bedeutung haben.

Also ganz normal einfache Leerzeichen. Tabulatorzeichen, Zeilenumbruch und so weiter, neue Seite, die sind übrigens alle äquivalent. Leerzeichen ist Leerzeichen. Und die einzige Funktion des Leerzeichens besteht darin, dem Compiler klar zu machen, dass ein neues syntaktisches Element beginnt auf der anderen Seite des Leerzeichens.

Das habe ich wieder gelogen. Eine noch wichtigere Rolle oder genauso wichtige Rolle des Leerzeichens ist es, der Leerzeichen ist es, dem menschlichen Leser den Text möglichst präsentabel zu gestalten. Das ist alles, andere Zeichen sind nicht erlaubt.

Keine Äs, Üs, Sz und solche Geschichten. Zeit ist um, Folien sind um, perfektes Timing, aber es sind noch Fragen. Kann man Ä und Ü in Kommentare schreiben?

Das kommt drauf an und immer wenn es drauf ankommt, heißt es nein. Okay, haltet euch lieber an diese Liste hier. C stammt aus einer Zeit, bevor es Unicode gab und mit dem Erbe müssen wir jetzt leben.

Bleibt bitte noch sitzen, ich habe die Vorlesung noch nicht beendet. Ja, das ist eine andere Version derselben Frage. Es kommt darauf an, um Umlaute in C korrekt zu verwenden, oder so gesagt, die korrekte Verwendung von Umlauten in C ist recht komplex. kompliziert.

Wenn du jetzt Umlaute in Zeichenketten einbaust, dann hängt das Ergebnis vom Compiler und vom Betriebssystem und der ganzen Umgebung ab. Deswegen solltet ihr das nicht machen, sondern euch wirklich an diese Konventionen halten, also an diese Definition der Sprache C halten. Das ist überhaupt generell eine große Gefahr in C.

Es gibt Dinge, die funktionieren in C, obwohl sie nicht definiert sind. Aber das sind dann Dinge, deren Funktion nicht garantiert ist. Und davon solltet ihr euch fernhalten. Ihr solltet euch grundsätzlich nur auf das beschränken, was in C wirklich definiert ist.

Alles andere ist nur eine Quelle von Fehlern und Problemen. Man kann Umlaute verwenden in C, aber nicht, indem man sie einfach in Quelltext schreibt. Und darauf werden wir im Rahmen dieser Vorlesung auch nicht mehr zu sprechen kommen. Ja?

Da fehlt was. Aber ich sehe jetzt auch nicht auf den ersten Blick, was fehlt. Aber es fehlt bestimmt was. Ja, es gibt noch Steuerzeichen, die nicht unbedingt white space sind in dieser Liste.

Ja, noch eine Frage? Nein, komplett bedeutungslos. Ein White Space Zeichen ist einer beliebigen Mischung beliebig vieler White Space Zeichen äquivalent. Noch mehr Fragen? Dann sehen wir uns nächste Woche zur selben Zeit am selben Ort.