
C: Beispiele und Erklärung
Reifegrad und Grenzen: begrenzt
Umgesetzter Umfang: Referenzfrontend für native Windows-x64-EXE/DLLs mit dokumentierten C89–C2y-Modi, Präprozessor, Windows-ABI und ausgewählten GCC/MSVC-Erweiterungen.
Grenzen: Keine vollständige Standardkonformität; long double ist 64 Bit, _BitInt reicht bis 128 Bit, und einzelne Sprach-, Assembler- und Linkerformen fehlen.
C unterstützte Sprachformen und Abgrenzung
Die sprachspezifische Referenz der unterstützten Befehle und des Umfangs mit durchsuchbaren Kategorien und klaren Grenzen öffnen.
Umfangsreferenz öffnenDer C-Eingang verwendet main und C-Ausdrücke. Ein return-Wert kann als Prozess-Exitcode geprüft werden; printf ist dagegen eine Ausgabe.
Zwölf Kurzbeispiele und ein größeres Programm. Wählen Sie ein Thema oder arbeiten Sie die Beispiele der Reihe nach durch.
1. 1 + 2 + 3 + 4 + 5 = 15
Die Zahlen 1 bis 5 werden zu 15 addiert. Der Rückgabewert 15 wird als Prozess-Exitcode geprüft.
#include <stdio.h>
int main(void) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
return sum; /* 15 */
}Erwarteter Exitcode: 15
PBXB64.exe sum15-c.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Nativ geprüft mit dem V22-Kandidaten vom 30.09.2026; Prüfung mit dem finalen Compiler noch ausstehend.
2. Der kleinste Ergebnisvertrag
main gibt 42 zurück. Das Programm schreibt nichts auf die Konsole. In PowerShell liest $LASTEXITCODE den Rückgabewert des zuletzt gestarteten Prozesses.
int main(void) { return 42; }
Erwarteter Exitcode: 42
PBXB64.exe simple.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.
3. Hexadezimale Maske mit &
0xFF & 0x0F lässt nur die unteren vier Bits stehen und ergibt 15. Der bedingte Ausdruck liefert 0 bei korrektem Ergebnis und sonst 1. Das ist eine Prüfung innerhalb des Programms.
int main(void)
{
return (0xFF & 0x0F) == 15 ? 0 : 1;
}
Erwarteter Exitcode: 0
PBXB64.exe test_hex_integer_bitwise.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.
4. Mehrere Arten von Kontrollfluss
Ablauf Schritt für Schritt
- Die erste Schleife summiert 0 bis 9 zu 45; while zählt auf 0 zurück und do-while erhöht auf 5.
- switch setzt sum auf 10. Die nächste Schleife überspringt 2 und addiert 0 + 1 + 3 + 4 zu 18.
- goto erreicht die Marke done. Der feste Rückgabewert 42 prüft den Ablaufabschluss, nicht jeden Zwischenwert separat.
int main() {
int i, sum = 0;
/* for loop */
for (i = 0; i < 10; i++) sum += i;
/* while loop */
while (sum > 0) sum--;
/* do-while loop */
do { sum++; } while (sum < 5);
/* switch with break and default */
switch (sum) {
case 5: sum = 10; break;
default: sum = 0;
}
/* continue */
for (i = 0; i < 5; i++) {
if (i == 2) continue;
sum += i;
}
/* goto */
if (sum == 18) goto done;
sum = 99;
done:
return 42;
}
Erwarteter Exitcode: 42
PBXB64.exe c-test_c_stmts.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
5. Initialisierte und nullinitialisierte globale Daten
Ablauf Schritt für Schritt
- global_a und global_b werden mit 10 und 20 definiert.
- global_c hat statische Speicherdauer und wird ohne expliziten Initialisierer auf 0 gesetzt.
- Der ternäre Ausdruck liefert 0, wenn die Summe 30 stimmt, sonst 1.
/* PBXB64: C Global Variable Test */
int global_a = 10;
int global_b = 20;
int global_c;
int main(void)
{
int sum = global_a + global_b + global_c;
return (sum == 30) ? 0 : 1;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_globals.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
6. Zeigerdifferenz innerhalb eines Arrays
Ablauf Schritt für Schritt
- last zeigt auf das vierte Element des Arrays values.
- last - values ist 3 in Einheiten von int-Elementen, nicht in Byte.
- Die umgekehrte Differenz ist -3. Beide Zeiger gehören zum selben Array.
int main(void)
{
int values[4] = { 10, 20, 30, 40 };
int *last = &values[3];
if (last - values != 3) return 1;
if (values - last != -3) return 10 + (values - last);
return 0;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_c_pointer_difference_array.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
7. Die Adresse eines Compound-Literals
Ablauf Schritt für Schritt
- (uint8_t){0} erzeugt ein initialisiertes Objekt innerhalb von main.
- & nimmt die Adresse dieses Objekts und übergibt sie an takes_ptr.
- Der Test prüft einen nichtnullen Zeiger; seine Lebensdauer genügt für den unmittelbaren Funktionsaufruf.
typedef unsigned char uint8_t;
int takes_ptr(uint8_t* value)
{
return value != 0;
}
int main(void)
{
return takes_ptr(&(uint8_t){0}) ? 0 : 1;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_compound_literal_address.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
8. Eine Struktur als Rückgabewert
Ablauf Schritt für Schritt
- Pair besitzt zwei long long-Felder.
- (Pair){0} initialisiert beide Felder mit 0 und wird als Struktur zurückgegeben.
- main liest Feld a und wandelt es für den Prozessrückgabewert in int um.
typedef struct Pair {
long long a;
long long b;
} Pair;
Pair make_pair(void)
{
return (Pair){0};
}
int main(void)
{
return (int)make_pair().a;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_compound_literal.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
9. Modulinterne Daten und Funktion
Ablauf Schritt für Schritt
- static_val besitzt den Wert 42 und ist auf dieses Übersetzungsmodul beschränkt.
- Die ebenfalls static deklarierte Funktion add_static addiert ihren Parameter dazu.
- add_static(10) muss 52 liefern; main prüft diesen Wert.
static int static_val = 42;
static int add_static(int x)
{
return x + static_val;
}
int main(void)
{
if (add_static(10) != 52) return 1;
return 0;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_static_extern.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
10. Gleitkommawerte als logische Bedingungen
Ablauf Schritt für Schritt
- d enthält 0.0 und gilt in einer logischen Bedingung als falsch.
- d || 1 ist wahr, während d && 1 falsch ist.
- Die beiden if-Anweisungen verlassen main nur bei einem falschen Ergebnis.
int main(void)
{
double d = 0.0;
if (!(d || 1)) return 1; /* 0.0 || 1 must be true */
if (d && 1) return 2; /* 0.0 && 1 must be false */
return 0;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_float_logical.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
11. Einen Funktionszeiger zuweisen
Ablauf Schritt für Schritt
- Callback benennt einen Zeigertyp für Funktionen mit einem int-Parameter und int-Ergebnis.
- callback_impl wird ohne & einem solchen Zeiger zugewiesen.
- Der Test prüft cb != 0; er ruft die Funktion noch nicht auf.
typedef int (*Callback)(int value);
static int callback_impl(int value)
{
return value + 1;
}
int main(void)
{
Callback cb = callback_impl;
return cb != 0 ? 0 : 1;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_function_designator_pointer.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
12. Gleitkommaliterale ohne führende Null
Ablauf Schritt für Schritt
- Die Schreibweise .5 steht für 0.5 mit dem Typ double.
- Das Suffix f in .25f verlangt den Typ float.
- Beide Werte werden mit den entsprechenden Schreibweisen mit führender Null verglichen.
int main(void)
{
double x = .5;
float y = .25f;
if (x != 0.5) return 1;
if (y != 0.25f) return 2;
return 0;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_c_leading_dot_float.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
Großes Beispiel: Komplexe Werte berechnen und prüfen
Ablauf Schritt für Schritt
- __builtin_complex bildet Werte aus Real- und Imaginärteil; dc ist 1 + 2i.
- Die Addition ergibt 3 + 5i, die Multiplikation mit 2 + 0i ergibt 2 + 4i.
- creal und cimag lesen die Teile einzeln. Fehlercodes 1 bis 5 unterscheiden die Prüfungen; der erfolgreiche Abschluss liefert 0.
/* PBXB64 C frontend: exercise complex-number value lowering
* (c_frontend_lexer_value.c: c_value_to_ir, c_complex_parts_from_value,
* c_emit_complex_temp, c_emit_complex_binary, c_emit_complex_extract_part).
*/
int main(void)
{
float _Complex fc = __builtin_complex(3.0f, 4.0f);
double _Complex dc = __builtin_complex(1.0, 2.0);
/* complex addition and multiplication */
double _Complex sum = dc + __builtin_complex(2.0, 3.0);
double _Complex prod = dc * __builtin_complex(2.0, 0.0);
double r = creal(sum);
double i = cimag(sum);
if (r != 3.0) return 1;
if (i != 5.0) return 2;
if (creal(prod) != 2.0) return 3;
if (cimag(prod) != 4.0) return 4;
/* scalar-to-complex conversion through c_complex_parts_from_value */
double _Complex from_real = __builtin_complex(7.0, 0.0);
if (creal(from_real) != 7.0) return 5;
(void)fc;
return 0;
}
Erwarteter Exitcode: 0
PBXB64.exe c-test_c_complex.c -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
Alle Quellen dieser Lernseite
Jedes Beispiel hat einen eigenen Ordner; die README nennt die jeweiligen Compileraufrufe. Enthaltene Includes behalten ihre passenden Pfade.
Alle 13 Beispiele als ZIPBridging
Eine C-Funktion mit int64_t-Parametern lässt sich vom B64-Beispiel aufrufen. Der Symbolname und die Typen müssen zum extern-Vertrag passen.
Vollständige Quellenpaare ansehen