Bonjour.
Quelle est l'utilité d'utiliser des constantes dans un programme en C ?
Comment les utiliser ?
Merci de l'aide.
Bonjour.
Quelle est l'utilité d'utiliser des constantes dans un programme en C ?
Comment les utiliser ?
Merci de l'aide.
deja on les appelle constantes parceque elles ne changent pas au cours de l'execution du programme .
on peut les declarer soit :
imaginons qu'on veuille creer une constante MAX egale a 3
ou bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 const int MAX = 3
comme tu a remarque pour differencier les constantes des variable la majorite utilisent les majuscules .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2#define MAX 3
pour l'utilite :
- deja sa permet de verifier si ta variable ne change pas accidentellement au cours du programme .
- imaginons que tu utilise plusieurs fois le chiffre 4 dans le programme , et que tu change d'avis et que tu veut utiliser 5 et bien l'avantage de declarer une constante est de t'eviter de fouiller dans ton code pour trouver le chiffre 4 et le remplacer par 5 , alors qu'il suffisais juste de changer la constante .
en esperant t'avoir aide
juste encore une chose: que signifie cela: 'A' ??
Le caractère A majuscule, ou plus précisément son code.
- En ASCII, ASCII étendu et Unicode, 'A' correspond à 65.
- En EBCDIC, aucune idée.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Attention ! Tu confonds les macros et les constantes. Ce n'est PAS DU TOUT la même chose !
Pour cela, tu utiliseras plutôt les facilités de ton debugger, qui est prévu, entre autres choses, pour suivre la valeur des registres de ton choix.- deja sa permet de verifier si ta variable ne change pas accidentellement au cours du programme .
Et s'il n'a déclaré que des constantes, ça lui apporte quoi ?- imaginons que tu utilise plusieurs fois le chiffre 4 dans le programme , et que tu change d'avis et que tu veut utiliser 5 et bien l'avantage de declarer une constante est de t'eviter de fouiller dans ton code pour trouver le chiffre 4 et le remplacer par 5 , alors qu'il suffisais juste de changer la constante .
D'une part, donc, les noms écrits en majuscules servent généralement à représenter les macros définies avec #define. Celles-ci peuvent éventuellement représenter, à leur tour, des variables, des constantes ou, le plus souvent, les valeurs elles-mêmes. Ces macros sont entièrement résolues par le précompilateur et n'existent plus en tant que telles dans le code final.
En revanche, une constante en C va être bâtie exactement comme une variable, donc elle aura un emplacement en mémoire (et on pourra mettre un pointeur dessus également). Les raisons de définir une constante plutôt qu'une variables sont les suivantes :
- Lorsque les données qu'elle contient ne peuvent ou ne doivent être modifiées.
- Pour que le compilateur puisse les placer dans un segment de mémoire en lecture seule (sur certains systèmes, la RAM est une ressource précieuse et limitée).
- De façon à conserver leur nature lorsque ces constantes sont impliquées dans des expressions très compliquées.
Un exemple typique de constante implicite est la chaîne de caractères entre guillemets :.
Code c : Sélectionner tout - Visualiser dans une fenêtre à part const char * chaine = "Hello world";
La chaîne est retrouvée par son emplacement, mais les caractères qu'elle contient ne peuvent être modifiés, et son type doit donc être défini en conséquence.
- Lorsque les données qu'elle contient ne peuvent ou ne doivent être modifiées.
- Pour que le compilateur puisse les placer dans un segment de mémoire en lecture seule (sur certains systèmes, la RAM est une ressource précieuse et limitée).
- De façon à conserver leur nature lorsque ces constantes sont impliquées dans des expressions très compliquées.
pour la 1ere je dirai que c'est toi qui code tu fait gaffe c'est tout...
pour la 2ème je suis parfaitement d'accord mais une question persiste: de toutes fassons ta constante est dans la mémoire(RAM)? c'est bien le système (sous windows c'est le PEloader) qui charge l'éxécutable d'ou moin une partie en mémoire réel(l'autre étant dans la mémoire virtuelle) et qui décide qu'elle partie sera en lecture seule lecture/ecriture ou sera la pile etc... non?
pour la 3eme revenir a la 1ere
Pour moi, l'opérateur const est pratique que pour la deuxieme raison...
Non.
- Une constante est dans le code, associée au code machine
- Une variable à lecture seule est probablement dans un segment de mémoire à lecture seule
- Une variable lecture/écriture est dans un segment de mémoire à lecture/écriture.
C'est à peu près tout ce qu'on peut dire. Le reste dépend de l'implémentation.
Pas de Wi-Fi à la maison : CPL
Un compilateur décent correctement configuré te signalera si tu tentes de modifier une "constante". de ce fait la remarque de Obsidian est tout a fait pertinente.
Je rajouterais que l'utilisation du mot clé const pour les "variables constantes" a en outre un effet documentaire non négligeable.
Pas de Wi-Fi à la maison : CPL
C'est un problème de sémantique : pour les programmeurs, « variable » = « registre ». En fait, c'est plutôt l'un qui induit l'autre. Il faut un registre pour contenir la valeur qui peut varier. C'est le terme « variable » lui-même qui est, dès lors, inapproprié.
Pour les mathématiciens algébristes, une variable est un terme d'une expression qui peut varier. C'est d'ailleurs cette différence d'approche qui cause tant de tracas aux néophytes, spécialement à l'abord des pointeurs ...
Maintenant, j'utilise moi-même, et comme tout le monde, les « const » pour faire du read-only dans un contexte donné, mais ce n'est qu'un moindre mal : une constante ne peut pas être naturellement transtypée en variable, mais une variable peut être transmise comme une constante (qui peut le plus peut le moins). C'est très bien mais sémantiquement incorrect, encore une fois : une donnée réputée constante n'a a priori besoin d'être lue qu'une seule fois.
Si l'on reprend le prototype de printf(), par exemple, le premier paramètre est censé être un pointeur vers des caractères constants. À ce titre, on pourrait très bien envisager une fonction printf() spéciale qui maintienne une mémoire cache des chaînes déjà écrites et qui les rebalance quand elle reconnaît un pointeur qui est déjà passé, le contenu étant censé être garanti invariable par « const ».
Ceci rejoint ce que tu dis, mais les deux mots-clés devraient exister à mon goût.
Euh, si ! Ou alors, on ne parle pas de la même chose. Tu peux retrouver l'adresse d'une constante avec « & » comme pour une variable. De même, l'emplacement d'une donnée réputée invariable peut très bien être public.Une constante n'a pas d'adresse.
L'exemple-type est les chaînes de caractères entre guillemets : les caractères qui la composent ne peuvent jamais être modifiés, mais il est quand même nécessaire que l'on puisse pointer dessus.
Gné ? Quel rapport avec un registre ?
Une variable mémoire peut très bien varier directement. Ca dépend des processeurs...En fait, c'est plutôt l'un qui induit l'autre. Il faut un registre pour contenir la valeur qui peut varier. C'est le terme « variable » lui-même qui est, dès lors, inapproprié.
Ce texte est une exemple flagrant, voire caricatural, de confusion entre constante et variable à lecture seule...Euh, si ! Ou alors, on ne parle pas de la même chose. Tu peux retrouver l'adresse d'une constante avec « & » comme pour une variable. De même, l'emplacement d'une donnée réputée invariable peut très bien être public.
L'exemple-type est les chaînes de caractères entre guillemets : les caractères qui la composent ne peuvent jamais être modifiés, mais il est quand même nécessaire que l'on puisse pointer dessus.
Le mot clé 'const' du C est une source de confusion bien connue (en Java : 'final', je ne sais pas si c'est mieux...).
C'est mieux comme ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #define readonly const char readonly *s = "Hello";
Par contre une constante n'a pas d'adresse...
ne compile pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int *pa = &123; int *pb = &'A'; int *pc = &NULL;
Pas de Wi-Fi à la maison : CPL
Un « registre », d'une manière générale, est n'importe quoi qui puisse contenir et conserver une valeur, voire même une information, au sens large, quand on sort du domaine de l'informatique.
En C, le mot-clé « registrer » se réfère aux registres du processeur, mais ce n'est qu'un cas particulier. Ce n'était pas mes propos.
C'est surtout que tu n'as pas bien lu mon post, comme souvent : en fait, on est d'accord.Ce texte est une exemple flagrant, voire caricatural, de confusion entre constante et variable à lecture seule...
Mon point de vue est que lorsque des termes choisis tournent au jargon, ça devient dangereux. Les mots « variable à lecture seule » n'ont tout simplement pas de sens si ladite variable est à lecture seule pour tout le monde (dispositifs électroniques compris), pour la simple raison que la variable ne serait justement jamais variable.
Mais comme je le disais plus haut, quand on dit le mot « variable », tous les programmeurs se figurent en premier lieu le registre qui contient la valeur, plutôt que la nature de la valeur elle-même, et c'est en ce sens que le mot « variable » est inapproprié. Pourquoi le font-ils ? Parce que la plupart des langages ne font pas le distingo, et que la seule manière de retenir localement une donnée est de créer une variable.
C'est spécialement vrai dans les langages interprétés où tout ce qui est « equates » occupe quand même des ressources.
Non, ce n'est pas beaucoup mieux, en effet.Le mot clé 'const' du C est une source de confusion bien connue (en Java : 'final', je ne sais pas si c'est mieux...).
Je pense surtout que même en y portant le plus grand soin, on ne peut pas inventer à la base, du premier jet, le langage idéal.
Je pense réellement qu'au moment de poser sur le papier les bases du langage C, ses concepteurs ont d'abord eu à l'idée de distinguer variables et constantes au sens mathématique du terme, pour que cela apparaisse dans les prototypes et soit géré comme tel, ainsi que pour classer les données dans les bons segments de mémoire. Je ne crois pas que l'objectif premier ait été la protection en écriture, comme sur les disques, ne serait-ce que parce que, dans le cas contraire, le mot-clé aurait tout de suite été nommé correctement.
Toujours la même chose : problème d'interprétation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int *pb = &'A';
Pour moi, une variable ou une constante sont matérialisées par des symboles qui se substituent aux valeurs qu'elles représentent.
« x » est (généralement) une variable.
« pi » est une constante.
'A' est la représentation d'une valeur. Ce n'est en soi ni une constante ni une variable à ce stade. Comme tu le signales au-dessus, ce n'est pas non plus un objet logiciel, dans le sens où cette déclaration ne crée pas d'instance de cette valeur. Mais une constante, elle, peut très bien être instanciée.
Ici, on est informatique (et même, en langage C!) et ce dont tu parles s'appelle d'une manière générale la mémoire ou un élément de mémoire.
Je ne crois pas, non. Tu me dis qu'une constante a une adresse. C'est faux.C'est surtout que tu n'as pas bien lu mon post, comme souvent : en fait, on est d'accord.
En C, il y a les variables et les constantes. Ce sont 2 choses différentes. Les variables qualifiée 'const' ne sont pas des constantes. C'est clair ?Mon point de vue est que lorsque des termes choisis tournent au jargon, ça devient dangereux.
Les variables (ou objets) ont une adresse (sauf les champs de bits).
Les constantes (ou expression constantes) n'ont pas d'adresse.
Point.
Y'a pas à chercher des interprétations tordues. Il suffit de lire la norme.
Les mots « variable à lecture seule » n'ont tout simplement pas de sens. Si
C'est une variable qui a une adresse et dont l'accès ne se fait qu'en lecture.
Je rappelle qu'il peut exister des variables à lecture /écriture
sur lesquelles on peut définir un pointeur n'autorisant que la lecture.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int x = 123:
ou plus vraisemblablement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part int const *pi = &i;
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part f(&i);
Ca ne signifie en aucun cas que la valeur pointée est une constante. Ca signifie simplement que dans le contexte de cette fonction, je n'ai pas le droit de la modifier. (Ce qui à mon sens, devrait être le cas général, le droit d'écriture devant être exceptionnel et contrôlé...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part void f(const *pi)
Je ne sais pas au nom de quels programmeurs tu parles, mais je ne vois pas ce que la notion de registre vient faire ici... Une variable (ou objet) est un élément de la mémoire, c'est tout. Elle contient une combinaison de bits qui représente une valeur dont la sémantique dépend de l'utilisateur. Elle a une adresse unique et constante (l'adresse est une constante) dans la machine pendant sa durée de vie.Mais comme je le disais plus haut, quand on dit le mot « variable », tous les programmeurs se figurent en premier lieu le registre
Ce que j'appelle la sémantique de la combinaison de bits appelée valeur. Comme déjà expliqué, elle dépend de l'utilisateur (en fait de la spec) et elle n'a rien à voir avec la variable qui est le contenant (la valeur étant le contenu).qui contient la valeur, plutôt que la nature de la valeur elle-même,
On peut toujours s'amuser à redéfinir le sens des mots. Tu préfères 'objet' ?et c'est en ce sens que le mot « variable » est inapproprié.
Tu as toi même associé les mots 'retenir' (grâce à l'effet mémoire) et 'variable'. Une variable est donc bien une portion de mémoire qui contient une donnée (ou valeur).Pourquoi le font-ils ? Parce que la plupart des langages ne font pas le distingo, et que la seule manière de retenir localement une donnée est de créer une variable.
Ce qui se passe ailleurs m'intéresse peu... En C, une constante n'occupe aucune mémoire. C'est garanti.C'est spécialement vrai dans les langages interprétés où tout ce qui est « equates » occupe quand même des ressources.
Les concepteurs du C (1973) n'ont pas inventé const. Ce sont les normalisateurs de 1989/1990 qui l'ont inventé.Je pense réellement qu'au moment de poser sur le papier les bases du langage C, ses concepteurs ont d'abord eu à l'idée de distinguer variables et constantes au sens mathématique du terme, pour que cela apparaisse dans les prototypes et soit géré comme tel, ainsi que pour classer les données dans les bons segments de mémoire. Je ne crois pas que l'objectif premier ait été la protection en écriture, comme sur les disques, ne serait-ce que parce que, dans le cas contraire, le mot-clé aurait tout de suite été nommé correctement.
Euh non. La norme est très clair. 'A' est une constante, comme 123 ou 0xFF.Toujours la même chose : problème d'interprétation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int *pb = &'A';
Une variable est une objet qui reçoit une valeur. La valeur elle même peut être matérialisée par une symbolique qui en facilite l'exploitation.Pour moi, une variable ou une constante sont matérialisées par des symboles qui se substituent aux valeurs qu'elles représentent.
'B', 123, 12.3, (void*)0, NULL etc.
Attention avec "hello" dont le sens exact varie beaucoup avec le contexte.
Bah, non. Ca dépend comment elle sont définies...« x » est (généralement) une variable.
« pi » est une constante.
int x = 0; /* variable */
int const x = 0; /* variable */
enum {x = 0}; /* constante */
#define x 0 /* constante */
pareil avec pi...
Oui. C'est ça une constante.'A' est la représentation d'une valeur.
Non. Une constante n'a pas d'adresse. Une instance est un objet mémoire. Elle a donc forcément une adresse, ce n'est donc pas une constante mais une variable.Mais une constante, elle, peut très bien être instanciée.
Tu continues de confondre variable et constante.
Relis ton cours de C.
Pas de Wi-Fi à la maison : CPL
Ahem! Aucune mémoire de données. Elle occupe forcément une place dans la mémoire de code.En C, une constante n'occupe aucune mémoire. C'est garanti.
Mais si elle est assez petite, il est possible qu'elle n'occupe même pas un byte entier (comme la valeur immédiate de l'instruction ADDQ du M68k, qui ne peux prendre que les valeurs de 1 à 8 (oui, 1 à 8, car on n'ajoute pas zéro), donc juste trois bits)... Dans ce cas-là, il apparait parfaitement clair que la constante n'a pas d'adresse.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ce n'est pas une raison pour être approximatif.
Non. Je pense que tu te trompes.En C, il y a les variables et les constantes. Ce sont 2 choses différentes. Les variables qualifiée 'const' ne sont pas des constantes. C'est clair ?
M'enfin, ce n'est pas bien grave. Je n'ai pas à coeur de te convaincre. Il est tard, j'attendrai que tu me lises à tête reposée.
C'est sur ces définitions que nos avis divergent.Les variables (ou objets) ont une adresse. Les constantes (ou expression constantes) n'ont pas d'adresse. Point.
Ouais, ouais, ouais.Y'a pas à chercher des interprétations tordues. Il suffit de lire la norme.
Chaque fois que ça devient un peu difficile, c'est le même refrain : « c'est comme çà, ne cherche pas à comprendre ».
Apprendre la norme par coeur ne suffit pas, il faut se servir de sa tête quelque fois et faire preuve d'un peu de bon sens.
Alors ... relis mon post (ou bien ouvre un dictionnaire) !Je ne sais pas au nom de quels programmeurs tu parles, mais je ne vois pas ce que la notion de registre vient faire ici...
Ce n'est pas parce que le mot-clé « register » en C désigne spécifiquement les registres du processeur que c'est une généralité en informatique. C'est un terme répandu et bien défini. Essaie de maîtriser ta langue avant de maîtriser le C.
Tout le problème vient de là, à mon avis. 'faut sortir un peu.Ce qui se passe ailleurs m'intéresse peu...
Y a des définitions qui existaient avant le C, et qui existent à côté !
Ce qui ne change rien.Les concepteurs du C (1973) n'ont pas inventé const. Ce sont les normalisateurs de 1989/1990 qui l'ont inventé.
Cent lignes pour dire la même chose. J'hallucine !Euh non. La norme est très clair. 'A' est une constante, comme 123 ou 0xFF.
...
Une constante n'a pas d'adresse. Une instance est un objet mémoire. Elle a donc forcément une adresse, ce n'est donc pas une constante mais une variable. Tu continues de confondre variable et constante.
De toutes façons, ce n'était même pas l'objet de post initial. Donc, je vais résumer en trois lignes ce dialogue de sourds :
1) Le mot-clé « const » est abusif ;
2) À la place, tu proposes « variable à lecture seule » ;
3) Je faisais remarquer qu'en fait, c'est le terme « variable » lui-même qui est inapproprié.
C'était difficile ?
pourtant avec :Envoyé par Obsidian
en assembleur j'écrirais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part char tab[9];
dans le code machine 9 apparaîtra ( elle a donc une adresse puisqu'elle est stockée quelque part ), cela dit si c'était le compilateur il n'écrirait certainement pas 9 ( pour des raisons d'alignement de données ? ). je me trompe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part sub esp,9
To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --
To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager