1 Punkte von GN⁺ 4 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • 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 + 2 mithilfe eines union {}-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 Form void main() void; und void; { 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");
    Anzeige
  • 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++ und var[42]: demo
    • Auch einfache Addition sei auf ähnliche Weise möglich; gezeigt wird ein Programm, das für eine 2 eines bestimmten Typs das Ergebnis von 2 + 2 ausgibt: demo
    • Das Additionsbeispiel verwendet die Form typedef union {}* my_type; und (my_type)2 + 2

1 Kommentare

 
GN⁺ 4 시간 전
Lobste.rs-Kommentare
  • Je mehr ich über C lerne, desto besser verstehe ich, warum Leute Go mögen

    • Go ist kein Ersatz für C. Zig ist dafür näher dran.
      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/…

    • Genau. Noch seltsamer in diesem Kontext ist aber, dass das Komma offenbar eine höhere Priorität als * hat, sodass goto *a, b, c nicht goto (*a), (b), (c) bedeutet, sondern goto *(a, b, c)
      Dagegen wird x = *a, b, c als x = *a geparst, und die nachfolgenden (b), (c) sind einfach zwei Ausdrücke ohne Wirkung
      Eigentlich 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 definition ab. Wenn man den Parameternamen jedoch weglässt, gibt es eine Ausnahme
      So etwas herauszufinden ist nutzlos, aber es hat Spaß gemacht
  • Nicht standardkonform, aber ein weiteres lustiges Beispiel, das tcc akzeptiert

    typedef int t();  
    t main { puts ("hello world"); };  
    

    Mit K&R-Deklarationen vermischt wird es noch absurder

    typedef t(main);  
    t main t main; { t(main); }  
    

    https://godbolt.org/z/5c5vr7veE