Charles est un ingénieur en logiciel et un professeur d’université qui s’intéresse à la technologie, à la médecine, à l’économie et à la nutrition.
charles griffiths
C avancé
Pour une raison quelconque, C est votre langage de prédilection. Quelles sont les bonnes raisons de choisir C ?
Un profane vous dira que C est rapide. Au moins dans certains cas, c’est un stéréotype immérité. Toutes les autres langues sont-elles lentes en comparaison ? Aucun programmeur avancé ne le croit, et vous non plus.
C a trois avantages par rapport aux autres langages C-Like. Les voici.
- Faible surcharge. C mérite sa réputation pour sa capacité à produire des programmes exécutables qui ne sont pas beaucoup plus volumineux qu’ils ne doivent l’être. Ceci est vital pour les appareils à faible mémoire. Sur un PC moderne, cela n’a aucune importance.
- portabilité. Si vous devez cibler un matériel nouveau ou inhabituel doté d’un jeu d’instructions personnalisé ou d’un espace mémoire non plat, C et ASM sont probablement les seuls choix disponibles, bien qu’il existe des exceptions. C n’est pas particulièrement bon pour la portabilité entre les versions de Linux/Mac/Windows.
- La capacité de faire des choses dangereuses et bizarres avec la mémoire et le contrôle de flux. C’est là que C et C++ brillent vraiment.
Considérez la fonction illustrée ci-dessus. C’est une version modernisée du Duff’s Device original. Regardez-le de près si vous ne l’avez pas encore vu. A la première lecture, la plupart des programmeurs C penseront que faire pendant melanger avec Cas les déclarations doivent être une erreur. Une fois que cela s’estompe, certains suggéreront memcpy() en remplacement (mais ce n’est pas possible).
Pour un commentaire plus complet, consultez cet article.
Variantes sur un thème
Considérez la fonction illustrée ci-dessous. C’est une version modifiée du Pigeon’s Device original. L’équivalent si les déclarations suivent immédiatement après.
Pour un commentaire plus complet, en savoir plus sur Pigeon’s Device ici.
Dispositif de pigeon
charles griffiths
if (1==mode || (0==mode && test( a, b ))) return fun1( a, b ); if (2==mode || (0==mode && !test( a, b ))) return fun2( a, b ); return 0;
L’une ou l’autre technique doit être utilisée avec parcimonie pour tout programme qui sera jamais lu par des personnes. Ces conseils s’appliquent à presque toutes les techniques de niveau expert, utilisez-les rarement. Ce n’est pas parce qu’ils ne fonctionnent pas, c’est parce qu’ils sont souvent difficiles à lire et difficiles à modifier.
C est décalé, imparfait et un énorme succès.
— Dennis Ritchie, 1993
union IntFloat { int ix; float fx; }
syndicat
syndicat signifie que deux variables sont stockées au même endroit en mémoire. Cela ressemble à un structure et dans l’exemple fourni, ix et fx font référence aux mêmes données mais ont des significations très différentes. A présent, vous devez être conscient qu’un flotteur est composé du même type de bits qu’un entiermais dans un flotteur certains de ces bits sont dédiés au signe et aux chiffres significatifs de la valeur stockée, et certains à un exposant signé. Si vous avez toujours voulu jeter un coup d’œil à ces valeurs sous forme de tableau de bits bruts, syndicats sont une façon de s’y prendre. Écrivez simplement un flotteur valeur à fx et imprimez ix avec la chaîne de format %x.
Les membres d’un syndicat peut être de n’importe quel type, y compris des pointeurs, des entiers, des virgules flottantes, structures, ou autre syndicats. syndicats peut être utilisé avec typedef de la même manière qu’un structure typedefou la syndicat le nom peut être entièrement omis.
Faites défiler pour continuer
aller à
À des fins sociales, vous devez savoir que ALLER À peut être considéré comme nocif. C et C++ incluent tous deux aller à comme mot-clé, et j’ai évité d’en parler dans les trois articles précédents car personne ne devrait jamais utiliser aller à pour quelque raison que ce soit. Fin de la discussion, et merci de ne pas lire le paragraphe suivant.
aller à est une technique de niveau expert. Je peux penser à une utilisation légitime pour cela, mais il y en a probablement d’autres. Supposons que vous deviez terminer au milieu d’une boucle imbriquée et que, pour une raison quelconque, vous ne puissiez pas placer la boucle dans sa propre fonction et utiliser return. il y a votre aller à.
Volatil
la volatil mot-clé indique à C qu’une variable peut changer indépendamment d’un instant à l’autre. Il peut changer car il a été modifié dans un autre thread, ou il peut être le résultat de la lecture d’une adresse de périphérique. Quelle que soit la raison, C lira et rédigera attentivement un volatil variable de la mémoire exactement comme vous le dites, sans mise en cache sophistiquée ni optimisations logiques. S’il vous arrive de faire quelque chose de dangereux ou de bizarre avec le contrôle de flux, volatil s’assurera que vos écrits soient écrits.
Un pointeur vers un entier volatil a été déclaré ainsi.
Lit et écrit dans volatil les variables peuvent toujours être faites dans le désordre, donc volatil ne doit pas être utilisé pour implémenter des verrous, mais peut être utilisé pour une communication limitée entre les threads.
Bibliothèques standards
Le C n’a pas été inventé pour écrire de gros programmes. C n’a jamais été conçu pour gérer des structures de données avec des millions d’éléments. C a été inventé au début des années 1970 sur du matériel déjà obsolète et Ritchie a compris à juste titre que si les programmeurs avaient besoin de quelque chose de plus sophistiqué qu’un tri et une recherche binaire, ils feraient mieux de l’écrire eux-mêmes.
Cela rend le C facile à apprendre et les compilateurs croisés faciles à écrire, mais maintenant nous avons des gigaoctets de RAM. Afin d’écrire de gros programmes, de les lire plus tard et de passer facilement d’un projet C à l’autre, nous avons besoin de versions standardisées de structures de données et d’algorithmes qui seront toujours en dehors du standard C.
Si C est votre langage de prédilection, alors adoptez la simplicité. Si votre projet C devient volumineux et compliqué, choisissez ou écrivez des versions standard du projet pour les files d’attente, les arbres, les tables de hachage et tout le reste. Ne vous attendez pas à ce que C vous facilite la tâche, car ce serait un cauchemar.
Fonctions avec nombre d’arguments variable
Cela m’étonne qu’après 10 ans d’écriture en C, il y ait encore des petits coins que je n’ai pas explorés complètement.
—Tom Duff, 1983
conclusion
C’est tout ce que j’ai à dire sur la programmation en C. Pour vous, ce n’est pas la fin.
Si vous êtes arrivé jusqu’ici, la programmation est une partie importante de votre vie et vous êtes soit sur la bonne voie, soit bien au-delà du niveau d’expert de classe mondiale. En tant qu’expert, vous devez décider vous-même quand prendre conseil auprès des autres. J’ai réduit le mien au minimum, j’ai fait de mon mieux pour présenter C tel qu’il est, et j’espère que cela vous permettra d’utiliser C pour atteindre vos objectifs de la meilleure façon possible.
À mon auditoire expert : ai-je omis quelque chose ou mal expliqué quelque chose ? Faites-moi savoir dans les commentaires. Aux autres : je sais que certains d’entre vous ont lu sans la pratique et la compréhension appropriées, et j’espère que cette série vous a donné un aperçu du monde de la résolution d’énigmes avec des ordinateurs. Peut-être reviendrez-vous un jour et marcherez-vous sur le chemin de l’expert pour de vrai.
Cet article est exact et fidèle au meilleur de la connaissance de l’auteur. Le contenu est uniquement à des fins d’information ou de divertissement et ne remplace pas un conseil personnel ou un conseil professionnel en matière commerciale, financière, juridique ou technique.