⚙️ C & C++ Systems Engineering

C 01: C-Syntax, Datentypen, Format-Specifier & I/O

Tauche ein in die hardwarenahe Welt von C: Verstehe die Compilation Pipeline, primitive Speichertypen, sizeof, Format-Specifier und sichere Ein-/Ausgabe mit printf & snprintf.

🏗️ 1. Das C-Kompilationsmodell

C ist eine kompilierte, maschinennahe Systemsprache. Im Gegensatz zu interpretierten Sprachen durchläuft C-Quellcode vier fundamentale Phasen, bevor er als native Binärdatei direkt von der CPU ausgeführt wird:

[ Quellcode (.c / .h) ] 
         │
         ▼ (1. Präprozessor: Löst #include, #define, Makros auf)
[ Präprozessierter Code (.i) ]
         │
         ▼ (2. Compiler: Übersetzt C in hardwarenahen Assemblercode)
[ Assembler-Code (.s) ]
         │
         ▼ (3. Assembler: Generiert binären Maschinencode / Maschinensprache)
[ Objektdatei (.o / .obj) ]
         │
         ▼ (4. Linker: Verknüpft Objektdateien & C-Standard-Bibliothek libc)
[ Ausführbare Binärdatei (ELF / .exe) ]
🏭 Didaktische Analogie: Vom Bauplan zum fertigen Motor

Präprozessor: Ersetzt alle Textbausteine und kopiert Blaupausen (#include <stdio.h>) in deine Werkstatt.

Compiler & Assembler: Die CNC-Fräse, die den Bauplan in millimetergenaue Metallkomponenten (Maschinencode 0101...) übersetzt.

Linker: Der Chefmechaniker, der Motor, Getriebe und Treibstofftank aus der Standard-Bibliothek zu einem fahrbereiten Rennwagen zusammenschraubt!

💾 2. Primitive Datentypen & Speichergrößen

In C besitzt jeder Datentyp eine feste Repräsentation im Arbeitsspeicher. Mit dem Operator sizeof() ermittelst du die exakte Byte-Größe zur Compile-Zeit:

C-Datentyp Typische Größe Wertebereich Format-Specifier
char 1 Byte (8 Bit) -128 bis 127 (ASCII-Zeichen) %c
int 4 Bytes (32 Bit) -2.147.483.648 bis +2.147.483.647 %d / %i
float 4 Bytes (32 Bit) ~6-7 signifikante Dezimalstellen %f
double 8 Bytes (64 Bit) ~15-17 signifikante Dezimalstellen %lf / %f
size_t 8 Bytes (64-Bit System) Vorzeichenlose Array-/Speichergröße %zu
void* / Pointer 8 Bytes (64-Bit System) Hexadezimale Speicheradresse %p

⚠️ Typ-Konvertierung (Type Casting) & Ganzzahldivision

Wenn zwei Ganzzahlen dividiert werden, führt C eine Ganzzahldivision durch (Nachkommastellen werden abgeschnitten). Verwende expliziten Type-Cast:

int summe = 15;
int anzahl = 2;

// FALSCH: double avg = summe / anzahl;       // Ergibt 7.0 (Datenverlust!)
// RICHTIG:
double avg = (double)summe / (double)anzahl;  // Ergibt 7.5

🛡️ 3. Formatierte Ausgabe & Buffer-Sicherheit mit snprintf

In Produktions-C ist Buffer-Overflow der gefährlichste Sicherheitsfehler. Verwende niemals unbegrenztes sprintf, sondern immer snprintf mit Buffer-Größe:

#include <stdio.h>

char buffer[64];
int sensor_id = 42;
double temp = 23.456;

// Sicher formatieren mit Längenbegrenzung:
snprintf(buffer, sizeof(buffer), "Sensor #%03d: %.2f C", sensor_id, temp);
// Ergebnis in buffer: "Sensor #042: 23.46 C"

🎯 Aufgaben & Checkliste in aufgabe.c

💡 Systems Pro-Tipp: Format-Specifier Genauigkeit

Mit %.2f rundet printf die Fließkommazahl für die Anzeige kaufmännisch auf 2 Nachkommastellen. Mit %03d erzwingst du führende Nullen für dreistellige Sensornummern!

💻 In Web-IDE öffnen → Weiter zu C 02 →