Pourquoi utiliser les constantes dans la programmation? [fermé]

je viens de revenir sur un peu de C étudier en utilisant le début du livre C D'Ivor Horton. Je suis arrivé au peu sur la déclaration des constantes qui semble se confondre avec des variables dans la même phrase.

juste pour clarifier, Quelle est la différence dans la spécification des constantes et des variables en C, et vraiment, quand avez-vous besoin d'utiliser une constante au lieu d'une variable? Je sais que les gens disent d'utiliser une constante quand l'information ne change pas pendant l'exécution du programme mais je ne peux pas vraiment penser d'un temps où une variable ne pouvait pas être utilisée à la place.

26
demandé sur skaffman 2010-06-02 01:47:47

10 réponses

une variable, comme vous pouvez le deviner à partir du nom, varie avec le temps. Si elle ne varie pas, il n'y a "aucune perte". Quand vous dites au compilateur que la valeur ne changera pas, le compilateur peut faire un tas d'optimisations, comme directement incruster la valeur et ne jamais allouer d'espace pour la constante sur la pile.

cependant, vous ne pouvez pas toujours compter sur votre compilateur pour être assez intelligent pour être capable de déterminer correctement si une valeur va changer une fois définie. Dans toute situation où l' le compilateur est incapable de déterminer cela avec 100% de confiance, le compilateur va errer du côté de la sécurité et de supposer qu'il pourrait changer. Il peut en résulter divers impacts sur les performances, comme le fait d'éviter l'inclinaison, de ne pas optimiser certaines boucles, de créer un code objet qui n'est pas aussi favorable au parallélisme.

pour cette raison, et puisque la lisibilité est également importante, vous devriez vous efforcer d'utiliser une constante explicite chaque fois que possible et laisser des variables pour les choses qui peuvent réellement changer.

en ce qui concerne la raison pour laquelle les constantes sont utilisées au lieu des nombres littéraux:

1) Il rend le code plus lisible. Tout le monde sait ce qu'est 3.14 (espérons-le), mais pas tout le monde sait que 3.07 est le taux d'imposition du revenu en Fe. Il s'agit d'un exemple de connaissances propres à un domaine, et toutes les personnes qui conserveront votre code à l'avenir (p. ex. un logiciel fiscal) ne le sauront pas.

2) Il sauve le travail quand vous faites un changement. Passer et changer tous les 3,07 à 3,18 si le taux d'imposition change dans l'avenir sera ennuyeux. Vous voulez toujours minimiser les changements et idéalement faire un seul changement. Plus vous devez effectuer des changements simultanés, plus le risque que vous oubliiez quelque chose, conduisant à des erreurs, est élevé.

3) vous évitez les erreurs risquées. Imaginez qu'il y avait deux états avec un taux d'imposition de 3.05, puis l'un d'eux change de 3.18 tandis que les autres restent à 3.07. En allant simplement et en remplaçant, vous pourriez finir avec de graves erreurs. Bien sûr, beaucoup de constante entière ou chaîne de caractères les valeurs sont plus fréquents que "3.07". Par exemple, le numéro 7 pourrait représenter le nombre de jours dans la semaine, et quelque chose d'autre. Dans les grands programmes, il est très difficile de déterminer ce que chaque valeur littérale signifie.

4) dans le cas du texte de chaîne, il est courant d'utiliser des noms symboliques pour les chaînes afin de permettre aux pools de chaînes de changer rapidement dans le cas de la prise en charge de plusieurs langues.

notez qu'en plus des variables et des "variables constantes", il y a aussi quelques langues avec énumérations. Une énumération vous permet en fait de définir un type pour un petit groupe de constantes (par exemple, les valeurs de retour), de sorte que leur utilisation fournira la sécurité de type.

Par exemple, si j'ai une énumération pour les jours de la semaines et les mois, je vais être averti si je attribuer un mois dans une journée. Si j'utilise juste des constantes entières, il n'y aura aucun avertissement quand le jour 3 est assigné au mois 3. Vous voulez toujours la sécurité de type, et il améliore la lisibilité. Les énumérations sont également mieux pour la définition de l'ordre. Imaginez que vous avez des constantes pour les jours de la semaine, et maintenant vous voulez que votre semaine pour commencer le lundi plutôt que le dimanche.

32
répondu Uri 2010-06-01 22:05:31

utiliser les constantes est plus un moyen de programmation défensive, pour vous protéger de vous-même, de changer accidentellement la valeur quelque part dans le code quand vous codez à 2 heures du matin ou avant d'avoir bu votre café.

Techniquement, oui, vous pouvez utiliser une variable à la place.

15
répondu Peter Mortensen 2015-04-26 09:22:23

Pour l'un, l'optimisation de la performance.

Plus important encore, c'est pour les lecteurs humains. Rappelez-vous que votre public cible n'est pas seulement le compilateur. Il est utile de s'exprimer en code et d'éviter les commentaires.

const int spaceTimeDimensions = 4;

if(gpsSattelitesAvailable >= spaceTimeDimensions)
  Good();
10
répondu Pavel Radzivilovsky 2010-06-01 21:51:22

les constantes ont plusieurs avantages par rapport aux variables.

les constantes fournissent un certain niveau de garantie que le code ne peut pas changer la valeur sous-jacente. Ce n'est pas très important pour un projet plus petit, mais c'est important pour un projet plus grand avec de multiples composantes écrites par de multiples auteurs.

les constantes fournissent aussi un bon indice au compilateur pour l'optimisation. Puisque le compilateur connaît la valeur ne peut pas changer, il n'a pas besoin de charger la valeur de la mémoire et peut optimiser le code pour ne travailler que pour la valeur exacte de la constante (par exemple, le compilateur peut utiliser shifts for multiplication/division si la const est une puissance de 2.)

les constantes sont aussi intrinsèquement statiques - vous pouvez déclarer la constante et sa valeur dans un fichier d'en-tête, et ne pas avoir à vous soucier de la définir exactement à un endroit.

9
répondu Michael 2010-06-01 21:54:51

pour un langage de bas niveau comme C, Les constantes permettent plusieurs optimisations de compilation.

un langage De programmation en général, vous n'avez pas vraiment besoin d'eux. Les langages dynamiques de haut niveau tels que Ruby et JavaScript ne les ont pas (ou du moins pas dans un vrai sens constant). Les Variables sont utilisées à la place, comme vous l'avez suggéré.

3
répondu Jakob 2010-06-01 21:55:08

const mot-clé est souvent utilisé pour les paramètres de fonction, en particulier les pointeurs, pour suggérer la mémoire les points pointeur à ne pas être modifié par la fonction. Regardez la déclération pour strcpy par exemple:

char *strcpy(char *dest, const char *src);

Sinon, par exemple, une déclaration telle que

const int my_magic_no = 54321;

pourrait être préférée:

#define MY_MAGIC_NO 54321

pour le type des raisons de sécurité.

2
répondu James Morris 2010-06-01 21:50:42

constante est quand vous voulez juste partager la mémoire, et ça ne change pas.

2
répondu Peter Mortensen 2015-04-26 09:21:24

C'est vraiment un moyen facile de piéger une certaine classe d'erreurs. Si vous déclarez une variable const, et essayer accidentellement de le modifier, le compilateur vous appellera dessus.

1
répondu crazyscot 2010-06-01 21:52:58

les constantes sont très nécessaires en ce qui concerne la déclaration et l'intialisation de la variable pour n'importe quel but comme au début de la boucle, pour vérifier la condition dans la déclaration if-else, etc.

Pour plus d'information, n'hésitez pas à lire les articles suivants:

1
répondu yogi 2011-11-15 00:11:37

ne pas utiliser const peut signifier que quelqu'un dans un projet d'équipe pourrait déclarer où int FORTY_TWO = 42 et de la rendre égale à FORTY_TWO = 41 ailleurs par un autre membre de l'équipe. Donc la fin du monde arrive et vous perdez aussi la réponse à la vie. const bien que rien de tout cela n'arrivera jamais. Plus const est stocké ailleurs en mémoire, par rapport au stockage des variables normales, et est plus efficace.

0
répondu 2010-06-01 21:58:03