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 :

Evaluation d'expression dans un while.


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut Evaluation d'expression dans un while.
    Bonjour,
    Voici mon problème, pour le cours de C, on nous a demandé de créer un fonction qui copie une chaîne de caractères dans une autre; une strcpy-like, j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include<stdio.h>
     
    void pstrcpy (char *ch2, char *ch1)
    {
    	while (*ch1)
    		*ch2++ = *ch1++;
    	*ch2 = '\0';
    }
    ok, pas de soucis, tant que ce qui est pointé par ch1 est différent de '\0', on affecte à ch2, dès que *ch1 =\0, le traitement s'arrête, ch2 a reçu le dernier caractère mais pas celui de fin de chaîne, donc on le rajoute.

    Au cours on a eu cette correction, version compacte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include<stdio.h>
     
    void pstrcpy2 (char *ch2, char *ch1)
    {
    	while(*ch2++ = *ch1++); // à la sortie de la boucle, les pointeurs sont après les derniers traités
    }
    J'ai un problème avec cette écriture, pour savoir dans quel ordre est évaluée cette expression...
    Lorsque la condition passe à FALSE les pointeurs sont après les \0 respectif (chaîne 1 et 2), cela veut dire que l'ordre s' est fait comme ceci: 1°) affectation, 2°) incrémentation, 3°) évaluation de la condition.

    Or, dans un while, c'est la condition qui est évaluée en premier (logique pour savoir s' il y a traitement ou non)... et cela soulève une autre question, comment est évaluée la condition?

    Est-ce équivalent à: while((*ch2++ = *ch1++)!='\0'); ?

    Comment les pointeurs se retrouvent-ils après \0 ?

    Comprends pas...

    Merci de pouvoir m' éclairer.

  2. #2
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Salut,

    On peut effectivement dire que c'est équivalement.
    ce que tu dois savoir c'est que dans une condition, par exemple dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    main()
    ...
    if(condition(...))
    {...}
    else
    {...}
     
    }
    Si la condition (comme dans ce cas) contient une instruction à executer,
    avant de tester la condition dans le if, il execute la fonction 'condition' et attend ce qu'il va retrouner.

    Il fait donc le code pour attendre de savoir ce qu'il retourne.

    voila.
    Si tu n'as pas encore totalement compris, n'hésites pas.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Lorsque tu as une boucle while, si la condition est vraie, alors le traitement est effectué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while( condition )
    {
      // traitement
    }
    La condition est évaluée en premier et, tant qu'elle reste vraie, le traitement est exécuté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(*ch2++ = *ch1++);
    Avec cette boucle while, la condition est évaluée tant qu'elle est vraie.
    La condition est *ch2++ = *ch1++. La boucle s'arrête dès que cette condition est fausse.

    Une expression est considérée comme fausse lorsqu'elle est égale à 0, et vraie dans le cas contraire, c'est-à-dire lorsqu'elle est différente de 0.


    Lorsque l'opérateur ++ (ou --) est utilisé après une variable, l'incrémentation (ou décrémentaion) est effectuée après l'évaluation de la variable.
    Lorsque l'opérateur ++ (ou --) est utilisé avant une variable, l'incrémentation (ou décrémentaion) est effectuée avant l'évaluation de la variable.
    *ch1 sera évalué avant ch1++, et *ch2 sera évalué avant ch2++.
    La donnée pointée par ch2 recevra donc la donnée pointée par ch1 avant que les 2 pointeurs ne soient incrémentés.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Dans un while, un if, un do while, un for, ce qui figurent sont des expressions quelconques. Si une expression sert de condition d'exécution, elle est évaluée puis le résultat de l'évaluation est testé.

    Pour une expression du type a= b , le résultat de l'évaluation de l'expression est la valeur prise par a.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(*ch2++ = *ch1++);
    //est équivalent à 
    while((*ch2++ = *ch1++)!='\0');
    Lorsque *ch1 == 0, la valeur 0 est copiée dans *ch2 et la valeur de l'expression est donc 0. ch1 et ch2 sont alors incrémentés et pointent un élément après le 0 sur chaque chaîne.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    Waow, ,
    Citation Envoyé par "diogene
    Si une expression sert de condition d'exécution, elle est évaluée puis le résultat de l'évaluation est testé.
    et
    Citation Envoyé par "diogene
    Pour une expression du type a= b , le résultat de l'évaluation de l'expression est la valeur prise par a.

    c'est très clair et c'est exactement l'information que je cherchais, ça me prend la tête depuis hier! Et encore un tout grand merci à tous.

  6. #6
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    si tu as résolu ton problème =>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT 2.0] Evaluation d'expression mathématique dans une variable string
    Par domas_24 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 25/01/2011, 14h49
  2. [XPATH] Evaluer une expression xpath dans un xml
    Par antigone dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 29/01/2007, 17h21
  3. Réponses: 14
    Dernier message: 13/10/2005, 12h55
  4. [CR8.5] Pbm d'affichage dans un While
    Par .:Tieri:. dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 14/07/2004, 10h17
  5. Réponses: 3
    Dernier message: 25/11/2002, 14h15

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