Die Programmiersprache C wurde Anfang der 70er Jahre von Dennis Ritchie entwickelt. Sie ist sehr leistungsstark und effizient. Daher stellt sie auch die Basis vieler neuer moderner Programmiersprachen dar.
Dieser Artikel ist eine kurze Zusammenfassung der wichtigsten Eigenschaften der Programmiersprache und ihrer Syntax.
Eigenschaften
- Ermöglicht schnelle und direkte Speicherzugriffe
- Case-sensitiv
- Null-basierter Index
- Keine objektorientierte Programmiersprache (vgl. C++)
- Nicht typsicher
Syntax
In C folgt jedem Befehl ein Semikolon, außer nach Präprozessoranweisungen.
Kommentare
// Einzeiliger Kommentar /* Mehrzeiliger Kommentar */
Datentypen
Für für die Größenordnung der Datentypen in C gilt:char
≤ short int
≤ int
≤ long int
≤ long long int
.
Anmerkung: Empfohlen wird die Verwendung der neuen Integer-Datentypen, die im C99-Standard definiert wurden, da hier gewährleistet ist, dass die Größe der Datentypen bei allen Compilern gleich groß ist. Bei den alten Integer-Datentypen kann die Größe je nach Compiler unterschiedlich sein. Auch die Genauigkeit (signifikante Nachkommastellen) von Gleitkommazahlen ist abhängig vom Compiler.
Neuer Datentyp | Alter Datentyp | Größe | Wertebereich | |
---|---|---|---|---|
int8_t | char | 1 Byte | -128 bis 127 |
|
uint8_t | unsigned | char | 1 Byte | 0 bis 255 |
int16_t | int | 2 Byte | -32.768 bis 32.767 |
|
uint16_t | unsigned | int | 2 Byte | 0 bis 65.535 |
int32_t | long | 4 Byte | -2.147.483.648 bis 2.147.483.647 |
|
uint32_t | unsigned | long | 4 Byte | 0 bis 4.294.967.295 |
int64_t | long long | 8 Byte | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 |
|
uint64_t | unsigned | long long | 8 Byte | 0 bis 18.446.744.073.709.551.615 |
Datentyp | Größe | Wertebereich | |
---|---|---|---|
Kein bzw. beliebiger Typ | |||
void | |||
Boolsche Zahl | |||
bool | 1 Byte | 0 (false) oder 1 (true) |
|
Zeichen (natürliche Zahlen) | |||
signed |
char char |
1 Byte | -128 bis 127 |
unsigned | char | 1 Byte | 0 bis 255 |
Natürliche Zahlen | |||
signed signed |
short short int short short int |
2 Byte | -32.768 bis 32.767 |
unsigned unsigned |
short short int |
2 Byte | 0 bis 65.535 |
signed |
int int |
2 Byte | -32.768 bis 32.767 |
unsigned | int | 2 Byte | 0 bis 65.535 |
signed signed |
long long int long long int |
4 Byte | -2.147.483.648 bis 2.147.483.647 |
unsigned unsigned |
long long int |
4 Byte | 0 bis 4.294.967.295 |
signed signed |
long long long long int long long long long int |
8 Byte | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 |
unsigned unsigned |
long long long long int |
8 Byte | 0 bis 18.446.744.073.709.551.615 |
size_t | Maximales unsigned int (Prozessorabhängig) | ||
Gleitkommazahlen | |||
float | 4 Byte | 1,175494351E-38 bis 3,402823466E+38 |
|
double | 8 Byte | 2,2250738585072014E-308 bis 1,7976931348623158E+308 |
|
long double | 16 Byte | 3.4E-4932 bis 1.1E+4932 |
Variablen & Arrays
bool bZustand = true; int iZahl = 3; int iZahl1, iZahl2 = 7; float fKommazahl = 42.69; int iVektor[4] = {1,2,3,4}; int iMatrix[2][3] = {{1,2,3},{4,5,6}}; char cZeichen = 'S'; char cZeichenkette[] = "Hallo Welt!";
Schlüsselwörter für Variablen
- const: Konstante
- static: Variable wird nach einem Anweisungsblock nicht verworfen, sondern speichert ihren Wert bis zum nächsten Aufrufen des Anweisungsblocks
- register: Variable wird optimiert für schnelle und häufige Zugriffe als Registervariable im Prozessor gespeichert (wird bei modernen Compilern nicht empfohlen, da diese selbstständig Optimierungsaufgaben übernehmen)
- volatile: Variable kann sich jederzeit ändern (z.B. durch eine Interrupt-Routine) und wird daher nicht optimiert und immer direkt aus dem Hardwarespeicher gelesen
- extern: Variable ist in einem anderen C-File/H-File deklariert und verweist auf diese
Definition eines Datentyps
typedef unsigned long ulong; //ulong = unsigned long ulong iZahl = 24;
Strukturierte Datentypen
typedef struct _Person { char Name[30]; int Alter; float Groesse; } Person; Person sPersonen[10];
Union-Datenstruktur
Eine Union-Datenstruktur ähnelt einem strukturierten Datentyp, jedoch mit dem Unterschied, dass alle Untervariablen die selbe Speichergröße belegen. Der Speicherbedarf wird durch das größte Element bestimmt.
typedef union _Fahrzeug { typedef struct _Auto { int Typ; // 2 Byte int Farbcode; // 2 Byte } Auto; typedef struct _Fahrrad { bool Einrad; // 1 Byte int Modell; // 2 Byte int Farbcode; // 2 Byte } Fahrrad; } Fahrzeug; typedef struct _Mobil { int Datentyp; // Typ der Union-Datenstruktur Fahrzeug sFahrzeug; // 5 Byte } Mobil;
Enumeration
enum Farbe {rot, gruen, blau}; /* rot = 0 gruen = 1 blau = 2 */ enum Groesse { xs, s = 2, m, l = 2, xl }; /* xs = 0 s = 2 m = 2 l = 2 xl = 4 */
Zeiger
int iZahl; // Variable vom Typ Integer int *pZeiger; // Zeiger mit Sprungweite Integer (2 Byte) pZeiger = &iZahl; // Adresse von iZahl in pZeiger speichern *pZeiger = 180; // An der Adresse von pZeiger den Wert 180 zuweisen (iZahl ist jetzt also 180) char str[20]; // Zeichenkette mit 20 Zeichen char *pStr; // Zeiger mit Sprungweite Character (1 Byte) pStr = str; // Anfangsadresse der Zeichenkette in pStr speichern (Arrays sind bereits Zeiger) Person sMensch; // Variable vom Strukturtyp Person Person *pMensch; // Pointer mit Sprungweite des Strukturtyps Person pMensch = &sMensch; // Adresse von sMensch in pMensch speichern pMensch->Alter = 18; // An der Adresse des Unterelements Alter von pMensch den Wert 18 zuweisen (sMensch.Alter ist jetzt also 18)
Standard-Bibliotheken
<stdlib.h>
// Standard-Bibliothek<stdio.h>
// Input Output Bibliothek<stdbool.h>
// Boolsche Zahl<limit.h>
// Natürliche Zahlen<float.h>
// Gleitkommazahlen<stdint.h>
// Neue Integer-Datentypen nach C99-Standard
Beispiel-Programmcode: Hello World
//Bibliotheken #include <stdlib.h> #include <stdio.h> int main() { printf("Hello World!\n"); //Ausgabe auf der Konsole system("pause"); //Programm anhalten return EXIT_SUCCESS; //Programm beenden }
Literatur
- Theis, T.: Einstieg in C. Für Programmiereinsteiger geeignet. Rheinwerk Computing. 2020
- Wolf, J.: Grundkurs C. Rheinwerk Computing. 2016
- Wolf, J.; Krooß, R.: C von A bis Z. Das umfassende Handbuch. Rheinwerk Computing. 2009