Mon expérience actuelle avec la programmation est limitée à pirater des scripts shell et de l'assemblage dans le passé. Cependant, j'ai appris la syntaxe de base du code C au collège. P>
Je veux apprendre à écrire un code C efficace, je suis confus pour commencer avec la programmation K & R ou C: une approche moderne. Devrais également étudier certains livres d'algorithmes aux côtés de ce que je ne finirai pas d'écrire un code inefficace dès le début? P>
7 Réponses :
Ne vous inquiétez pas trop de efficace em> Code à ce stade. Concern-vous plus avec le code clair et lisible. P>
En règle générale, garder des fonctions petites, exécuter une tâche. Si cela prend trop de phrases pour décrire une fonction fait, il a probablement besoin décomposer en fonctions plus petites. P>
Utiliser des noms de variables descriptives, plutôt que x et n etc. P>
Commencez par écrire des programmes que vous apprécierez le développement, plutôt que « ennuyeux exercices que le livre vous dit de le faire. » Cependant, faire suivre les conseils et les directives du livre. P>
Tout le monde a son propre style, ne vous inquiétez pas si votre style p> ne correspond pas tout à fait de la personne suivante.
Et surtout, profiter! Si vous trouvez apprendre une chose un peu ennuyeux, passer à autre chose, il y a toujours beaucoup à apprendre. P>
EDIT: En outre, ne pas essayer de courir avant de pouvoir marcher - je pense en particulier a) des pointeurs et b) l'allocation de mémoire dynamique. Il n'y a pas besoin d'utiliser l'un d'eux à ce stade précoce jusqu'à ce que vous êtes à l'aise. P>
Considérez également que le code simple et clairement écrit peut également être plus rapide i> code. Il y a eu un fil récent où quelqu'un a déclaré que son professeur a affirmé que l'utilisation de l'inscription au tableau pour des matrices multidimensionnelles ( arr [i] [j] code>) était plus lente que l'utilisation de l'arithmétique du pointeur ( * (* (A + i) + j) code>). S'avère que sur au moins une plate-forme (GCC / Linux / X86), ce n'est pas vrai; La deuxième forme est comprise jusqu'à 20% plus lente. Les compilateurs sont assez intelligents et savent comment générer un code efficace pour des opérations communes.
"En règle générale, gardez les fonctions petites, effectuant une tâche. Si cela prend trop de phrases pour décrire ce qu'on fonctionne, il a probablement besoin de décomposer en fonctions plus petites." Ce n'est pas parfaitement correct ... vous pouvez écrire de longues fonctions à l'avant (tant qu'ils ne sont pas en désordre) et rompre la fonctionnalité plus tard. Ne pas implémenter Microsoft Windows afin de créer un jeu de pong; Ajoutez plus de code comme vous en avez besoin.
Vous pouvez imiter la programmation orientée objet. P>
Définir des entités en définissant des fichiers contenant des structures et des fonctions opérant sur ces structures. Marquer des fonctions qui n'ont pas besoin d'être vues à l'extérieur comme statique. Cela les gardera cachés, de sorte que vous polluez moins l'espace de noms. Créez une nouvelle structure avec une fonction Je vous suggère d'apprendre du POO avec Python et d'appliquer les mêmes concepts. P> nouvelle code> qui renvoie un pointeur sur la nouvelle structure MALLOC () CODE> STRUCTURE ATED et une suppression qui effectue le gratuit () code >. Définissez des éléments simples qui fonctionnent sur les données de structure, acceptant un pointeur à la structure toujours comme premier argument. P>
OP n'a pas demandé comment apprendre OOP avec C (auquel cas la réponse correcte serait "NE PAS", BTW). OP a demandé comment apprendre (bon) C - et l'émulation de OOP n'est ni sage ni idiomatique C. (En outre, vous êtes totalement brillant sur la composante principale de l'envoi dynamique de l'OOP, qui doit être imitée par des pointeurs de fonction dans les structures).
@delnan: OP Demandez comment écrire un code de maintenable en C, et de mon expérience personnelle et directe, codage de type OOP est un moyen de produire du code maintenu dans C.
@Stefano: même en supposant que est i> une solution valide dans la plupart des cas (je doute que cela présente des avantages pour la plupart des programmes système, et c'est là que vous devriez utiliser C -, cela peut être utile pour les applications, mais qui dans Leur bon esprit écrit des applications en C?), il ajoute beaucoup de cruft et plie la langue. L'apprentissage C (qui ne fait pas, par exemple, la mémoire de fuite ou l'invocation UB) peut être suffisamment dure, pas besoin d'ajouter la peine de construire un système de centrage complet de zéro.
@delnan: Glib et GTK sont faits de cette façon. De plus, je ne pense pas que l'OP est intéressé par la programmation du système. Plus sur la manière de faire du bon codage avec une nouvelle langue, puis concentrez-vous sur l'efficacité.
@StEfano: Si vous impliquez que OOP == Bon code (sinon, je ne vois pas comment la réponse correspond à la question): Non, ce n'est pas le cas. C'est certainement une bonne approche de certains problèmes (bien que beaucoup d'entre eux soient mieux résolus dans des langues autres que c). Mais ce n'est certainement pas la façon dont on devrait commencer à apprendre C. Vous ne commencez pas à enseigner C ++ par des métaprogrammations de modèle, n'est-ce pas?
@Delnan: L'OP n'a pas demandé comment apprendre C. Il a demandé comment écrire un code efficace et maintenable. L'apprentissage de la langue n'est pas en discussion et est supposé être connu. Beaucoup de réponses axées sur le point "Efficacité". Je me suis concentré sur le point "Enfinition", et tout en faisant de la PURE OOP en C n'est pas ce que j'ai répondu, je signale à OOP en tant que méthodologie de déploiement de code dans une voie de maintenable (c'est-à-dire organisé autour de certains critères).
Premier mouiller avec les bases. Apprenez les gothas, apprenez un bon style C. Vous ne pouvez pas apprendre à écrire un code C efficace en une seule course. Il est donc correct de faire des erreurs au début.
J'ai trouvé la meilleure façon d'apprendre à écrire un code efficace consiste à apprendre à éviter les fuites de mémoire. Le code C maintenable nécessite une bonne documentation et des commentaires dans la source. En outre, il nécessite un code d'écriture qui résiste au changement. P>
Exemples: P>
Mauvais exemple: P>
int* ptr = malloc(5* sizeof(*ptr)); if (ptr) .. do something. free(ptr); // done with ptr
CASTING MALLOC CODE> La valeur de retour de S est C ++, pas c;)
Oui, tu as raison. Sauf si c'était un pointeur de fonction, bien sûr.
Je pense que vous voulez dire Tailleof (* PTR) CODE> à l'intérieur du MALLOC ... ou sans la parenthèse ... Tailleof * PTR code>, tout comme il n'y a pas de parenthèse dans (Null); code> :)
Vous avez raison sur la * position avant PTR dans (* PTR), mais je pense que avec la parenthèse serait beaucoup plus facile à lire et à comprendre car l'OP est nouveau en C et les parenthèses sont plus fréquentes.
Attendre! Le dernier exemple est légal c?
Vous devriez essayer de lire "écrire un code solide" de Steve Maguire, c'est un vieux livre, mais cela peut vous apprendre ce dont vous avez besoin. P>
Premièrement, soin de Portable Strong> Programmation. Il y a une norme C (ISO 9899: 1999 AKA C99 et: 2011 AKA C11 - Vous devez investir ~ 20 dollars) et une norme "UNIX", appelée POSIX (librement accessible). Lisez-les, vivez-les. Éloignez-vous de toutes les fenêtres et des programmes graphiques jusqu'à ce que vous n'ayez plus une sauterelle. P>
Comme l'homme sage dit: le novice programme sa machine. Les programmes d'experts un ensemble de machines. Les programmes de gourou pour aucune machine particulière. Em> p>
C'est l'essence de la portabilité et il vous évitera de nombreuses questions de la forme
Pour être honnête à mon avis, vous commencez à apprendre C ++ qui est une version avancée de la langue C ayant un code meilleur et efficace ici est un lien qui vous serait donné. Lien http://interneteeakho.com/learn-the-write-way-a-code-in-c-part-4-geting-data-from-user-and-Displaying- It-à l'écran / P>
Cela ne répond pas à la question du tout
Pour ajouter à ce que les autres ont dit, je recommanderais simplement d'écrire beaucoup de code. Souvent, je trouve que les personnes dans ce domaine attendent trop longtemps pour coder et dépensez trop de temps à lire. P>
Considérez aussi la plate-forme: ce qui est efficace dans une plate-forme n'est pas sur un autre ...
@Felice: Les sujets d'algorithme algorithme i> est le genre de chose qui rend le code plus évolutif sur chaque mise en œuvre i>. Pas le genre de chose qui donne +/- 10 ns en fonction du matériel ou du compilateur.
@delnan, vous êtes correct mais des livres d'algorithme de manière générale ne parlent pas nécessairement d'une seule langue.
@Felice: Oui, car ils ne sont liés à aucune langue ni de mise en œuvre d'une langue - un bon algorithme est toujours plus efficace (et souvent aussi lisible) qu'un mauvais; C'est ce qui en fait la connaissance si précieux.
@delnan mais la question fondamentale écrivait Code Efficent i> C, et en fonction des pratiques de l'environnement qui sont bonnes dans un endroit ne sont pas dans une autre: cela n'est pas nécessairement lié aux algorithmes, mais sur les techniques de mise en œuvre qui peut varier entre les environnements
@Felice: Comme déjà mentionné, savoir kiddlege d'algorithmes >>>>> toute microoptimisation, en particulier celles liées à une plate-forme particulière. Pas seulement d'un "comment utile en général?" point de vue, mais aussi d'un "combien de fois?" Point de vue - La microoptimisation peut s'éteindre un peu de frais généraux, peut-être accélérer par un facteur constant, mais ils ne feront jamais un mauvais algorithme plus rapidement qu'un bon pour une quantité importante de travail. Vous ne pouvez pas écrire efficacement C sans connaître vos algorithmes (et les structures de données) et les utiliser de manière appropriée.