feste Werte

Ein fester Wert ist ein unveränderbarer Wert, der nicht aus einer Variablen oder Eingabestruktur kommt. Die Sprachen C und C++ erlauben es, folgende Werte direkt in den Programmcode niederzuschreiben:

TypBedeutungBeispiele
Boolean Ein boolscher Wert ist dasselbe wie ein Wahrheitswert. Es gibt grundsätzlich nur zwei Möglichkeiten. true, false
Integral Ein integraler Wert ist umgangssprachlich dasselbe wie eine Ganzzahl. Sie kann positiv wie negativ sein, und in C sowohl als Dezimal, Hexadezimal oder Oktalzahl dargestellt werden. 0, 1, 42, 1000000000, -150, 0xffff, 0755
Real Ein realer Wert ist eine Fliesskommazahl, also eine Zahl mit Dezimalpunkt (umgangssprachlich: mit Komma). Sie kann auch in Exponentialdarstellung geschrieben werden, die Null vor dem Dezimalpunkt kann weggelassen werden. 3.14159, 12345.67890, .707107, 1e-5, 6.022e23
Character Ein Character (Buchstabe) ist ein ASCII-Zeichen, welches normalerweise als 1-Byte-Wert codiert wird. 'A', 'x', '\n', '\0', '\x65'
String Ein String wird als Folge von ASCII-Zeichen aufgefasst mit einem automatisch angehängten '\0'. "Hallo Welt", ""
Pointer Ein Pointer ist ein Zeiger auf eine Adresse im Speicher. Mit Ausnahme des Null-Pointers sollten diese Werte nicht explizit niedergeschrieben werden, sondern nur anhand der in der Sprache eingebauten Pointer-Arithmetik. Kein Beispiel

Details

Während Variablen Werte im Speicher oder im Register des Prozessors ablegen, werden feste Werte direkt in den Programmcode integriert und durch den Compiler normalerweise direkt zu den entsprechenden Instruktionen geschrieben und verändern nie ihren Platz. Da sich diese Werte im Programmcode selbst befinden, können sie (üblicherweise) nicht geändert werden.

Boolsche Werte

Ein boolscher Wert wird auch Wahrheitswert genannt und kann nur zwei mögliche Zustände annehmen: true und false. Um diese zwei Zustände zu speichern, reicht theoretisch ein Bit aus, in C und C++ werden sie jedoch als Integral-Werte realisiert: In C wird der Wert 0 als false aufgefasst und alle anderen Werte als true. Erst in C++ wurden der Typ bool sowie die Keywords false mittels des 1-Byte-Integral-Wertes 0 und true als 1-Byte-Integral-Wert ungleich 0 (normalerweise 1) festgelegt.

Integrale Werte

Integrale Werte sind positive und negative Ganzzahlen. Negative Werte werden dabei als Zweierkomplement codiert. Die Zahl der benötigten Bytes ermittelt der Compiler anhand des erwarteten Typs an der Stelle des Wertes.

unsigned char a = 0xff; unsigned short b = 0xff; unsigned int c = 0xff;

0xff; 0x00ff; 0x000000ff;

Ein integraler Wert kann stets mit einem negativ - oder positiv + Zeichen versehen sein. Die Zahl selbst kann als Dezimalzahl (mit den Ziffern 0 bis 9), als Hexadezimalzahl (Ziffern 0 bis 9 und Buchstaben a bis f oder A bis F) mit vorangestelltem 0x oder 0X oder als Oktalzahl (Ziffern 0 bis 7) mit führender 0 geschrieben werden.

1234 -1234 +1234 0xffff 0755

Auf dem System des Autors ist es zudem möglich, Hexadezimalzahlen nach der Intel-Notation mit einem nachgestellten h (nur kleingeschrieben) anzugeben, wobei jedoch die erste Ziffer zwingend eine Zahl von 0 bis 9 sein muss. Um einen integralen Wert als unsigned zu bezeichnen, kann man ihm ein u oder U anhängen. Ein entsprechendes Suffix für signed-Werte gibt es nicht. Die Suffixe i oder I und j oder J werden vermutlich für komplexe Zahlen verwendet, wenn die entsprechende Standardbibliothek eingebunden wird, der Autor konnte jedoch keine gesicherte Quelle finden.

0f352h 255u 4i

Einige wenige Compiler erlauben zudem die Angabe von binären Werten mit einem vorangestellten 0b oder 0B oder aber nach Intel-Notation einem nachgestellten kleinen b. Beispiele wären 0b01001011 oder 11001100b. Auf dem System des Autors ist dies jedoch nicht möglich. Ein entsprechendes Pendant für Oktalzahlen ist dem Autor nicht bekannt.

Zur Kompatibilität mit (älteren) C-Dialekten ist es zudem möglich, dem Wert ein l (long) oder ll (long long) anzuhängen, um den Compiler zu zwingen, die dadurch spezifizierte Anzahl Bytes für den Wert zu verwenden. Da heutzutage jedoch ein integraler Wert fast immer 4 Bytes umfasst (int und long sind in ISO-C++ dasselbe), die zu verwendende Anzahl Bytes durch den Compiler automatisch ermittelt wird und zudem die Werte durch den Compiler häufig als Dezimalzahlen in Assembler umgewandelt werden, ist diese Angabe kaum mehr anzutreffen. Dieser Zusatz kann jedoch notwendig sein in Programmen, die mittels älteren C-Dialekten compiliert werden oder allgemein dort, wo grosse Werte möglicherweise nicht mehr in einer Variablen Platz haben. Die grossgeschriebenen Pendants L und LL bedeuten dasselbe.

1234l 0xffll

Die Suffixe können in beliebiger Reihenfolge und durchmischt auftreten.

Reale Werte

Reale Werte sind Zahlen mit Dezimalpunkt. Sie werden im Dezimalsystem geschrieben, wobei der Punkt . als Dezimalpunkt dient. Wenn vor dem Dezimalpunkt ein Null-Wert steht, so kann dieser Wert weggelassen werden. Genauso kann ein Null-Wert nach dem Dezimalpunkt weggelassen werden. Das Weglassen beider Seiten gleichzeitig ist nicht erlaubt. Der Dezimalpunkt muss in jedem Fall geschrieben werden, da der Wert ansonsten als integraler Wert aufgefasst wird.

0.1234 == .1234 9876.0 == 9876.

Eine realer Wert kann auch mittels der Exponentialdarstellung geschrieben werden bestehend aus einer positiven oder negativen Mantisse mit optionalem Dezimalpunkt und einem positiven oder negativen ganzzahligen Exponenten, wobei das e oder E als Trennelement dient. Anmerkung: Im Gegensatz zu anderen Sprachen ist in C das Trennelement d oder D nicht erlaubt. Wenn die Mantisse ganzzahlig ist, kann der Dezimalpunkt weggelassen werden.

1.234e56 1e9

Reale Werte werden in den gängigen Computern als Fliesskommazahlen realisiert, wobei in C drei Typen spezifiziert sind: float, double und long double. Ein realer Wert wie oben beschrieben hat den standard-Typ double. Mit dem Suffix f oder F wird ein float-Wert erzwungen, mit dem Suffix l oder L ein long double-Wert. Die Suffixe i oder I und j oder J sind genauso wie bei den integralen Werten erlaubt und werden auch bei realen Werten vermutlich für komplexe Zahlen verwendet, wenn die entsprechende Standardbibliothek eingebunden wird, der Autor konnte jedoch keine gesicherte Quelle finden.

3.1415f 3.1415 3.1415l 1.i

Es gibt auch die Möglichkeit, Fliesskommazahlen als Hexadezimalwerte zu schreiben. Die Syntax ist 0xM.EpP, wobei M eine positive oder negative ganzzahlige hexadezimale Mantisse, E einen positiven ganzzahligen hexadezimalen Exponenten und P eine Multiplikation der Zahl mit einem positiven oder negativen dezimalen Zweierexponenten darstellt. Der tatsächliche Wert der Fliesskommazahl berechnet sich durch (M + E/16^(hexdigits(E))) * 2^P. Somit representiert beispielsweise 0x12.34p5 durch die Berechnung (0x12 + 0x34/256) * 2^5 die Zahl 582.5. Die Verwendung von hexadezimalen Fliesskommazahlen ist heute nicht mehr gebräuchlich.

Characters

Ein Character ist in C grundsätzlich eine 1-Byte-Ganzzahl, dargestellt als ASCII-Zeichen. Ein solches Zeichen wird immer in einfachen Anführungszeichen ' ' geschrieben. Einige Dialekte von C verstehen auch multi-Characters, wo innerhalb der einfachen Anführungszeichen 2 bis 8 Zeichen stehen können, dementsprechend bezeichnen die Zeichenfolgen dann eine 2-Byte, 4-Byte oder 8-Byte-Zahl.

char x = 'A'; short y = 'AA';

Einige Zeichen können oder müssen mittels Escape-Characters geschrieben werden, wobei das Backslash-Zeichen \ als Escape-Zeichen dient. C spezifiziert folgende Escape-Characters, wobei die wichtigsten hervorgehoben sind:

\0 \a \b \t \n \v \f \r \" \' \? \\ \ooo \xxx

null (0x00) alert (0x07) backspace (0x08) tab (0x09) newline (0x0a) vertical tab (0x0b) form feed (0x0c) carriage return (0x0d) " (0x22) ' (0x27) ? (0x3f) \ (0x5c) octal \101 = 'A' hexadecimal \x51 = 'A'

Das Fragezeichen ist deswegen als Escape-Character spezifiziert, da in früheren C-Dialekten gewissen Zeichen mittels sogenannter Trigraphen geschrieben werden mussten/konnten. Da diese heutzutage nicht mehr verwendet werden, kann das Fragezeichen auch ohne Escape-Zeichen geschrieben werden. Es wird hier auf eine genauere Behandlung der Trigraphen verzichtet und auf andere Quellen verwiesen.

Strings

Ein String wird in C als eine Hintereinanderreihung von ASCII-Zeichen aufgefasst. Diese Zeichen werden in doppelten Anführungzeichen " " geschrieben, wobei die oben angesprochenen escape-Zeichen ebenfalls gültig sind. Am Ende eines Strings wird durch den Compiler automatisch ein Null-Byte (\0) angehängt, wodurch der tatsächliche Speicherplatzverbrauch des Strings jeweils 1 Byte grösser ist, als die Anzahl Zeichen, die er enthält.

#include <stdio.h> int main(){ char* str = "Hello World"; printf(str); return 0; }

Hello World

Diese Art der Speicherung von Strings mit dem angehängten Null-Byte ist typisch für C und wird oft als null-terminated-String oder manchmal als C-like-String bezeichnet. Die Standardbibliothek string.h bietet viele Funktionen, um mit diesen Strings zu arbeiten.

Pointer

Grundsätzlich gibt es nur eine einzige Adresse, die als fester Wert verwendet werden sollte: Der Null-Pointer. Dennoch: Pointer sind Adressen des Speichers und werden nach gängiger Meinung als Ganzzahlen aufgefasst, byteweise durchnummeriert von 0 bis zur letzten Adresse. Es ist somit möglich, einem Pointer eine beliebige Ganzzahl zuzuordnen. Dies brachte in früheren Jahren manchen Computer zum Absturz, heute haben die Betriebssysteme Schutzvorrichtungen, um den Speicher vor unerwünschten Adresszuordnungen zu schützen. Die Sprachen C und C++ bieten dennoch an, Adressen direkt zuzuweisen und insbesonder selbige mittels Pointer-Arithmetik zu manipulieren.