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 :

Petites Questions siouplé


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut Petites Questions siouplé
    Je comprends pas certains bout de code, donc je vous les mets.
    En espérant que vous m'aidiez à comprendre... Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int m = 24, n= 024;
        printf("%d %d\n",m,n);
    affiche à la console : 24 20
    Question : Pourquoi le n = 024 apparait en 20 ?

    ------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int a = 123, b=456 ;
        a ^= b ^= a ^= b;
        printf("%d %d",a,b);
    affiche 456 123.
    Question : Que signifie la ligne a ^= b ....etc ?

    -------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 0;
    for(i=0;i< 20;i++) {
        switch(i){
            case 0: i+=5 ;
            case 1: i+=2;
            case 5: i+=5;
            default: i+=4;
            break;
        }
        printf("%d", i);
        }
    affiche 16 et 21.
    Question : Pourquoi ? Je vois bien que dans le switch on commence à i = 0 donc i+=5 alors i=5 , déja il ne l'affiche pas et ensuite d'ou sort le 16 ? Oo

    Merci d'avance - parce que la je nage... enfin plutôt je coule ^^ -

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    affiche à la console : 24 20
    Question : Pourquoi le n = 024 apparait en 20 ?
    Lorsqu'on écrit un nombre en le précédant d'un zéro, il s'agit d'une notation en octal.

    24 -> décimal
    0x24 -> hexadécimal (=36 en décimal)
    024 -> octal (=20 en décimal)

    Question : Que signifie la ligne a ^= b ....etc ?
    ^ est l'opérateur "OU EXCLUSIF". Et ^= effectue aussi un "OU EXCLUSIF" mais en assignant le résultat à l'opérande à gauche.
    En clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable1 ^= variable2;
    équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable1 = variable1 ^ variable2;
    Donc :
    équivaut à (en tenant compte des priorités) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a ^= (b ^= (a ^= b) ) ;
    à cause de l'associativité à droite de l'opérateur ^=.

    Après c'est simple à comprendre. On calcule en tenant compte des priorités, c'est-à-dire en commençant par ce qu'il y a dans les parenthèses les plus imbriquées.

    affiche 16 et 21.
    Question : Pourquoi ? Je vois bien que dans le switch on commence à i = 0 donc i+=5 alors i=5 , déja il ne l'affiche pas et ensuite d'ou sort le 16 ? Oo
    Dans le switch, il n'y a aucun break (sauf à la fin, qui n'est pas utile ici). Au premier coup, le programme va sur case 0:, mais poursuit ensuite. Tout est donc additionné. On se retrouve donc avec i à 16. Le for l'augmente encore de 1. Et après, le programme saute sur default:, qui augmente i de 4, d'où un résultat de 21. Ensuite, la condition du for échoue car i n'est plus inférieur à 20...

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Merci beaucoup pour toutes ces explications.
    Bonne journée à toi.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Dernier point que j'ai zappé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int a = 10, b ;
    b = a++  + ++a ;
    printf("%d %d", b, a++);
    printf("%d\n", a);
    affiche : 22 12 13 .

    Je comprends sauf le 22 que je vois en 21 perso... b = 10 + 11 non ?

    Merci d'avance.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par larchicha Voir le message
    Dernier point que j'ai zappé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int a = 10, b ;
    b = a++  + ++a ;
    printf("%d %d", b, a++);
    printf("%d\n", a);
    affiche : 22 12 13 .

    Je comprends sauf le 22 que je vois en 21 perso... b = 10 + 11 non ?

    Merci d'avance.
    D'un point de vue naïf, ça se tient quand même : Si a vaut 10, alors « a++ » vaut dix également, puis « a » est incrémenté. Ensuite, lors de « ++a », « a » vaut déja onze, mais est pré-incrémenté avant d'être évalué. Ça fait donc « 10 + 12 = 22 », et ça colle, surtout si tu es d'accord avec les autres chiffres.

    Le point important, par contre, c'est que ça ne sera pas toujours vrai :

    http://www.developpez.net/forums/d63...entre-ppi-ipp/

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par larchicha Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 0;
    for(i=0;i< 20;i++) {
        switch(i){
            case 0: i+=5 ;
            case 1: i+=2;
            case 5: i+=5;
            default: i+=4;
            break;
        }
        printf("%d", i);
        }
    affiche 16 et 21.
    Question : Pourquoi ? Je vois bien que dans le switch on commence à i = 0 donc i+=5 alors i=5 , déja il ne l'affiche pas et ensuite d'ou sort le 16 ? Oo
    Il te faut revoir le switch en C, et derouler l'algo a la main :
    i vaut 0, comme tu l'as dit
    On rentre dans le switch (i vaut toujours 0)
    On rentre dans le case 0, et i vaut donc 5.
    Il n'y a pas de break, donc on continue les instructions : i+2, i+5, i+4, ce qui fait 16 lorsqu'on rencontre le break.
    On affiche 16,
    On retourne dans le for, qui va incrementer i a un moment ou a un autre (voir lien donne ci-dessus).
    Est-ce que i est toujours inferieur a 20 ? Oui, donc on continue, et on rentre dans le cas defaut, i+4 : 17+4 = 21.
    Break. On affiche.
    On incremente i. Est-ce que i vaut moins de 20 ? Non, on sort.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Merci à tous. Tout est très clair maintenant.

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

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  2. [CR8.5] petite question ..
    Par mcrocher dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/09/2004, 15h04
  3. Une petite question
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/08/2004, 16h19
  4. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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