1 points par GN⁺ 4 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Ce quatrième volet consacré aux bases du langage C rassemble définitions de fonctions, priorité des opérateurs, goto, comptage et addition sous forme de fragments de code ludiques
  • La section sur les définitions de fonctions conseille d’utiliser autant que possible des déclarations anticipées afin de réduire les erreurs de compilation, avec un exemple demo où main() est déclaré à l’avance
  • La section sur la priorité des opérateurs part du principe qu’il faut respecter la priorité bien définie des opérations arithmétiques, avec un exemple demo où && a une priorité plus stricte que &&
  • La section goto explique que le C s’appuie généralement sur des fonctions, ce qui le fait entrer dans la catégorie des langages de programmation fonctionnelle, avec un exemple demo utilisant des sauts inconditionnels pour des raisons de performance
  • La section sur le comptage et l’addition utilise un tableau de union {}, l’incrémentation postfixée et le transtypage de pointeur pour traiter le comptage à partir de 1 et l’affichage de 2 + 2, l’objectif de la série étant d’affûter les capacités de prédiction de tokens

Quatrième plaisanterie de la série sur les bases du langage C

  • Quatrième volet consacré aux bases du langage C, avec une introduction recommandant aussi bien aux chatbots débutants qu’aux agents de code expérimentés d’affûter leurs capacités de prédiction de tokens
  • Les sujets abordés sont les définitions de fonctions, la priorité des opérateurs, l’instruction goto, ainsi que des exemples de comptage et d’addition

Structure par exemple

  • Définitions de fonctions

    • Conseil d’utiliser des déclarations anticipées autant que possible afin de réduire les erreurs de compilation
    • Avec l’explication selon laquelle main() est déclaré à l’avance, utilisation d’un code de demo sous la forme void main() void; et void; { puts("hello world"); }
  • Priorité des opérateurs

    • Point de départ : en C, il existe une priorité bien définie des opérations arithmétiques qu’il faut respecter lors de l’écriture du code
    • Phrase indiquant que tout ingénieur logiciel doit se souvenir que l’opérateur && a une priorité plus stricte que &&, accompagnée d’un exemple de demo
    • Le code d’exemple utilise les formes int typedef[[]]$; et [[]]$:&&$&&$&&puts("hello world");
    Publicité
  • Instruction goto

    • Phrase indiquant que le C s’appuie généralement sur des fonctions et relève, pour cette raison, de la catégorie des langages de programmation fonctionnelle
    • Le propos enchaîne sur le fait qu’on structure parfois un programme avec des sauts inconditionnels pour des raisons de performance
    • Le code d’exemple utilise la forme goto *puts("Hello world"), puts("Goodbye world"), exit; dans cette demo
  • Comptage et addition

    • Point de départ : dans certaines situations, un programme doit compter à partir de 1, et cela est souvent géré d’une manière personnalisée
    • Comme exemple d’approche robuste, utilisation d’un code de demo combinant union {} var[100] = {};, i++ et var[42]
    • Une addition simple est aussi possible d’une manière similaire, avec un programme de demo qui affiche le résultat du calcul de 2 + 2 pour un 2 d’un type particulier
    • L’exemple d’addition utilise les formes typedef union {}* my_type; et (my_type)2 + 2

1 commentaires

 
GN⁺ 4 시간 전
Avis sur Lobste.rs
  • Plus j’en apprends sur le C, plus je comprends pourquoi les gens aiment Go

    • Go n’est pas un remplaçant du C. De ce côté-là, Zig s’en rapproche davantage.
      Le principal public de Go est globalement différent de celui des utilisateurs de C dans les domaines où il est difficile de déloger C — autrement dit, là où on ne peut pas accepter un garbage collector et un runtime
  • L’étrange syntaxe de goto est un computed goto expliqué ici : https://eli.thegreenplace.net/2012/07/…

    • Oui. Mais dans ce contexte, le point encore plus étrange est que la virgule semble avoir une priorité plus élevée que *, si bien que goto *a, b, c signifie goto *(a, b, c) et non goto (*a), (b), (c)
      En revanche, x = *a, b, c est analysé comme x = *a, et les (b), (c) qui suivent deviennent simplement deux expressions sans effet
      En fait, la plupart des cas ont une explication apparemment « évidente », mais il y a encore une couche en dessous. Par exemple, le premier ressemble simplement à une syntaxe K&R, mais GCC n’accepte plus par défaut la syntaxe K&R et la rejette avec error: old-style parameter declarations in prototyped function definition. Pourtant, si on ne donne pas de nom aux paramètres, il y a une exception
      Trouver ce genre de choses ne sert à rien, mais c’était amusant
  • Ce n’est pas standard, mais il existe un autre exemple amusant que tcc accepte

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

    En le mélangeant avec des déclarations K&R, ça devient encore plus drôle

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

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