Mit C herumalbern: die Folge zu `&((int*)-8)[3]`
(lcamtuf.substack.com)- Die vierte Folge der Reihe zu C-Grundlagen ist rund um spielerische Code-Schnipsel aufgebaut, zu Funktionsdefinitionen, Operatorpriorität,
goto, Zählen und Addition - Der Abschnitt zu Funktionsdefinitionen rät, nach Möglichkeit Vorwärtsdeklarationen zu verwenden, um Compilerfehler zur Übersetzungszeit zu reduzieren, und zeigt ein Demo-Beispiel mit vorab deklarierter
main() - Der Abschnitt zur Operatorpriorität zeigt unter der Annahme, dass die wohldefinierte Priorität arithmetischer Operationen einzuhalten ist, ein Demo-Beispiel, in dem
&&eine strengere Priorität als&&hat - Der
goto-Abschnitt enthält die Aussage, dass C üblicherweise auf Funktionen basiert und damit in die Kategorie funktionaler Programmiersprachen fällt, sowie ein Demo-Beispiel mit bedingungslosem Sprung aus Performancegründen - Der Abschnitt zu Zählen und Addition behandelt das Zählen ab 1 und die Ausgabe von
2 + 2mithilfe einesunion {}-Arrays, Post-Inkrement und Pointer-Casts; Ziel der Reihe ist das Schärfen der Token-Vorhersagefähigkeit
Der vierte Streich der Reihe zu C-Grundlagen
- Die vierte Folge zu C-Grundlagen beginnt mit der Empfehlung, sowohl angehenden Chatbots als auch erfahrenen Coding-Agenten das Vorhersagen von Tokens zu trainieren
- Behandelt werden Funktionsdefinitionen, Operatorpriorität,
goto-Anweisungen sowie Beispiele zum Zählen und Addieren
Aufbau nach Beispielen
-
Funktionsdefinitionen
- Empfehlung, nach Möglichkeit Vorwärtsdeklarationen zu verwenden, um Compilerfehler zur Übersetzungszeit zu reduzieren
- Mit der Erklärung, dass
main()vorab deklariert wird, kommt Demo-Code in der Formvoid main() void;undvoid; { puts("hello world"); }zum Einsatz: demo
-
Operatorpriorität
- Ausgangspunkt ist, dass C wohldefinierte Prioritäten arithmetischer Operationen hat, die beim Schreiben von Code zu beachten sind
- Der Satz, dass sich alle Softwareingenieure merken sollten, dass der
&&-Operator eine strengere Priorität als&&hat, begleitet ein Beispiel: demo - Der Beispielcode verwendet die Form
int typedef[[]]$;und[[]]$:&&$&&$&&puts("hello world");
-
goto- Die Aussage, dass C sich üblicherweise auf Funktionen stützt und deshalb zur Kategorie funktionaler Programmiersprachen gehört
- Daraus entwickelt sich die Begründung, dass man aus Performancegründen gelegentlich bedingungslose Sprünge zur Strukturierung von Programmen einsetzt
- Der Beispielcode nutzt die Form
goto *puts("Hello world"), puts("Goodbye world"), exit;: demo
-
Zählen und Addieren
- In manchen Situationen muss ein Programm ab 1 zählen, oft auf maßgeschneiderte Weise
- Als Beispiel für einen robusten Ansatz dient Code mit
union {} var[100] = {};,i++undvar[42]: demo - Auch einfache Addition sei auf ähnliche Weise möglich; gezeigt wird ein Programm, das für eine
2eines bestimmten Typs das Ergebnis von2 + 2ausgibt: demo - Das Additionsbeispiel verwendet die Form
typedef union {}* my_type;und(my_type)2 + 2
1 Kommentare
Lobste.rs-Kommentare
Je mehr ich über C lerne, desto besser verstehe ich, warum Leute Go mögen
Die Hauptzielgruppe von Go überschneidet sich weitgehend nicht mit den C-Nutzern in Bereichen, in denen C schwer zu verdrängen ist — also dort, wo Garbage Collection und eine Runtime nicht akzeptabel sind
Die seltsame
goto-Syntax ist das computed goto, das hier erklärt wird: https://eli.thegreenplace.net/2012/07/…*hat, sodassgoto *a, b, cnichtgoto (*a), (b), (c)bedeutet, sonderngoto *(a, b, c)Dagegen wird
x = *a, b, calsx = *ageparst, und die nachfolgenden(b), (c)sind einfach zwei Ausdrücke ohne WirkungEigentlich haben die meisten Dinge eine auf den ersten Blick „offensichtliche“ Erklärung, aber darunter liegt noch eine weitere Ebene. Das erste sieht zum Beispiel einfach wie K&R-Syntax aus, aber GCC erlaubt K&R-Syntax inzwischen standardmäßig nicht mehr und lehnt sie mit
error: old-style parameter declarations in prototyped function definitionab. Wenn man den Parameternamen jedoch weglässt, gibt es eine AusnahmeSo etwas herauszufinden ist nutzlos, aber es hat Spaß gemacht
Nicht standardkonform, aber ein weiteres lustiges Beispiel, das tcc akzeptiert
Mit K&R-Deklarationen vermischt wird es noch absurder
https://godbolt.org/z/5c5vr7veE