Expression constante/constante symbolique


#1

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


#2

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.


#3

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


#4

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


#5

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 ?


#6

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


#7

Ok . Je vous remercie de votre aide .


#8

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

Par contre je ne me souviens plus si le compilateur autorise à contourner const avec un “cast” 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.


#9

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).


#10

Oui, mais je ne pense pas que @steph1 parlait de ça en écrivant “expression constante”.