Hallo und herzlich willkommen. Hast du einmal versucht, in einem Satz und wenigen Worten zu begründen

„Wozu programmiere ich eigentlich?“

Sicherlich fallen dir viele Antworten auf diese Frage ein. Manche sind etwas länger, andere wiederum beschreiben einen speziellen Anwendungsfall. Doch im Grunde erfüllt jedes Programm denselben grundlegenden Zweck:

Verarbeiten von Daten

Dabei ist es egal, ob es sich um numerische, alphabetische, Audio- oder Videodaten handelt. Du kennst bestimmt noch viel mehr Arten von Daten. Aber egal welche, im Grunde möchtest du sie nur in eine gewünschte Form bringen.

Nimm zur Veranschaulichung eine simple Rechenaufgabe. In diesem Beispiel sind deine Daten die beiden Zahlen 4 und 6, die zu einer Summe addiert werden.

// listing1: example equation

4 + 6 = 10

Doch wie erfüllt ein Computer diesen Auftrag?

Nun, zunächst musst du beachten, dass ein Computer aus einer Recheneinheit und dem Speicher besteht. Die Recheneinheit kann eine CPU oder ein kleiner Mikroprozessor sein, der die Datenverarbeitung ausführt. Die Daten entnimmt er aus dem Speicher. Diese können entweder im flüchtigen RAM oder persistent im ROM liegen.

Die Recheneinheit nimmt den Binärcode des Programms sowie die benötigten Daten vom Speicher und führt die Aufgabe aus.

Und was ist, wenn ich die gleiche Rechenaufgabe mit anderen Zahlen berechnen möchte?

Variablen

Jetzt kommen Variablen ins Spiel. Genau wie in der Mathematik können Anweisungen als eine Funktion mit Variablen definiert werden.

Wenn du dir jetzt denkst „Oh, mein Gott, jetzt fängt er mit Mathe an…“, dann muss ich dir leider sagen, dass du daran nicht vorbeikommst. Schließlich heißen die Geräte nicht grundlos Rechner oder Recheneinheit.

Variablen sind Platzhalter. Du beschreibst deine Funktion ohne zu wissen, welche Daten später damit verändert werden sollen. Außerdem willst du das Ergebnis deiner Funktion kurz ablegen und später weiter verwenden. Dafür setzt du eine Variable und reservierst einen Platz für einen noch unbekannten Wert im Speicher. Startest du dein Programm, so wird während der Laufzeit der Wert berechnet und in der Variablen gehalten.

Die Variable hält nun zwar einen Wert, aber du kannst ihr immer wieder neue Werte zuweisen. Also steht dir der Wert nur temporär zur Verfügung. Solange, bis du die Variable für andere Daten wiederverwendest.

Den Namen der Variablen kannst du selbst bestimmen.

// listing2: equation with variables

Variable1 + Variable2 = Result

Ganz frei bei der Namensgebung bist du allerdings nicht. C++ verbietet einige Dinge und bestraft diese sofort mit Kompilierfehlern. Variablen dürfen zwar Zahlen und Buchstaben enthalten, jedoch nicht mit einer Zahl beginnen. Auch arithmetische Operatoren (+, -, etc.) sind nicht gestattet. Sobald du ein Leerzeichen setzt, interpretiert der Compiler das Ende des Namens. Außerdem gibt es reservierte Schlüsselwörter, die du nicht verwenden darfst. Eines hast du schon kennengelernt: return.

Wähle aussagekräftige Namen für deine Variablen. Das macht deinen Code leichter verständlich und zu pflegen.

Die Syntax von C++ gibt dir natürlich vor, wie Variablen zu deklarieren sind. Zuerst gibst du den Datentypen an und darauf folgt der Identifier, der Name deiner Variable.

// listing3: definition of a variable

float radius = 3.0; // datatype identifier = value;

Konstanten

Variablen halten also Werte nur temporär und können jederzeit überschrieben werden. Doch in manchen Fällen ist das nicht gewünscht. Stelle dir vor, du möchtest die Fläche oder den Umfang eines Kreises bestimmen.

// listing4: circle formulas

Area = pi * Radius * Radius;
Circumference = 2 * pi * Radius;

Egal um welchen Kreis es sich handelt, der Wert von pi bleibt gleich. pi ist eine Konstante in der Mathematik und hat einen festen Wert. Du möchtest den Wert also nie verändern und C++ hilft dir, nicht aus Versehen den Platzhalter von pi mit einem falschen Wert zu überschreiben. Du hast die Möglichkeit, diesen Variablen die Eigenschaften von Konstanten zu geben.

Die Definition in C++ ist der von Variablen sehr ähnlich. Der einzige Unterschied ist das vorangestellte Schlüsselwort const.

// listing5: definition of a constant

const float pi = 3.14159265359; // const datatype identifier = value;

Nachdem du eine Variable als Konstante mit festem Wert definiert hast, kannst du keine Änderungen während der Programmlaufzeit mehr vornehmen. Zuweisungen an eine Konstante führen zu Fehlern beim Kompilieren.

Literale

Bis hierher kein Problem. Es gibt Variable, deren Inhalt verändert werden kann, und es gibt Konstanten, die während der Laufzeit unveränderlich sind.

Dazu kommen jetzt die Literale. Literale sind feste Werte mit einer bestimmten Notation im Quellcode. Im Gegensatz zu Variablen oder Konstanten haben sie keinen Bezeichner, sondern sind nur ihr Wert. Klingt sehr kryptisch. Deshalb ein Beispiel.

// listing6: literals

int aNumber = 2;
int aHexValue = 0x10;
char aCharacter = 'C';

In listing6 siehst du drei Variablen, denen jeweils ein Literal in der Notation ihres Datentyps zugewiesen wird. 2 ist ein fester Wert ohne Bezeichner im Quellcode, also ein Literal. aNumber ist die Variable, die diesen beim Aufruf repräsentiert.

Genauso sind die beiden anderen Zeilen zu verstehen. 0x10 ist eine Hexadezimalzahl und 'C' das Zeichen C. Ich habe nur drei verschiedene Literale zur Veranschaulichung der unterschiedlichen Notationen gewählt. Es gibt noch weitere, doch ich denke, das Konzept von Literalen ist damit verständlich.

Unterschied zwischen Deklaration und Definition

Dir sind sicherlich schon die Begriffe Deklaration und Definition über den Weg gelaufen. Spätestens in diesem Blogeintrag hast du sie gelesen. Oft werden die beiden miteinander verwechselt. Dabei ist die Unterscheidung gar nicht so schwierig.

Die Deklaration besteht aus zwei Angaben: Datentyp und Identifier. Der Identifier ist der Name einer Variablen, eines Objekts oder einer Funktion. Er wird mit der Beschreibung des Datentyps beim Deklarieren dem Compiler vorgestellt.

Hier ein paar Beispiele für Deklarationen.

// listing7: declarations

int aNumber;                        // variable with integer datatype
double aFunction();                 // function with double return value
double aMethod(int i, double d);    // function with arguments

Jetzt gut aufgepasst! Was geschieht nun bei einer Definition? Hierbei wird der Identifier initialisiert. Was bedeutet das? Bisher hast du mit der Deklaration einen Platz im Speicher reserviert und mit Namen sowie dem Datentyp, der dort gehalten werden soll, versehen.

Beim Initialisieren definierst du, was der Linker zu diesen Einheiten, auch Entities genannt, referenzieren soll.

Ein schwieriger Satz, aber mit der Erweiterung des vorherigen Beispiels von einer Deklaration zu einer Definition in listing8 wirst du es verstehen.

// listing8: definitions

int aNumber {6};    // initialization

double aFunction()  // definition
{
    return -3.5;
};

double aMethod(int i, double d) // definition
{
    return i + d;
};

Du kannst die Deklaration auch direkt durch eine Definition ersetzen. Aber definieren musst du immer und das exakt nur einmal pro Deklaration! Vergisst du eine Definition, weiß der Linker nicht, welche Referenz zu der Deklaration gehört, und wird sich mit einer Fehlermeldung beschweren. Wenn du eine Sache mehr als einmal definierst, wird der Linker nicht entscheiden können, welche Referenz er nehmen soll, und meckert über doppelt verwendete Symbole.

int aNumber; ist die Definition von aNumber. Obwohl die Schreibweise identisch zur Deklaration ist. Im C++-Standard ist die Definition wie folgt definiert:

A declaration is a definition unless it declares a function without specifying the function’s body (8.4)

§3.1/1 ISO International Standard ISO/IEC 14882:2014

int aNumber {6}; ist die Initialisierung der Variablen. Ihr wird hierbei direkt bei der Deklaration ein erster Wert übergeben. Bei allen folgenden Wertübergaben an die Variable spricht man von einer Zuweisung.

Das bleibt hängen

Wir haben uns heute mit Variablen und Konstanten beschäftigt. Du weißt nun, wie du Variablen in C++ deklarierst und definierst. Mit dem Schlüsselwort const machst du Variablen unveränderlich. Und du kennst den Unterschied zwischen einer Deklaration und einer Definition.

Außerdem ist dir bewusst, dass eine Variable ein Platzhalter mit Namen für Daten im Speicher ist. Wieviel Platz reserviert wird, schauen wir uns im nächsten Blogeintrag an. Da setzen wir uns genauer mit Datentypen auseinander.

Ich wünsche dir maximalen Erfolg!


Quellen

  • [1] B. Stroustrup, A Tour of C++. Pearson Education, 2. Auflage, 29. Juni 2018.
  • [2] B. Stroustrup, Programming: Principles and Practice Using C++. Addison Wesley, 2. Auflage, 15. Mai 2014.
  • [3] U. Breymann, Der C++ Programmierer. C++ lernen – professionell anwenden – Lösungen nutzen. Aktuell zu C++17. München: Carl Hanser Verlag GmbH & Co. KG; 5. Auflage, 6. November 2017