# Expression constante/constante symbolique

**URL:** <https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310>\
**Category:** Programmation\
**Created:** [Octobre 1, 2019, 9:53 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310 "2019-10-01T09:53:59Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![steph1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@steph1](https://www.debian-fr.org/u/steph1)\
**Post date:** [Octobre 1, 2019, 9:54 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/1 "2019-10-01T09:54:00Z")

</div>

Bonjour a tous ,  
Je n’arrive pas a obtenir de definition claire pour ces 2 expressions . Pouvez vous m’eclairer s’il vous plait ?  
Je vous remercie d’avance

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Octobre 1, 2019, 10:52 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/2 "2019-10-01T10:52:06Z")

</div>

Déjà, il faut préciser que tu parles de C, ou d’un de ses dérivés.

Le _#define_, ou “_constante symbolique_” est juste une convention pour rechercher et remplacer des éléments dans le code source lors de la précompilation.  
C’est à dire que si tu mets un **# define VRAI 1** , partout où le préprocesseur verra VRAI, il remplacera par la chaine 1.  
Une fois préprocessé, tu obtiens un code C sans directives, à plat, pret à compiler.

Le mot réservé _const_ pour sa part est une instruction du langage qui \>protège\< une variable contre l’écriture/modification, mais ça reste une variable, qui a son espace mémoire réservé au moment de l’execution, et c’est pour ça qu’il faut la typer.

---

<div class="post-metadata">

**Author:** ![steph1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@steph1](https://www.debian-fr.org/u/steph1)\
**Post date:** [Octobre 1, 2019, 11:14 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/3 "2019-10-01T11:14:29Z")

</div>

Daccord je comprends . Si j’ai :  
#define N 40  
#define P 80  
L’expression:  
int main {  
N \< P  
Est une expression constante ?

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Octobre 1, 2019, 11:38 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/4 "2019-10-01T11:38:01Z")

</div>

> [@steph1](#):
>
> Est une expression constante ?

Je ne comprends ni le bout de code (que tu pourrais mettre en forme pour qu’on comprenne mieux) ni la question.

---

<div class="post-metadata">

**Author:** ![steph1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@steph1](https://www.debian-fr.org/u/steph1)\
**Post date:** [Octobre 1, 2019, 3:52 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/5 "2019-10-01T15:52:33Z")

</div>

Desolé de n’avoir pas été du tout claire .  
Je n’ai pas le code entier , seulement :

```
    #define N 40
    #define P 80 

```

Et ensuite j’ai une suite d’expression a titre d’exemple que l’on pourrai retrouver dans le main:

```
       N<P
       N==P
       N<P?2:5

```

Toutes ces expressions sont des “expressions constantes” ?  
Le preprocesseur remplace N et P avant la compilation ?

---

<div class="post-metadata">

**Author:** ![petit\_chat\_noir](https://www.debian-fr.org/user_avatar/www.debian-fr.org/petit_chat_noir/32/8494_2.png) [@petit\_chat\_noir](https://www.debian-fr.org/u/petit_chat_noir)\
**Post date:** [Octobre 1, 2019, 6:12 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/6 "2019-10-01T18:12:27Z")

</div>

Oui N et P sont remplacé … Point 😁  
Et  
const int valeur=10  
valeur sera toujours égale à 10 dans ton programme logiquement tu ne pourra pas faire  
Valeur=100 par la suite

---

<div class="post-metadata">

**Author:** ![steph1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/b9e5f3/32.png) [@steph1](https://www.debian-fr.org/u/steph1)\
**Post date:** [Octobre 2, 2019, 6:43 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/7 "2019-10-02T06:43:06Z")

</div>

Ok . Je vous remercie de votre aide .

---

<div class="post-metadata">

**Author:** ![PascalHambourg](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pascalhambourg/32/5837_2.png) [@PascalHambourg](https://www.debian-fr.org/u/PascalHambourg)\
**Post date:** [Octobre 2, 2019, 1:58 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/8 "2019-10-02T13:58:22Z")

</div>

Une expression constante est une expression dont le résultat peut être déterminé à la compilation.

> [@petit\_chat\_noir](#):
>
> const int valeur=10  
> valeur sera toujours égale à 10 dans ton programme logiquement tu ne pourra pas faire  
> Valeur=100 par la suite

Par contre je ne me souviens plus si le compilateur autorise à contourner `const` avec un «&nbsp;cast&nbsp;» du genre

```
*(int *)&valeur=100

```

Si le compilateur l’autorise mais place la variable dans un segment de code non modifiable, ça risque de mal se passer à l’exécution.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Octobre 2, 2019, 2:03 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/9 "2019-10-02T14:03:14Z")

</div>

> [@PascalHambourg](#):
>
> Par contre je ne me souviens plus si le compilateur autorise à contourner `const` avec un “cast” du genre
> 
> ```auto
> *(int *)&valeur=100
> 
> ```
> 
> Si le compilateur l’autorise mais place la variable dans un segment de code non modifiable, ça risque de mal se passer à l’exécution.

Pareil, je ne sais plus trop.  
Par contre, ce qu’il faut retenir, c’est qu’un #define n’est qu’une convention d’écriture, alors qu’un const désigne bien un espace mémoire (modifiable ou non).

---

<div class="post-metadata">

**Author:** ![PascalHambourg](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pascalhambourg/32/5837_2.png) [@PascalHambourg](https://www.debian-fr.org/u/PascalHambourg)\
**Post date:** [Octobre 2, 2019, 2:58 UTC](https://www.debian-fr.org/t/expression-constante-constante-symbolique/80310/10 "2019-10-02T14:58:12Z")

</div>

> [@mattotop](#):
>
> un const désigne bien un espace mémoire (modifiable ou non).

Oui, mais je ne pense pas que @steph1 parlait de ça en écrivant «&nbsp;expression constante&nbsp;».
