Forex Broker Vergleich 2019


Diese Frage ergibt sich schon einmal aus dem Begriff und bei dem Begriff Börse handelt es sich in der Erklärung um einen Marktplatz für Bitcoin. Kompetenz auf allen Ebenen zeichnet den Online Experten aus.

Grenzen der technischen Sicherheit bei OpenPGP


Die hier dargestellten Informationen wurden nach besten Wissen und Gewissen erstellt, dennoch kann sich ein Fehler eingeschlichen haben oder sich die Sachlage ändern.

Inländischer oder ausländischer Fonds? Zu Beginn muss geklärt werden, ob es sich um einen inländischen oder ausländischen Fonds handelt. Warum ist diese Unterscheidung wichtig? Darum kümmert sich der inländische Broker, welcher das für Sie steuereinfach abwickelt.

Daher muss nun die Frage geklärt werden, ob es sich um einen Meldefonds oder um einen Nicht-Meldefonds handelt geklärt werden. Der ETF kann genauso im Ausland beheimatet sein. Diese automatische Abrechnung der Kapitalertragsteuer geschieht aber nur bei inländischen Online Brokern wie z.

Ob ein Fonds bzw. Im Ergebnis können Sie dann ersehen, um welche Fondsart dass es sich handelt, welche Zahlstelle in Österreich es gibt und wer der steuerliche Vertreter in Österreich ist und seit wann der Vertrieb in Österreich zugelassen ist.

Die verschiedenen Abfragemöglichkeiten können hier gefunden werden:. Dies erfolgt bei einem steuereinfachen Broker mit Sitz oder Niederlassung in Österreich vom Broker selbst, bei einem nicht steuereinfachen Broker hat man sich als Anleger darum zu kümmern.

Der Betrag von dem die Kursgewinnsteuer errechnet wird findet sich durch die Rechnung:. Andere Kosten oder Gebühren dürfen natürlich auch beim ETF nicht dazu verwendet werden den Kaufkurs künstlich zu erhöhen bzw. Das Finanzamt informiert hier:. Das Abzugsverbot gilt auch wenn die Regelbesteuerungsoption ausgeübt wird.

Um den Verlustausgleich kümmert sich der inländische Fonds selbst. Handelt es sich um einen Nicht-Meldefonds, so erfolgt eben keine steuerliche Meldung und es ergibt sich so eine pauschale steuerliche Belastung. Ein physisch, replizierender ETF kauft sich die Wertpapiere tatsächlich. Beim physisch replizierenden ETF fallen bereits während der Laufzeit ausschüttungsgleiche Erträge an, welche Jahr für Jahr versteuert werden müssen.

Vergleicht man die Depotgebühren und die Orderkosten von inländischen und ausländischen Brokern so wird man schnell dazu verleitet bei einem ausländischen Broker Kunde zu werden. Das darf man auch. Aber Achtung, denn der ausländische Broker kümmert sich keineswegs um die Steuerangelegenheiten und so ist es jedem Brokerkunden selbst überlassen seine Wertpapierinvestments in seine jährliche Einkommensteuererklärung korrekt aufzunehmen. Dies ist nicht ohne und ein eventueller Vorteil bei den Kosten und Gebühren des ausländischen Brokers im Vergleich zum inländischen Broker ist mit der Beauftragung eines Steuerberaters auch schnell wieder dahin.

Kümmert man sich selbst um die Steuerangelegenheiten, so muss man die Zeit aufrechnen, ob es einem das tatsächlich Wert ist. Vergessen sollte man die Versteuerung dieser Erträge aus dem Ausland nicht, denn man hintergeht so Steuern und dies ist keinesfalls ein Kavaliersdelikt.

Dazu kommt natürlich auch noch die Tatsache, dass das Finanzamt in Österreich durch den Common-Reporting-Standard natürlich voll im Bilde ist, wo im Ausland wir ein Depot besitzen und welche Papiere dort liegen.

Vergisst man zu versteuern, wird das Finanzamt sicherlich einen bald daran erinnern, dass hier doch etwas zu versteuern wäre. Seien Sie steuerehrlich und agieren Sie nicht am Finanzamt vorbei! Wenn Sie die unterschiedlichen Broker miteinander vergleichen möchten, so werfen Sie doch einen Blick auf den Online Broker Vergleich, welcher Ihnen zeigt, wie hoch denn die Kosten für die Depotführung und für die Order von Wertpapiere sind.

Besitzt man einen Fonds so wird es im ersten Jahr wohl so sein, dass die depotführende Bank die Steuerschulden der ausschüttungsgleichen Erträge innerhalb der ersten 12 Monate verrechnen wird, obwohl man den ETF noch gar keine 12 Monate besessen hat.

Bedeutet im Klartext, dass man hier Steuern bezahlt für einen Zeitraum, in dem man den ETF noch gar nicht besessen hat.

Im extremsten Fall ist es so, dass Sie den Fonds erst vor wenigen Tagen gekauft haben und Sie die Steuerschulden der vorangegangenen 12 Monate bezahlen müssen.

Haben Sie Ihren Fonds bei einem ausländischen Broker gekauft, so müssen Sie sich selbst darum kümmern, dass bereits im ersten Jahr korrekt die ausschüttungsgleichen Erträge Ihres Meldefonds versteuert werden. Einzig auch hier wieder der extremste Fall, Sie verkaufen kurze Zeit nach der Steuerabrechnung.

Die depotführende, inländische Bank verrechnet die Steuer für die ausschüttungsgleichen Erträge im Laufe des Jahres und zieht diese Steuer vom Verrechnungskonto des Depotinhabers ab. Das bedeutet, dass das Verrechnungskonto stets mit einem passenden Betrag gefüllt sein soll, damit die Begleichung der Steuerschulden erfolgen kann, ohne dass man ins Minus rutscht und dafür Sollzinsen bezahlt.

Also unbedingt darauf achten, dass genug am Verrechnungskonto vorhanden ist. Ein kleines Dilemma, welches aber jeder für sich lösen sollte. In der folgenden Tabelle versucht Broker-Test. In einem eigenen Beitrag wird erörtert wie das mit den ausschüttungsgleichen Erträgen nun genauer funktioniert. Wie kann man herausfinden, wie hoch diese sind, wann gemeldet wurde und wie die Versteuerung funktioniert.

Dazu sollte man sich ein wenig Zeit nehmen und einen kühlen Kopf bewahren:. Nutzen Sie die Kommentarfunktion dieser Seite und kommen wir ins Gespräch! Bei der Suche auf justetf. Christoph, ich habe deinen doppelten Kommentar gerade gelöscht. Denke einmal genügt vollkommen. Hier findet sich die Information: Jedes EU-Land hat dies für sich anders geregelt. Begriffsdefinitionen im Rahmen der Klassifizierung von Anlagefonds: Ok, soweit ich das verstehe geht es hier also um die Frage, wessen Steuersatz bei der Zinsabschlagsteuer anzuwenden ist.

Kann man pauschal sagen ob eine der Varianten steuerlich günstiger ist? Ich verstehe deine Frage nicht. Es gilt die KESt in Österreich abgezogen. Hat jemand Erfahrungen mit Flatex und wiviel Tage davor legt ihr euch dort Geld für die Steuern beiseite? Lg Daniel und vielen Dank im Voraus. Flatex und es ist bei allen anderen Brokern genau so, bucht wenige Tage nach der Bekanntgabe durch den steuerlichen Vertreter die Steuerschulden ab.

Wie hoch das ist, wird sich zeitlich kaum bzw. Danke für deine schnelle Antwort! Ich möchte noch herausfinden wann die Steuer ca anfällt, da müsste es doch über meinen ETF Informationen geben. Ich habe auf Profiweb. Mit dem Wissen aus diesem Beitrag https: Excel-Vorlagen werden von Euch verwendet um die Kaufs- bzw. Eine handschriftliche Aufzeichnung bei sehr wenigen Buchungen ist ja noch vorstellbar aber eine Unterstützung mit Excel bzw.

Frag doch bei der Easybank direkt nach, die werden definitiv wissen und dir eine Antwort geben, die dich befriedigt. Alles andere sind nur Vermutungen. Wird bei einer derartigen Verschmelzung die Meldung automatisch übertragen oder komme ich ggf. Alternativ würde ich mich an die steuerliche Vertretung des ETFs hier in Österreich wenden, das wäre lt. Hallo Andreas, ich hab eine Frage.

Mir ist was ganz verrücktes passiert und die Bank lässt mich grad echt in der Luft hängen. Nun nach Geschäftsjahresabschluss wird mir unter dem Titel Ausschüttung ein Betrag abgebucht, der wesentlich höher ist als meine Ausschüttungserträge. Wir haben hier immer wieder Beispiele und Anfragen wie es denn sein kann, dass ein Ausschütter auch Ausschüttungsgleiche Erträge hat bzw.

Ja, das gibt es und kommt vor. So anscheinend auch bei deinem Fonds. Es ist schon richtig, dass als Bemessungsgrundlage Verkaufserlös minus Kaufwert gilt. Man sollte jedoch die Bewertung des Kaufwertes bei mehrmaligen Erwerb z. Finanzamt zu finden unter https: Hallo Andreas, Erstmal vielen Dank für den Überblick. Werde das erste Steuerjahr Ja ich hab gerade erst angegangen zu investieren trotzdem einen Steuerberater anstellen mir die Steuererklärung zu machen, da ich bei einen ausländischen Broker bin.

Später mach ich es vielleicht selbst, mal schaun. Hab mir bereits bevor ich es wusste einige Nichtmeldefonds ins Depot geholt und diese alle gestern wieder verkauft und durch Meldefonds ersetzt. Was mich einen Haufen an Nerven kostete war das Prüfen auf Profitweb. Ich habe nämlich auf Profitweb. Servus Maximilian, ich vermute, dass du das falsche Suchfeld verwendet hast, oder es liegt an deinem Browser. Es gibt auf Profitweb zahlreiche Suchmasken und man muss hier ordentlich aufpassen, dass man die korrekte findet.

Wichtig ist, dass man per Mausklick das Ergebnis anfordert, denn ein Enter hat keine Aktion zur Folge. Hallo, vorab tolle Seite! Oesterreichische Kontrollbank Aktiengesellschaft — https: Dies hat auch im April funktioniert, und die Steuer wurde entsprechend der Ausschüttung abgeführt. Ich finde ihn nämlich auf Profitweb. Hat mich am Anfang auch einen Haufen Nerven gekostet.

Sowas aber auch, ich dachte, ich habe dir bereits geantwortet, scheint aber nicht so gewesen zu sein. Hallo Andreas, vielen Dank für deine Antwort. Diese hat mir sehr geholfen. Flatex und österreichischer Meldefonds ist die sichere Seite, denn dann sollte alles soweit erledigt werden. Hey Clemens, ja, das ist die sichere re Seite.

Grundsätzlich ist es so, dass wir Anleger natürlich steuerpflichtig sind und Sorge tragen müssen, dass alles korrekt versteuert und abgeführt wird. Hey Clemens, würde an deiner Stelle immer im Bundesanzeiger nachschauen bei justetf klickbar — da sieht man viel besser, ob reiner Ausschütter oder mit Thesaurierungen!

Ich sehe es so als ob man sich hier auch durch die jährlichen Berichte klicken muss und bei den deutschen Daten sich durchackern muss. Hier so eine Beispielsliste, damit sich die anderen auch etwas vorstellen können: Oder sehe Ich das alles komplett falsch!? Servus Johann, also ich glaube du siehst das falsch bzw.

Ist es nicht so, dass für die Quellensteuer es entscheidend ist, aus welchen Ländern die Wertpapiere stammen die im ETF abgebildet sind? Fonds steht zwischen dem Anleger und den Quellensteuerstaaten aus denen die Wertpapiere stammen und dieser kümmert sich dann um das Zurückholen der Quellensteuer.

Ich glaube es ist besser, wenn du Rio hier fragst, wie er auf die Idee kommt. Gefühlt würde ich sagen, er vermischt hier paar Dinge. Seine Aussage für eine französische Aktie und deren Dividende würde ich zum Teil bejahen, für einen Fonds nicht. Wäre interessant, welche Quellen er hat.

Am besten aber einen berufenen Steuerberater fragen. Bitte korrigiere mich wenn dir ein Fehler auffällt. Servus Johann, hat ein wenig gedauert mit einer Antwort, habe ich anscheinend irgendwie übersehen, dein Kommentar.

Grundsätzlich stimme ich dir hier voll zu, würde aber dennoch aufpassen, ob es nicht auch bei einen ausschüttenden ETF nicht auch ausschüttungsgleiche Erträge gibt. Grundsätzlich nicht, weil das ja eben der Unterschied ist, doch glaube ich gelesen zu haben, dass es dennoch passieren kann auch vice versa, also Ausschüttungen beim Thesaurier.

Wie finde ich denn eigentlich heraus, ob ein ausschüttender ETF nun ausschüttungsgleiche Erträge hat oder nicht? Es gibt dort auch schon zahlreiche Kommentare von Gleichgesinnten. Ja und nein … sobald der Fonds nicht nach dem östr. Steuerrecht aufgelegt ist, passiert entweder bei thes. Fonds ist dies im Fondskurs bereits enthalten; und bei aussch. Fonds zahlst Du nicht nur die KESt. Kann mir jemand plausibel erklären wie folgende ETFs in Österreich versteuert werden? Sind beide physisch und thesaurierend.

Ich nehme an, dass das mit der Einkommenssteuer zu versteuern ist. Alles mehr als kompliziert: Ich bespare die angeführten 3 ETFs auf flatex es sind jeweils physisch , thesaurierende , Meldefonds. Kann mir jemand erklären wann ich damit rechnen muss heuer dafür Steuern zu zahlen , mein Cashkonto ist dafür ehrlichgesagt noch nicht gerüstet da ich die Sparpläne direkt von einem Referenzkonto einziehen lasse.

Im Normalfall wird von Flatex erst nach dem Meldedatum Geld abgebucht, oder? Ich bespare diese ETFs erst seit heuer , die erste Steuerzahlung ist dann aber erst heuer zu den jeweiligen Meldedaten , habe ich das richtig verstanden?

Natürlich wird erst nach dem Meldedatum abgebucht, davor gibt es ja noch keine Beträge. Ich kennen keinen Weg herauszufinden, wann denn nun konkret gemeldet wird und ich kann es mir auch nicht vorstellen, dass dies fix ist.

Das wird sicherlich nach Workload eingereicht und so gibt es nur ein Zeitfenster. Zu deiner letzten Frage: Ja, du darfst zum nächsten Meldestichtag brav versteuern, für den gesamten Meldezeitraum.

Habt Ihr das schon mal nachgerechnet? Was ist Eure Meinung dazu? Servus Alex, Es steht am Plan, dass er hier zu einem Special kommt, dauert aber. Eines ist aber gewiss, mit 4 Prozent an Verwaltungskosten kommst nicht aus?

Versicherungen sind hier wie eine Blackbox und verraten nicht viel. Aufpassen musst du bei Kest vs. Kest nur auf Gewinne, die Steuer auf den eingezahlten Betrag. Und leider nicht so flexibel wie ein eigenes Depot. Mich würde interessieren in welchen Gesetzen konkret, am besten bis hin zu einzelnen Pragraphen dies geregelt ist. Echt cool, dass ich endlich einen verständlichen Artikel zur Besteuerung in Ö gefunden habe!

Jetzt zu meiner Frage: Nun würde ich gerne wissen, wie ich die thesaurierenden im Detail zu versteuern habe. Wie sind die 2, für zu versteuern? Danke schonmal und LG! Was genau fehlt dir denn, bzw. Vermutlich wirds schon passen. Damit verringert sich eben die effektive Steuerbelastung auf 16,5 Prozent. Danke für die Aufklärung. Und wenn ich dann meine Wertpapiere mit Gewinn Verkauf: Noch eine Anmerkung aus der Praxis: Auch bei ausschüttenden Fonds kann es zu einer Steuerforderung unabhängig von der Dividenendenauszahlung kommen.

Dann nämlich wenn eine Umschichtung im Index vorgenommen wird und demnach Aktien vom Fonds verkauft werden und andere gekauft werden.

Dabei im Fonds realisierte Gewinne sind steuerpflichtig, genauso wie wenn man selbst diese Aktien mit Gewinn verkauft hätte. Hallo, in obiger Formel zum zu versteuernden Gewinn hat sich m. Meistens muss der Spieler dabei eine Siedlung gründen und aufbauen und an die verschiedensten Einflüsse denken, die ihm dabei in die Quere kommen können. Die ganze Szenerie besteht dabei üblicherweise aus einer Vielzahl unterschiedlicher Objekte, die mehr oder weniger ein Eigenleben führen. Wenn wir also beispielsweise eine Kolonialisierung des Planeten Antares-3 programmieren wollen, brauchen wir unter anderem ein paar Raumfahrzeuge: Aus beiden Beispielen wird deutlich, wodurch sich ein Objekt charakterisiert: Die Arten von Eigenschaften sind bei jeder Gruppe von Objekten dieselben, ihre Werte indessen verschieden.

Auch im realen Leben halten wir ja Gegenstände anhand ihrer Eigenschaften auseinander. Ein weiteres wichtiges Merkmal ist das Verhalten eines Objekts. Dieses hängt ab vom Zustand , in dem das Objekt sich augenblicklich befindet. Ein Raumfahrzeug soll auch in unserer Simulation stehen, starten, fliegen und landen. Diese Zustände gehen durch Befehle des Kommandanten oder unseres Programms ineinander über. Ändert sich der Zustand eines Objekts, so ändern sich oft auch seine Verhaltensweisen.

Auch kann es verschiedene Gruppen von Zuständen geben, die gegenseitig aufeinander Einfluss haben. Ist das Raumfahrzeug beispielsweise schwer angeschossen, kann es überhaupt nicht mehr fliegen. Die Änderung von einsatzbereit in abgeschossen bewirkt, dass nur noch bestimmte Bewegungszustände möglich sind. Klassen Grob gesprochen haben unsere Objekte jeweils dieselben Verhaltensweisen.

Worin sie sich wirklich unterscheiden, sind die Werte ihrer Eigenschaften und Zustände. Wenn wir also eine Simulation programmieren wollen, müssen wir nicht für jedes einzelne Raumfahrzeug alle Verhaltensmuster implementieren dann hätte uns unser objektorientierter Zugang eine Menge zusätzlicher Arbeit bereitet! Fassen wir also die bisher verwendeten Attribute zu einer Schablone zusammen: Damit haben wir unser Wissen über die Elemente abstrahiert.

Eine solche Abstraktion nennt man eine Klasse. Sie ist eine allgemein gültige Beschreibung von Arten von Objekten. Hintergrund Was hat das Ganze mit Programmierung zu tun? In etwas theoretischer aufgebauten Büchern zur objektorientierten Programmierung können Sie lesen, dass es sich bei einer Klasse um einen abstrakten Datentyp handelt.

Jede Programmiersprache bringt eine Reihe von Standarddatentypen mit, etwa für ganze Zahlen oder für Zeichenketten. Objektorientierte Sprachen zeichnen sich unter anderem dadurch aus, dass sie es dem Programmierer ermöglichen, neue Datentypen zu definieren. Abstrahiert man die Daten des zu behandelnden Problemkontextes zu Datenstrukturen, so kann man daraus einen abstrakten Datentyp ADT bilden.

Der Datentyp kann selbst Einschränkungen und Bedingungen bei der Verwendung seiner Funktionen bestimmen. Der wesentliche Unterschied ist jedoch, dass Sie aufgrund seiner Typeigenschaft nicht nur ein Exemplar davon bilden können, sondern beliebig viele. Und diese Exemplare sind genau die Objekte, von denen ich oben sprach.

Eine Klasse entspricht einer Schablone, mit der Sie gleichartige Objekte beschreiben können. Dabei fasst die Klasse alle in diesem Kontext relevanten Eigenschaften und möglichen Zustände der Objekte zusammen. Ein Objekt ist immer eine Ausprägung einer Klasse. Man bezeichnet es dann auch als Instanz oder Exemplar der Klasse zum Beispiel: Von jeder Klasse können mehrere Objekte gleichzeitig existieren.

Jede Klasse kann Variablen, also gespeicherte Daten, beinhalten. Diese nennt man Attribute oder Datenelemente der Klasse. Sie können bei jedem Objekt andere Werte haben Beispiel: Ändern Sie den Wert eines Attributs in einem Objekt, so gilt diese Änderung auch nur für dieses Objekt; alle anderen bleiben unverändert. Methoden und Prozessabstraktion Wenn wir uns allein mit Eigenschaften und Zustände bei unseren Objekten zufrieden geben würden, wären unsere Programme ziemlich langweilig.

Sie würden nämlich nur eine sehr statische Sichtweise auf die Objekte wiedergeben. Sie sagen aber noch nichts über das Verhalten der Objekte aus, also über die Dynamik. Dazu brauchen wir noch Funktionen und Prozeduren. Einige der Probleme, die wir für diesen Ansatz identifiziert haben, lassen sich darauf zurückführen. In der objektorientierten Programmierung hingegen bilden Daten und Funktionen eine Einheit.

Denn das Verhalten der Objekte hängt ja oft unmittelbar von den Werten ihrer Attribute ab. Das Shuttle kann nicht schneller fliegen, als seine Höchstgeschwindigkeit es erlaubt. Wie bringen wir nun ein Objekt dazu, sich auf die eine oder andere Art zu verhalten?

Wir sagen es ihm einfach. Da wir nicht direkt mit ihm sprechen können, senden wir ihm eine Nachricht. Das ist nämlich genau die Art, wie Objekte untereinander kommunizieren: Sie schicken sich gegenseitig Nachrichten, die dann zu Änderungen des Zustands oder eines Attributs führen können.

Die Funktionen, die zu einer Klasse gehören, nennt man Methoden oder Operationen. Sie dienen dazu, Nachrichten zu versenden beziehungsweise zu behandeln. Methoden arbeiten meist innerhalb einer konkreten Instanz einer Klasse und greifen dabei auf die Attribute und Zustände dieses Objekts zu.

Die Änderungen, die die Methode durchführt, sind dann nur in dieser Instanz gültig und haben auf andere Instanzen, die eventuell im Augenblick daneben noch existieren, keinen Einfluss. Von besonderer Bedeutung ist das Prinzip der so genannten Prozessabstraktion: Für den Absender einer Nachricht ist es normalerweise unwichtig und daher auch unbekannt, wie die Methoden implementiert sind, welche Datenstrukturen dabei benötigt und bearbeitet werden, welche anderen Objekte an der Verarbeitung der Nachricht beteiligt sind.

Zunächst schickt das erste Objekt eine Nachricht an das zweite. Das kann diese Anfrage nicht alleine beantworten und fragt daher bei einem dritten Objekt nach. Dieses gibt auch eine Antwort zurück. Danach kann es die Antwort auf die ursprüngliche Anfrage erstellen und an den Absender schicken. In wirklichen Programmen werden Sie nur selten etwas finden, das wie eine tatsächliche Nachrichtensendung aussieht.

Normalerweise sind es Funktionen, die Sie an einem Objekt aufrufen. Im Gegensatz zur strukturierten Programmierung müssen Sie aber in einem objektorientierten Programm stets angeben, zu welchem Objekt die Methode gehört, die Sie rufen wollen. Datenabstraktion Die Sichtweise der Nachrichten bringt uns noch zu einem anderen Aspekt. Man sagt dazu, die Daten sind gekapselt.

Sie müssen dazu immer das besitzende Objekt benachrichtigen Abbildung 2. Dieses kann dann selbst bestimmen, wie es auf eine solche Nachricht reagieren will. Es kann dem Wunsch nachkommen -- oder ihn zurückweisen. Das Objekt behält also jederzeit die volle Kontrolle über seine Daten.

Man kann also beispielsweise den Verarbeitungsalgorithmus ändern oder gleich ganz austauschen, ohne dass das restliche Programm davon überhaupt etwas merkt. Normalerweise ist nämlich jede Klasse genau einem Entwickler zugeordnet. Er ist dann allein für die inneren Abläufe in dieser Klasse verantwortlich.

Wenn etwa ein Fehler mit einem Objekt dieser Klasse auftritt, kann der Entwickler ihn meist allein beheben. Bei der strukturierten Programmierung, die solche Abstraktionsebenen nicht kennt, sind von der Fehlerbereinigung meistens gleich mehrere Module, Datenstrukturen oder Funktionen betroffen, so dass vielfach auch mehrere Entwickler eingebunden werden müssen.

Die strikte Trennung von Zuständigkeiten kann -- wenn sie vernünftig praktiziert wird -- für alle das Leben erheblich erleichtern.

Zusammenfassung Sie sollten sich zu diesem Thema folgende Punkte einprägen: Eine Klasse ist eine Schablone, mit der gleichartige Objekte beschrieben werden können.

Ein Objekt ist eine Ausprägung einer Klasse. Man bezeichnet es dann auch als Instanz einer Klasse. Jede Klasse kann Variablen beinhalten. Diese nennt man Attribute der Klasse. Attribute können bei jedem Objekt andere Werte haben. Änderungen haben nur Einfluss auf die ändernde Instanz.

Eigenschaften und Zustände eines Objekts können nur durch Nachrichten verändert werden. Die eigentlichen Daten sind im Allgemeinen für andere Objekte nicht sichtbar. Methoden sind Funktionen zum Behandeln und Versenden von Nachrichten. Sie arbeiten meist innerhalb einer konkreten Instanz einer Klasse und greifen dabei auf deren Eigenschaften und Zustände zu. Übungsaufgaben Ein beliebtes Beispiel in der Literatur ist die Bankanwendung.

Welche Nachrichten werden zwischen den Objekten ausgetauscht? Das liegt daran, dass zum Schreiben guter Software eine noch bessere Vorarbeit nötig ist.

Dazu gehört ein sehr genaues Verständnis des Problems, das gelöst werden soll, ebenso wie ein durchdachtes Design, also eine sinnvolle Aufteilung der Daten in Klassen und Objekte und eine detaillierte Definition der Nachrichten, die die Objekte austauschen sollen.

Letztlich rechnet man heute, dass weniger als ein Drittel der Zeit und Kosten eines Entwicklungsprojekts für die eigentliche Programmierung aufgewendet wird. Aber zu einem guten Design gehört auch die Kenntnis der Programmiersprache, in der das Projekt später realisiert werden soll.

Es wurde nämlich ursprünglich ca. So gesehen ist es übrigens syntaktisch falsch, das zweite Plus wegzulassen Sie können sich sicherlich denken, dass dieses Verfahren einige Probleme mit sich brachte und nicht optimal sein konnte. Eine Reihe von Entwürfen hat die Kommission in dieser Zeit veröffentlicht, die alle von den Compiler-Herstellern als De-facto-Standards aufgegriffen und bei der Entwicklung ihrer Werkzeuge berücksichtigt wurden.

Doch auch damit hört die Arbeit nicht auf. Es liegen schon wieder neue Entwürfe für Erweiterungen vor. Die grundlegenden Sprachelemente werden selbstverständlich von allen aktuellen Compilern unterstützt.

Die einzelnen Werkzeuge unterscheiden sich nur darin, wie umfangreich und wie gut sie auch die neueren Erweiterungen abdecken. Gleichzeitig bedeutet ein gutes Programm zu schreiben jedoch nicht, möglichst alle neuesten Features aneinander zu hängen.

Das führt zu der Situation, dass die Sprache eine Vielzahl von Programmierstilen ermöglicht, von rein prozeduraler Form bis zu streng objektorientierter. C wurde für Unix konzipiert und so gut wie alle Unix-Implementierungen wurden in C programmiert.

Auch der Linux-Kernel ist in C geschrieben. Mit der Zeit haben allerdings auch die Entwickler unter Unix die Vorteile des objektorientierten Ansatzes erkannt. Er mag vielleicht bei systemnahen Programmen nicht so offensichtlich sein, so dass hier auch heute noch C vorherrscht.

Eine kleine Gruppe machte sich daran, auf der Basis des GCC einen Schritt weiter zu gehen und zusätzliche Features zu unterstützen. Das Projekt nannte sich experimental GNU compiler suite, abgekürzt egcs , gesprochen eggs.

Seit der Version 2. Mit diesem werden wir im Folgenden arbeiten. Er unterstützt so gut wie alle Sprachmerkmale des aktuellen Standards. Auf die wenigen Aspekte, die noch nicht so vollständig unterstützt werden, kommen wir in diesem Rahmen ohnehin nicht zu sprechen. Kommerziell erhältlich sind beispielsweise die Compiler der Portland Group zu finden unter www. Daher nun gleich das erste Programm. Sie nehmen es mir bestimmt nicht übel, wenn ich uns diesen Schritt erspare, und werfen mit mir einen Blick auf das folgende Programm: Summe der Zahlen von 1 bis 10 3: Haben Sie schon eine Idee, welchen Zweck es haben könnte?

Zur Ausgabe kommen wir später Das Programm ist so einfach, dass es nur einer Datei mit diesem Stück Code bedarf. Auf eine Header-Datei, wie auf Seite beschrieben, können wir also verzichten. Das soll Sie aber nicht davon abhalten, auch mal das eine oder andere Beispiel selbst einzutippen. Denn meistens macht man dabei einen Tippfehler und lernt damit gleich, wie der Compiler auf solche Fehler reagiert.

Kommentare Gleich die ersten drei Zeilen sind ein Kommentar. Darunter versteht man einen Text, eine Anmerkung, die vom Compiler ignoriert wird. Sie dient lediglich dazu, den Programmtext für einen menschlichen Leser verständlicher zu machen. Bei einem so kleinen Programm mag Ihnen das nicht besonders wichtig vorkommen. Dasselbe gilt, wenn Sie Programmen verstehen wollen, die andere geschrieben haben.

Viele Programmierer empfinden das Kommentieren als lästige Pflicht -- und genauso sehen ihre Kommentare dann auch aus. Dabei kann ich Ihnen nur raten, möglichst viel zu kommentieren, auch Dinge, die Ihnen momentan selbstverständlich erscheinen; vielleicht sehen andere das nicht so. Als Faustregel kann man sagen: Ein gut kommentiertes Programm verfügt über mindestens ebenso viele Programm- wie Kommentarzeilen.

In der nächste Zeile geht es dann wieder mit Programmcode weiter. Diese Möglichkeit eignet sich eher für einzeilige Kommentare sowie Anmerkungen hinter Befehlen. Auf diese Weise können Sie längere Bemerkungen in den Quelltext einbauen. Eine weitere nützliche Anwendung von Kommentaren ist, einzelne Anweisungen auszukommentieren, wie man sagt. Wenn Sie etwa testen wollen, was Ihr Programm ohne eine bestimmte Anweisung macht, setzen Sie einfach die beiden Schrägstriche davor und schon ignoriert der Compiler diesen Befehl.

Variablen In fast jedem Programm müssen Sie mit irgendwelchen Daten umgehen. Zahlen sind dabei sehr wichtige Typen; es gibt für ganze Zahlen und für Dezimalbrüche mehrere Typen -- je nach Zahlenbereich, der sich mit ihnen darstellen lassen soll.

Doch dazu später mehr auf Seite. Jede Variable hat einen Namen. In unserem Beispiel gibt es zwei Variablen, nämlich zahl und i. Bevor Sie eine Variable verwenden können, müssen Sie sie zunächst deklarieren.

Bei der Namensgebung für Variablen sind Sie ziemlich frei, wenngleich Sie ein paar Regeln beachten müssen: Nicht erlaubt sind Leerzeichen und Sonderzeichen.

Die maximale Länge ist Zeichen, aber mehr als fünfzehn bis zwanzig dürfte bereits ziemlich unpraktisch sein. Variablen werden bei der Deklaration nicht initialisiert. Das bedeutet, sie haben nach der Deklaration keinen definierten Wert, sondern können alle möglichen Werte aufweisen. Das ist besonders dann wichtig, wenn Sie mit dieser Variable gleich weiterarbeiten und sie etwa erhöhen, wie in Zeile Dort wird nämlich zum aktuellen Wert eine Zahl addiert. Ist bereits der aktuelle Wert undefiniert was er in diesem Beispiel aber dank der Initialisierung in Zeile 11 nicht ist , ist es das Ergebnis genauso.

Daher sollten Sie jede Variable gleich nach der Deklaration mit einem sinnvollen Wert initialisieren, um solchen unangenehmen Effekten vorzubeugen. Wenn Sie allerdings Glück haben, ist bereits der Compiler so intelligent und belegt die Werte der Variablen vor. Ein solches Wohlverhalten dürfen Sie aber nicht überall erwarten. Sie können natürlich auch einer Variablen den Wert einer anderen zuweisen oder ein Rechenergebnis, wie in Zeile Ein besondere Art von Operatoren wird für die Ein- und Ausgabe verwendet.

In obigem Beispiel konnten Sie in Zeile 17 etwa lesen: Strukturierungselemente Und noch etwas sehen Sie an diesem Beispiel: Eine Ausnahme bilden dabei Kontrollstrukturen wie die for -Schleife. Nach diesen folgt entweder eine einzelne Anweisung oder ein Block. Jede Funktion besteht beispielsweise aus einem Block. Selbstverständlich kann man auch mehrere Blöcke ineinander verschachteln. Um dabei den Überblick zu bewahren, empfehle ich Ihnen, jede geschweifte Klammer in eine eigene Zeile zu setzen.

So gut wie alle Leerzeilen und Zeilenumbrüche werden vom Compiler ignoriert. Ob Sie also zum Beispiel bei einer Variablendeklaration zwischen dem Typ und dem Variablennamen ein oder zehn Leerzeichen einfügen, spielt überhaupt keine Rolle. Die Freiheiten, die Sie folglich bei der Gestaltung des Quelltextes haben, sollten Sie dazu nutzen, den Programmtext möglichst lesbar für Sie und andere!

Ein paar Grundregeln dabei sind: Wie es dann tatsächlich tun, überlasse ich aber Ihnen. Dann ist im Allgemeinen schon ein wichtiger Schritt getan, dass das Programm lesbar und damit wartbar bleibt. Meistens merken Sie seine Arbeit gar nicht. Vor dem eigentlichen Compilerlauf wird aber immer noch eine Vorverarbeitung gemacht. Der Präprozessor bereitet den Code für den Compiler auf, indem er etwa die angegebenen Header-Dateien einfügt oder Makros expandiert.

Makros sind so etwas wie Abkürzungen von ein paar Anweisungen. Er kann sogar über Bedingungen gesteuert werden, so dass der Compiler dann nur bestimmte Teile des Quelltextes übersetzt.

Anweisungen für den Präprozessor erkennen Sie immer am Doppelkreuzzeichen. Für den Anfang müssen Sie lediglich den Befehl include kennen verwendet in Zeile 5. Der Unterschied dabei ist: Steht der Dateiname in normalen Anführungzeichen, so wird die Header-Datei auch im aktuellen Verzeichnis gesucht. Verwendet man die spitzen Klammern, so beschränkt sich die Suche auf die Verzeichnisse für die System-Header und eigens angegebene Verzeichnisse über den Aufrufparameter -I für den Compiler, siehe Seite.

Die Hauptfunktion Jedes Programm muss irgendwo beginnen. Auch wenn davor noch ganz andere Funktionen stehen, fängt die Ausführung immer in dieser Funktion an.

Folglich erwartet der Compiler auch, dass jedes ausführbare Programm über eine Funktion dieses Namens verfügt. Datentypen und Typumwandlung Mit der Festlegung des Datentyps bestimmen Sie die Art, wie der Compiler die Informationen interpretiert und wie er sie im Speicher ablegt.

Auch die Art der Operationen, die mit dieser Variablen erlaubt sind, hängen von ihrem Datentyp ab. Die elementaren Datentypen Diese unterscheidet man nach ihrer Verwendung: Diese können nur die Werte true oder false annehmen. Dabei sind short und long nur abkürzende Schreibweisen für short int beziehungsweise long int.

Aus den Beispielen erkennen Sie auch, wie man literale Konstanten angibt also solche, deren Wert unmittelbar im Programmtext steht. Merken Sie sich dabei folgende Regeln: Ganze Zahlen also ohne Dezimalpunkt dahinter werden als int interpretiert. Wenn Sie eine lange Ganzzahl angeben wollen, müssen Sie das L dahinter setzen. Ebenso wird jede Gleitkommazahl, also solche, die einen Dezimalpunkt enthalten, automatisch als double angesehen.

Wenn Sie nur die einfache Genauigkeit ausdrücken möchten, bedarf es eines f dahinter. Wenn Sie wollen, können Sie ganze Zahlen auch im Hexadezimalformat angeben. Für einzelne Zeichen verwendet man das einfache Hochkomma, also z. Diese Konstante kann man dann einer Variable vom Typ char zuweisen. Implizite Typumwandlung Meistens kann man Variablen und Konstanten verschiedener Datentypen einander zuweisen. Als Programmierer sollten Sie aber ein wenig die dabei angewandten Prinzipien kennen, um beurteilen zu können, ob die automatische Umwandlung auch die ist, die Sie wollen.

Vorsicht ist beim umgekehrten Fall geboten. Hierbei können Informationen verloren gehen und sogar völlig andere Ergebnisse herauskommen, als Sie vielleicht erwarten. Wenn noch Konstanten im Quelltext stehen, kann man von Hand nachrechnen und aufmerksam werden.

Wenn aber andere Variablen beteiligt sind, wird das schon schwieriger, zum Beispiel: Bei der gegenseitigen Zuweisung von ganzen und Dezimalzahlen sind nicht so viele Fallstricke ausgelegt. Sie sollten lediglich daran denken, dass der gesamte Teil nach dem Komma abgetrennt wird, wenn Sie als Ergebnis eine Ganzzahl angeben. Jede Variable muss über einen eindeutigen Typ verfügen, und bei Zuweisungen und Vergleichen müssen die Variablen beziehungsweise Konstanten als kompatibel bekannt sein, sonst wird eine Fehlermeldung ausgegeben.

Überhaupt weist Sie der Compiler mit Hilfe von Warnungen oft auf mögliche Fehler oder Mehrdeutigkeiten hin, etwa wenn er annimmt, dass Sie eine Anweisung anders gemeint haben, als sie nun im Quelltext steht. Lesen Sie diese Meldungen aufmerksam und versuchen Sie stets die Ursachen dafür zu verstehen. Auf diese Weise werden Sie auch viel über die richtige Programmierung lernen. Explizite Typumwandlung Anstatt sich auf die automatische Typkonvertierung zu verlassen, kann es auch manchmal sinnvoll sein, dem Compiler eine Regel zur Umwandlung vorzuschreiben.

Für die explizite Typumwandlung verwenden die C-Programmierer einen sehr bildlichen Ausdruck, nämlich cast , das englische Wort für Gipsverband. Die andere Möglichkeit ist, die Variable in Klammern zu setzen und den Typ davor: Da Sie aber erst noch einige weitere Begriffe kennen müssen, um diese zu verstehen, verschieben wir die Diskussion auf später Seite.

Aufzählungstypen Nicht immer sind numerische Werte für eine Variable sinnvoll. Manchmal will man für sie nur einen begrenzten Wertebereich zulassen.

Hier sollten Sie einen Aufzählungstyp verwenden. Sie deklarieren ihn mit dem Schlüsselwort enum , einem Typnamen und einer Liste von Werten, eingeschlossen in geschweiften Klammern und getrennt durch Kommas. Für unseren Status können wir schreiben: Operatoren Variablen alleine nützen noch nicht viel. Man muss sie auch miteinander verknüpfen, sie zuweisen, verändern und ausgeben können.

Dazu dienen die Operatoren. Einige erinnern noch daran, dass C einmal als besonders hardwarenahe Sprache entworfen wurde. Überblick Auf jeden einzeln einzugehen, würde an dieser Stelle zu weit führen. Ich will Ihnen daher in Tabelle Tab: Operatoren eine Liste mit den wichtigsten Operatoren geben.

Wenn Ihnen Verschiedene nicht gleich klar sind, müssen Sie sich deshalb keine Sorgen machen: Tatsächlich gibt es ein paar Operatoren, deren Bedeutung vom Kontext abhängt, in dem sie verwendet werden. Für den Augenblick ist es hilfreich, wenn Sie die Quelltexte sehr konzentriert durchsehen und sich bei jeder Anweisung nach deren Bedeutung fragen.

Dort regelt beispielsweise der Grundsatz Punkt vor Strich, dass zunächst multipliziert und dann erst addiert wird.

Auch innerhalb jeder Gruppe kann es noch Reihenfolgen geben. Sie können nämlich sowohl vor als auch hinter der Variablen stehen, auf die sie wirken. Man nennt diese beiden Stellungen auch Präfix und Postfix. Die Operatoren werden meist nicht als einziger Bestandteil einer Anweisung verwendet, sondern in kompliziertere Ausdrücke eingebaut.

Steht der Operator vor der Variable, wird er zuerst ausgeführt und dann erst der Ausdruck ausgewertet. Steht er dagegen dahinter , wird erst der gesamte Ausdruck ausgewertet und dann der Operator angewandt. Anfänger empfinden diese Schreibweise stets als verwirrend; die erfahrenen Programmierer sehen sie dagegen als besonders elegant und kompakt an.

Überlegen oder probieren Sie mal selbst, welche Ausgabe der folgende Code erzeugt: Der Bedingungsoperator Einer der Operatoren, die in Tabelle fehlen, ist?: Er hat folgende allgemeine Form: Ausdruck2 Die Verwendung ist ganz einfach: Ist die Bedingung wahr, wird Ausdruck1 ausgewertet, ist sie falsch, dann Ausdruck2.

Ausdrücke Gerade war schon von Ausdrücken die Rede. Was ist eigentlich ein Ausdruck? Dem Begriff des Ausdrucks engl. Dieser hängt von den beteiligten Variablen und Operatoren ab. Betrachten wir beispielsweise folgende Variablen: Zusammenfassung Aus diesem Abschnitt sollten Sie sich Folgendes merken: Kommentare können auf zwei Arten in den Programmtext eingefügt werden: Jedes Programm sollte mindestens so viele Kommentar- wie Anweisungszeilen enthalten.

Eine automatische Initialisierung erfolgt nicht. Als Typen für Ganzzahlen gibt es je nach Wertebereich short , int und long.

Die Typen char , short , int und long können den Zusatz unsigned erhalten. Der Datentyp void steht für einen nicht existenten Wert. Wenn die Datentypen innerhalb eines Ausdrucks nicht kompatibel zueinander sind, versucht der Compiler, die Variablen selbstständig in einen anderen Typ umzuwandeln. Um auf diesen Vorgang Einfluss zu nehmen, können Sie auch explizit Typkonvertierungen vorschreiben.

Der Typ des Werts eines arithmetischen Ausdrucks wird bestimmt von dem höchstwertigen Teilausdruck. Daten und Objekte werden mit Hilfe von Operatoren verknüpft, verändert und ausgelesen. Übungsaufgaben Was passiert, wenn man einer Variablen vom Typ int eine Zahl mit Dezimalstellen zuweist? Welchen Wert hat eine Variable, nachdem sie deklariert wurde? Erklären Sie den Unterschied zwischen expliziter und impliziter Typkonvertierung.

Die Funktion sizeof hat den Zweck, den Speicherverbrauch eines Datentyps oder einer Variablen zu bestimmen. Welche Ausgabe liefert folgendes Programm? Für eine Variable x soll ausgegeben werden, ob sie 0 ist oder nicht. Was ist hier falsch? Dabei spielt natürlich auch eine Rolle, dass es sich dabei um freie Software handelt, der Compiler also kostenlos erhältlich ist. Installation Sie können sich stets mit der neuesten Version des Compilers aus dem Internet versorgen, am besten von gcc.

Allerdings werden Sie dazu kaum je Anlass verspüren. In jeder Linux-Distribution ist nämlich dieser Compiler enthalten -- schon allein deshalb, weil er zum Kompilieren des Linux-Kernels gebraucht wird.

Erscheint eine neue Version, bringen die Hersteller der Distributionen sie meist relativ schnell in die Form von Installationspaketen, die Sie dann nur noch von den Sites der Hersteller herunterladen müssen. Die eigentliche Installation auf Ihrem Rechner ist dann mit den jeweiligen grafischen Werkzeugen oder mit rpm leicht zu erledigen. Wenn Ihr Programm aus mehreren Quelltextdateien besteht, können Sie auch mehrere hintereinander angeben.

Dabei dürfen die Dateien auch in mehreren Verzeichnissen liegen, müssen Sie dazu nur jeweils den vollständigen Pfad angeben, zum Beispiel: Die wichtigsten sind in Tabelle zusammengefasst; ich werde sie Ihnen im Folgenden kurz erläutern.

Die Reihenfolge, in der Sie die Optionen angeben, ist völlig egal. Sie müssen lediglich sicherstellen, dass jeweils eine Option und ihr zugehöriger Parameter zusammen stehen. Name für die ausführbare Datei Vermutlich sind Sie mit dem Namen a.

Debug-Informationen Jeder Programmierer macht Fehler. Um diese aufzudecken, gibt es Debugger vom englischen Wort bug, das eigentlich Käfer, umgangssprachlich auch Programmierfehler bedeutet; ob man in den ersten riesigen Elektronenhirnen mal tatsächlich Käfer fand, ist nicht zweifelsfrei überliefert. Debugger sind Hilfsprogramme, mit denen Sie das Programm quasi beim Ablauf beobachten können, also an bestimmten Stellen stoppen, Werte von Variablen ausgeben oder um einzelne Schritte weiterlaufen lassen können.

Damit der Debugger die Anweisungen im ausführbaren Programm den Quelltextzeilen zuordnen kann, braucht er entsprechende Informationen.

Diese werden durch die Option -g in das Programm eingefügt. Fehler und Warnungen Bei Syntaxfehlern also Verletzung der Sprachregeln stoppt der Compiler meist sofort und gibt die Datei sowie die Nummer der Codezeile aus, in der er den Fehler festgestellt hat.

Wenn Sie wie in folgendem Beispiel ein Semikolon vergessen: Manchmal wird ein Syntaxfehler aber gar nicht als solcher erkannt, da die Anweisung in einem anderen Kontext durchaus korrekt sein könnte. Eine solche Fehlerinterpretation verwirrt den Compiler dann bei der Übersetzung der nachfolgenden Anwendungen so sehr, dass es meist Fehlermeldungen hagelt.

Wenn Sie an der ersten Stelle, an der ein Problem auftrat, nichts finden können, sollten Sie daher auch die Zeilen darüber betrachten, ob sich in diesen nicht die Ursache finden lässt.

Anders verhält es sich mit Warnungen. Diese sind nicht so schwer wiegend, dass dadurch der Übersetzungsvorgang gleich eingestellt werden müsste. Andererseits handelt es sich dabei um potenzielle Probleme, die im einfachsten Fall ignoriert werden, im schwersten Fall aber zur Laufzeit einige unerwünschte Effekte hervorrufen können.

So weist Sie der Compiler darauf hin, dass Sie etwas unschön geschrieben haben oder mehr als nötig, dass er etwas anders auffasst, als Sie es vermutlich gemeint haben, und so weiter.

Für fast jede Warnung gibt es eine eigene Option, jeweils von der Form -W warnungs-typ. Zum Glück gibt es aber auch Schalter, die ganze Gruppen von Warnungen aktivieren. Eine ist dabei besonders wichtig: Mit -Wall schalten Sie alle Warnungen ein, die auf unschönen Code hindeuten. Dabei handelt es sich beispielsweise um nicht oder unzureichend initialisierte Variablen, Typverwechslungen, missverständliche Klammerungen oder unbenutzte Variablen.

Sie sollten die Warnungen ernst nehmen und solchen Code vermeiden. Wenn wir etwa schreiben: Sie sehen daran auch, dass Sie der Compiler bei einem Durchlauf nicht auf alles gleichzeitig hinweist. Hier ist beispielsweise die Variable p genauso unbenutzt wie s , wird jedoch nicht angemahnt.

Erst wenn Sie s entfernen würden, käme die Warnung für p. Die Schreibweise -Wall steht zwar für warnings, all, ist aber nicht zufällig auch als wall, also Wand, zu lesen. Sie können sich dabei eine Schutzmauer um Ihren Code vorstellen; wenn er sie überwindet, ist er schon mal in ganz guter Verfassung. Daher empfehle ich Ihnen, diesen Schalter immer zu verwenden. Kompilierung zur Objektdatei Wenn Sie Programme schreiben, die aus mehreren Dateien bestehen, so geben Sie diese üblicherweise nicht alle auf einmal beim Aufruf des Compilers an.

Wenn Sie nämlich in einer davon einen Fehler gefunden haben, diesen korrigieren und die Übersetzung neu starten, werden auch alle davor stehenden nochmals kompiliert. Bei Programmen mit mehr als einer Quelldatei darf man die einzelnen Quellen nur bis zum Objektcode übersetzen -- und das jeweils mit einem eigenen Compileraufruf für jede Datei. Sind alle Files übersetzt, können sie mit einem weiteren Aufruf zusammengelinkt werden.

Um den Compiler anzuweisen, beim Objektcode aufzuhören und das Linken zu einem ausführbaren Programm gar nicht erst zu versuchen, verwenden Sie die Option -c. Besteht der Quelltext Ihres Programms beispielsweise aus den Dateien datei1. Diese hatte ich Ihnen auf Seite schon mal vorgestellt.

Steht der Dateiname in normalen Anführungzeichen, so wird nach der Header-Datei zusätzlich im aktuellen Verzeichnis gesucht. Gelegentlich werden Sie für die Übersetzung aber auch Header-Dateien benötigen, die weder in den Systemverzeichnissen noch im aktuellen Verzeichnis stehen. Dann können Sie zusätzlich Verzeichnisse angeben, in denen der Compiler nach Headern suchen soll.

Dabei können Sie relative Pfade etwa -I.. Der Linker, der die einzelnen Objektdateien zu einem ausführbaren Programm zusammenfügen soll, verbindet die Aufrufe mit den eigentlichen Funktionen auf Ebene der Maschinensprache. Damit er die Bibliotheksfunktion dabei findet, müssen Sie beim Linken noch die entsprechende Bibliothek dazubinden. Dazu haben Sie zwei Möglichkeiten: Diese arbeitet ganz analog zu der für Include-Dateien. Die Option -L wirkt dabei indes nur auf die -l -Befehle, die Sie danach angeben.

Somit sollten Sie stets zunächst die Suchpfade und dann die Binde-Kommandos schreiben. Der Linker sucht sich dabei alle Symbole heraus, die im restlichen Programm zwar verwendet, aber nicht definiert werden.

Auch dabei ist die Reihenfolge entscheidend. Optimierung Normalerweise versucht der Compiler, die ihm gestellte Aufgabe, also das Übersetzen eines Programms, möglichst schnell zu erledigen. Das ist während des Entwicklungszyklus sicherlich auch für den Programmierer hilfreich. Ist das Programm dann aber einmal fertig und soll seine Arbeit verrichten, so sind Sie vermutlich daran interessiert, dass es diese so schnell wie möglich vollbringt.

Dafür schalten Sie die Optimierung ein. Compiler-Optimierung ist ein eigenes wissenschaftliches Fachgebiet. Der GCC war lange Zeit dafür bekannt, dass er besser optimiert als viele seiner kommerziellen Konkurrenten.

Unter Linux liegt er immer noch in der Spitzengruppe. In älteren Programmierbüchern können Sie oft lesen, wie man Code schreiben sollte, damit er vom Compiler optimal umgesetzt werden kann. Aufgrund der Fähigkeiten des automatischen Optimierers können Sie sich diese Feinheiten heute sparen. Natürlich sollten Sie immer noch Ihre Algorithmen möglichst ökonomisch organisieren -- aber die Beachtung von bestimmten Reihenfolgen von Anweisungen oder Befehle, um Variablen in die Prozessorregister unterzubringen, sind nicht mehr nötig.

Sie müssen nicht einmal wissen, was der Optimierer eigentlich macht, denn Sie interessiert es ja nur, dass Ihr Programm möglichst schnell läuft. Die Standardoption zum Einschalten der Optimierung ist -O. Es gibt dazu sogar noch Steigerungen: Mit -O2 und -O3 schalten Sie noch zusätzliche Optimierungsverfahren dazu.

Zuweilen kann das aber des Guten zu viel werden, denn manche Programme zeigen bei zu hohem Optimierungsniveau ein unvorhersagbares Verhalten bis hin zu Abstürzen. Daher ist das einfache -O meist die Methode der Wahl. Ein so optimiertes Programm läuft natürlich auf Rechnern mit Prozessoren der vorhergehenden Generationen nicht mehr. Dazu geben Sie einfach ein: Eine wesentliche Vereinfachung der Bedienung können Sie schon mit xinfo erreichen. Dann erhalten Sie die Informationen wenigstens in einem X-Window und können etwas mit der Maus klicken.

Dort müssen Sie nur nach dem Stichwort gcc suchen und dieses anklicken. Dann sollten Sie die in Abbildung dargestellte Seite vor sich sehen. Editieren mit NEdit Vielleicht hatten Sie während des Lesens ab und zu schon den Wunsch, auch ein kleines Programm zu schreiben und zu übersetzen. Ich habe schon viel über Programmierung erzählt, aber noch nichts, wie man den Quelltext eigentlich eintippt. Entsprechend vielseitig ist die Palette der Bedienphilosophien.

Viele Editoren sind meiner Erfahrung nach für Anfänger ungeeignet, da dabei sehr eigenwillige Tastenkombinationen nötig sind. Und da ich davon ausgehe, dass Sie vor Ihrer Beschäftigung mit Linux schon einige Erfahrungen mit Windows oder MacOS gemacht haben, möchte ich Sie lieber auf Werkzeuge hinweisen, deren Handhabung Ihnen etwas vertrauter vorkommen müsste. Es macht doch keinen Sinn, wenn Sie sich nicht nur in eine neue Programmiersprache, sondern gleichzeitig auch in einen ungewohnten Texteditor einarbeiten müssten, oder?

Später ab Seite will ich Ihnen noch einige Editoren im Detail vorstellen sowie verschiedene integrierte Entwicklungsumgebungen besprechen. Damit nicht alles aus dem Zusammenhang gerissen wird, Sie aber jetzt schon Ihre ersten Programme schreiben können, möchte ich an dieser Stelle einen Editor herausgreifen und Ihnen ein paar Tipps zur Arbeit mit NEdit geben.

Er lehnt sich insbesondere an die unter Windows und MacOS verwendeten Konventionen an und bietet zum Beispiel Menüs, Dialogfenster, Bearbeitungsmöglichkeiten mit der Maus sowie die gewohnten Shortcuts. Viele Distributionen beinhalten bereits NEdit. Natürlich können Sie sich auch mit der neuesten Version aus dem Internet versorgen; dort gibt es sogar schon vorkompilierte Versionen.

Sehen Sie dazu am besten auf der Homepage www. Die Bedienung erfolgt in gewohnter Weise. Ein sehr hilfreiches Feature ist das Syntax-Highlighting , das die verschiedenen Sprachelemente wie Schlüsselwörter, Präprozessordirektiven oder Kommentare in Farbe und Schrifttyp voneinander abhebt. Das Programm erkennt an der Dateierweiterung.

Entsprechend sind Einrückungen und Ähnliches automatisch eingestellt, so dass Sie immer einen Block auch in derselben Spalte beginnen können. Wenn Sie an die Stelle hinter einer Klammer kommen, wird die zugehörige Klammer kurz durch ein rotes Quadrat markiert. Wenn Sie also einmal einen Sachverhalt nicht als selbsterklärend erachten, finden Sie dort sicherlich Rat.

Und nun kann ich Ihnen nur raten, die gezeigten Beispiel immer wieder zu laden, zu verändern und zu erweitern -- und natürlich auch eigene Programme zu schreiben. Sicher werden Sie dabei immer wieder mit den verschiedensten Fehlermeldungen des Compilers konfrontiert werden. Aber nur auf diese Weise werden Sie mit der Zeit seine Arbeitsweise verstehen und zu einem korrekten Programmierstil gelangen, mit dem Sie Ihre eigentlichen Aufgaben angehen können.

Zusammenfassung Die wichtigsten Aspekte dieses Abschnitts waren: Als Argument erwartet dieser zumindest den Namen der Quelltext-Datei. Die Option -g bewirkt, dass Informationen für den Debugger hinzugefügt werden. Was ist an folgendem Aufruf falsch? Klassen und Objekte Auf den Seiten ff. Klassendeklaration und -definition Eine Klasse ist zunächst einmal ein von Ihnen definierter Datentyp.

Sie müssen sie deklarieren, damit sie dem Compiler bekannt ist. Eine Klasse hat im Allgemeinen folgende Bestandteile: Zugriffsbeschränkungen für ihre Elemente: Diese legen fest, ob andere Klassen auf ein Element dieser Klasse zugreifen dürfen oder nicht siehe Seite. Diese Funktionen werden aufgerufen, wenn ein Objekt dieser Klasse erzeugt beziehungsweise vernichtet wird. Durch einen Konstruktor kann beispielsweise Speicherplatz für das Objekt bereitgestellt und es selbst initialisiert werden.

Hier sind die eigentlichen Daten gespeichert. Attribute werden wie Variablen deklariert. Sie können bei jedem Objekt andere Werte haben. Attribute können einen Standarddatentyp haben oder selbst wieder ein Objekt einer anderen Klasse sein. Methoden können auf die Attribute und Zustände des Objekts zugreifen.

Deklaration Die Syntax zur Klassendeklaration besteht aus dem Schlüsselwort class , dann dem Namen der Klasse, gefolgt von den Klassenbestandteilen; diese sind von geschweiften Klammern eingeschlossen. Kommen wir auf unser Beispiel von Seite zurück.

Neu ist der Typ string ; dies ist eine Klasse für Zeichenketten, die wir später noch öfter verwenden werden. In den Zeilen 13 und 14 stehen die Deklarationen des Konstruktors und des Destruktors. Dies sind Funktionen, die immer dann automatisch aufgerufen werden, wenn ein Objekt von dieser Klasse erzeugt beziehungsweise vernichtet wird. Aber dazu in einem der nächsten Abschnitte mehr. Definition und Bereichsoperator Wahrscheinlich ist Ihnen nach dieser Überschrift nicht ganz klar, was jetzt schon wieder auf Sie zukommt.

Was ist denn der Unterschied zwischen Deklaration und Definition einer Klasse? Man macht ihn hauptsächlich an den Methoden fest: Eine Deklaration dient dazu, den neuen Datentyp dem Compiler bekannt zu machen. Dabei müssen Sie die Typen aller Attribute sowie die Schnittstellen Köpfe der Methoden angeben, also auch welche Parameter eine Methode benötigt und von welchem Datentyp der Rückgabewert ist.

Wie die Methoden implementiert sind, müssen Sie hier noch nicht angeben. Kurz gefasst bedeutet dies: Auf diese Weise können Sie ein Stück Prozessabstraktion verwirklichen: Andere, die Ihre Klasse verwenden wollen, müssen nur die Header-Datei, also die Deklaration kennen; die Definition kann im Verborgenen bleiben.

Wie wir später sehen werden, ist die Realität leider etwas komplizierter. Es ist nämlich auch erlaubt, die Definition einer Methode gleich inmitten der Klassendeklaration zu schreiben. Im Augenblick können Sie aber bei dieser Trennung bleiben. Dazu verwenden Sie den Bereichsoperator:: Später Seite werden wir die Möglichkeiten der Positionen, an denen Sie Deklaration und Definition unterbringen können, noch genauer fassen.

Ist sie erst einmal definiert, gilt sie als Datentyp. Wir können sie dann wie jeden anderen Datentyp verwenden und Variablen davon bilden. Man spricht bei einer Variablen, die als Typ eine Klasse hat, von einem Objekt dieser Klasse oder auch von einer Instanz der Klasse auch wenn das eine nicht ganz korrekte Übersetzung des englischen Begriffs instance ist. Zugriffsbeschränkungen Zugriffsbeschränkungen regeln, ob andere Klassen auf ein Klassenelement zugreifen dürfen oder nicht.

Dabei gibt es folgende Möglichkeiten: Die nachfolgenden Elemente und Methoden unterliegen keiner Zugriffsbeschränkung, sie können daher beliebig verändert beziehungsweise aufgerufen werden. Es gibt auch noch eine dritte Ebene, protected , die wir aber erst später -- ab Seite -- behandeln wollen. Wenn Sie eine Zugriffsbeschränkung angeben, gilt diese für alle nachfolgenden Elemente -- solange, bis eine andere Beschränkung kommt oder die Klassendeklaration endet.

Fehlt in einer Klasse die Festlegung der Zugriffsbeschränkung ganz, so werden alle Elemente als private behandelt. In obigem Beispiel haben wir die beiden Zugriffsebenen in folgender Form verwendet: Wenn Sie in Ihrem Programm etwa die Anweisung schreiben: Anders sieht es in den Methoden der Klasse selbst aus. Hier dürfen Sie stets auf alle Elemente zugreifen, natürlich auch auf die privaten. Betrachten Sie folgende Methode: Die Zugriffsbeschränkung gilt auf der Ebene der Klassen und nicht der Objekte.

Wenn in einer Methode ein Objekt derselben Klasse auftaucht, so hat die Methode Zugang zu allen Elementen des Objekts, öffentliche wie private, zum Lesen wie zum Schreiben. Freunde Wenn Sie einmal in die Lage geraten, dass Sie ohne die Zugriffsmöglichkeit auf private Elemente einer anderen Klasse nicht weiterkommen, deutet das meistens auf einen Designfehler hin. Allerdings gibt es in der Praxis durchaus Fälle, bei denen ein Verzicht auf den Zugriff einen sehr viel umständlicheren und damit meist langsameren Code mit sich bringen würde.

Damit teilen Sie dem Compiler innerhalb der Klassendeklaration mit, welche anderen Elemente vollen Zugriff auf die Klasse erhalten. Funktionen einzelne Methoden anderer Klassen ganze Klassen Im Englischen packt man diese Eigenschaft in ein leicht zweideutiges Wortspiel: Only friends may touch your private things.

Dieses Vorrecht räumer wir damit aber nur der B:: Andere Methoden von B sofern vorhanden haben kein Zugriffsrecht auf A:: Zudem haben wir in einer erneuten Vorwärts-Deklaration auf eine Klasse C hingewiesen, die an anderer Stelle deklariert werden kann, die aber hier das volle Zugriffsrecht auf A erhalten hat.

Zusammenfassung Aus diesem Abschnitt sollten Sie sich merken: Klassen haben folgende Merkmale: Um eine Methode als zu einer bestimmten Klasse zugehörig zu kennzeichnen, verwendet man den Bereichsoperator:: Ist eine Klasse einmal definiert, kann sie wie jeder andere Datentyp verwendet werden. Zugriffsbeschränkungen regeln, ob andere Klassen auf ein Klassenelement zugreifen dürfen oder nicht.

Alle auf public folgenden Elemente unterliegen keiner Zugriffsbeschränkung, während alle unter private nur innerhalb der Klasse selbst zugänglich sind. Das Schlüsselwort friend erlaubt es Funktionen, einzelnen Methoden anderer Klassen oder sogar ganzen Klassen, die Zugriffsbeschränkungen zu umgehen. Beachten Sie dabei die Zugriffsbeschränkungen und die erforderlichen Methoden.

Was versteht man unter einer Vorwärts-Deklaration? Wozu wird sie benötigt? Die Möglichkeit, Funktionen zu bilden, ist ein herausragendes Merkmal einer Programmiersprache. Ganz allgemein versteht man unter einer Funktion einen in sich geschlossenen Programmteil, der eine bestimmte Aufgabe erfüllt. Eine Funktion, die zu einer Klasse gehört, nennt man Methode. Betrachten wir folgendes Beispiel: Vorher noch ein typografischer Hinweis: Es hat sich eingebürgert, in Büchern zwei Klammern hinter Bezeichner zu setzen, die sich auf eine Funktion beziehen, zum Beispiel in Sätzen wie: Mit add erreichen Sie die Addition zweier Ganzzahlen.

Das sagt noch nichts über Art und Umfang der Argumentliste aus, sondern soll Sie lediglich daran erinnern, dass es dabei um eine Funktion und nicht um eine Variable geht. Ich will mich auch in diesem Buch daran halten. Manchmal ist es aber auch gar nicht nötig oder sinnvoll, dass eine Funktion überhaupt einen Rückgabewert hat. In diesem Fall geben Sie als Typ void an.

Was macht man nun mit einem solchen Wert? Der Programmteil, der die Funktion aufruft, kann diese an allen Stellen einsetzen, wo er sonst eine Variable oder Konstante angeben würde in obiger Form allerdings nur dort, wo lediglich der Wert benötigt wird , also etwa: Selbst wenn eine Funktion einen Wert zurückgibt, müssen Sie ihn nicht beachten. Sie dürfen auch schreiben: Argumentliste Eine Funktion kann immer nur auf den Daten arbeiten, die ihr lokal vorliegen.

Von diesen Parametern auch Argumente genannt können Sie keinen, einen oder mehrere angeben, die Sie dann durch Kommas trennen. Wenn Sie eine Funktion ohne Argumente schreiben wollen, lassen Sie den Bereich zwischen den beiden runden Klammern einfach leer -- denn die Klammern müssen Sie stets schreiben! Ansonsten geben Sie für jeden Parameter seinen Datentyp und einen Namen an, unter dem er in der Funktion bekannt sein soll.

Dieser Name kann vollkommen anders sein, als der im Hauptprogramm beim Aufruf verwendete. Funktionskörper Hier stehen die Anweisungen, die bei einem Aufruf der Funktion ausgeführt werden.

Man kann darüber streiten, wie lang Funktionen sein sollten. Es gibt Experten, die fordern, dass eine Funktion aus nicht mehr als 50 Zeilen bestehen dürfe, sonst werde sie unleserlich. Es gibt jedoch in der Praxis immer wieder Fälle, in denen längere Funktionen sinnvoll sind. Bei der objektorientierten Programmierung werden Sie allerdings ohnehin wesentlich mehr Funktionen beziehungsweise Methoden verwenden, die im Durchschnitt wesentlich kürzer sind als bei der prozeduralen Programmierung.

Innerhalb des Funktionskörpers können Sie die Funktionsparameter wie normale Variablen verwenden; zusätzlich können Sie natürlich auch noch lokale Variablen definieren. Sie dürfen sogar die Funktion selbst wieder aufrufen; man spricht dann von einer rekursiven Funktion -- aber das ist ein eigenes Thema.

Return-Anweisung Die Anweisungen im Funktionskörper werden so lange abgearbeitet, bis das Programm auf das Ende der Funktion oder eine return -Anweisung trifft. Diese erfüllt einen doppelten Zweck: Sie legen fest, welchen Wert die Funktion an das Hauptprogramm zurückliefern soll. Das kann eine Variable sein oder ein Ausdruck, eine Konstante oder der Rückgabewert einer anderen Funktion wobei Letzteres als schlechter Stil gilt.

Der Typ des angegebenen Werts muss jedoch in jedem Fall mit dem deklarierten Rückgabetyp übereinstimmen. Sie beenden die Funktion und kehren zum Hauptprogramm zurück. Jede return -Anweisung -- sei sie nun am Ende oder irgendwo inmitten des Funktionskörpers -- markiert das Ende der Abarbeitung der Funktion und den Rücksprung an die Stelle, von der aus die Funktion aufgerufen wurde.

Sie können also die Funktion schon beenden, bevor alle Anweisungen ausgeführt sind, zum Beispiel wenn eine bestimmte Bedingung erfüllt ist. Ist der Rückgabetyp void , muss am Ende der Funktion keine return -Anweisung stehen auch nicht das Schlüsselwort return , wie in folgendem Beispiel: Der Prototyp Bevor Sie eine Funktion verwenden können, müssen Sie dem Compiler zunächst mitteilen, dass es eine Funktion dieses Namens gibt, wie viele und welche Parameter sie hat und welchen Typ sie zurückliefert.

Dies geschieht mit einem so genannten Prototyp der Funktion. Der Prototyp sieht genauso aus wie die Funktion selbst bis auf den Funktionskörper; dieser fehlt und wird durch ein einfaches Semikolon ; ersetzt.

Es ist sogar erlaubt, die Namen der Argumente wegzulassen und nur ihre Typen anzugeben. Folgendes Beispiel zeigt den Umgang mit Prototypen: In main werden sie dann aufgerufen Zeilen und ab Zeile 17 definiert. Wenn das Programm aber weiter wächst, kann der Verlass auf die Reihenfolge schnell zu Problemen führen.

Am besten verwenden Sie für jede Quelltextdatei eine eigene Header-Datei. Hier ist dies haupt. Gegenüber dem obigen Code müssen Sie bei der Implementierung in getrennten Dateien dort noch einen include -Befehl für die Header-Datei mit den Funktionsprototypen einfügen, also: Beides zusammen bezeichnet man gelegentlich auch als Signatur der Funktion.

Damit erhalten Sie die Freiheit, zwei Funktionen gleichen Namens zu verwenden, die sich aber in ihren Argumenten unterscheiden. Man bezeichnet das auch als Überladung des Funktionsnamens. Wir hatten oben Seite eine Funktion add definiert, um zwei Ganzzahlen zu addieren. Nun kann man natürlich auch Dezimalbrüche addieren; das deckt unsere Funktion aber nicht ab.

Copyright © 2017 · All Rights Reserved · Maine Council of Churches