S’amuser avec le C, épisode `&((int*)-8)[3]`
(lcamtuf.substack.com)- 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
gotoexplique 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 de2 + 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 formevoid main() void;etvoid; { 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");
-
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++etvar[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 + 2pour un2d’un type particulier - L’exemple d’addition utilise les formes
typedef union {}* my_type;et(my_type)2 + 2
1 commentaires
Avis sur Lobste.rs
Plus j’en apprends sur le C, plus je comprends pourquoi les gens aiment Go
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
gotoest un computed goto expliqué ici : https://eli.thegreenplace.net/2012/07/…*, si bien quegoto *a, b, csignifiegoto *(a, b, c)et nongoto (*a), (b), (c)En revanche,
x = *a, b, cest analysé commex = *a, et les(b), (c)qui suivent deviennent simplement deux expressions sans effetEn 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 exceptionTrouver 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
En le mélangeant avec des déclarations K&R, ça devient encore plus drôle
https://godbolt.org/z/5c5vr7veE