IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Différence de déclarations avec "const"


Sujet :

C

  1. #21
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ce que tu dis et ce que dis revient au même. Par exemple, si tu as "int const *p", toi tu dis "c'est le int qui est const". Moi je dis, "c'est *p qui est const". C'est la même chose, puisque c'est bien *p qui est un int. Dans une déclaration ce qui est à droite d'un truc est du type à gauche du truc.

    Je dis seulement que je trouve ma méthode plus simple à utiliser, car tout ce que tu as besoin de savoir c'est que tu ne peux rien affecter à tout ce qui ce trouve à droite du const. Si tu as "int const *p", tu ne peux pas écrire "*p = X".

  2. #22
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par Bousk Voir le message
    en C le seul intérêt est pour const int/float/... * puisque de toutes façons tous les passages en paramètres se font par copie.
    passer un int ou un const int n'a aucune incidence.
    Cela signifie donc que dans la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int uneFonction( int const unEntier )
    {
     
    }
    le "const" est inutile car la "uneFonction" fera une copie de "unEntier" ?

  3. #23
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 500
    Billets dans le blog
    1
    Par défaut
    Pas exactement.

    En C, les fonctions prennent les paramètres par valeur. C'est-à-dire que quand tu passes a en paramètre de f(), la fonction travaille sur une copie de a et toutes les modifications faites sur cette variable à l'intérieur de f() seront perdues en sortie. En effet, la durée de vie de la copie est égale à la durée de la fonction.

    En revanche, tu peux passer un paramètre en l'indiquant constant. Cela t'interdira de modifier son contenu. Même pour un int ce n'est pas très utile, ce n'est pas forcément bête pour ne pas modifier la copie "par mégarde" et faire des calculs "faux" dans la fonction.

    Essaye de compiler ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void incremente(int nb)
    {
       nb++;
    }
     
    void donttouch(const int nb)
    {
       nb++;
    }
     
    int main(void)
    {
        int a = 2;
     
        incremente(a);
        printf("a = %d\n", a);
     
        donttouche(a);
        printf("a = %d\n", a);
     
        return 0;
    }
    Puis, modifier la ligne qui donne l'erreur par nb; et regarde la sortie en console.

  4. #24
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Pas exactement.

    En C, les fonctions prennent les paramètres par valeur. C'est-à-dire que quand tu passes a en paramètre de f(), la fonction travaille sur une copie de a et toutes les modifications faites sur cette variable à l'intérieur de f() seront perdues en sortie. En effet, la durée de vie de la copie est égale à la durée de la fonction.

    En revanche, tu peux passer un paramètre en l'indiquant constant. Cela t'interdira de modifier son contenu. Même pour un int ce n'est pas très utile, ce n'est pas forcément bête pour ne pas modifier la copie "par mégarde" et faire des calculs "faux" dans la fonction.
    Je retiens cela qui me semble très important.
    Merci beaucoup pour ton explication

  5. #25
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 500
    Billets dans le blog
    1
    Par défaut
    De rien .


    Pour terminer, comme j'ai dit que ce n'était pas très utile pour un simple int, voici un exemple avec une int*. Tu empêches ainsi de modifier la zone pointée, car la modification resterait après la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void touchme(int *pt_nb)
    {
        *pt_nb = 42;
    }
     
    void donttouch(const int * pt_nb)
    {
       *pt_nb = 66; // enlever l'étoile pour que ça compile
    }
     
    int main(void)
    {
        int a = 2;
     
        touchme(&a);
        printf("a = %d\n", a);
     
        donttouche(&a);
        printf("a = %d\n", a);
     
        return 0;
    }
    Ici, la fonction travaille sur une copie de l'adresse de a (il crée une nouvelle variable de type pointeur sur int qui prend la valeur de &a) mais cette adresse (copiée ou pas) donne toujours accès à a.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo