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 :

Pré incrémentation d'une négation


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Pré incrémentation d'une négation
    Bonjour à tous !

    Dans le cadre d'un exercice, je cherche à comprendre pour quoi le code suivant affiche une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        int B=2;
        printf("%d",++!B);
        return 0;
    }
    D'après ce que j'ai compris, la pré-incrémentation et la négation ont la même priorité dans le tableau des opérateurs. Dans ce cas, le compilateur lit de droite à gauche. Comme !B retourne 0 sous forme d'un entier, pourquoi ne peut-on pas pré-incrémenter cette valeur ? Est-ce du au fait que le compilateur ne puisse pas détecter au préalable si ++ est une pré-incrémentation puisqu'il n'y a pas d'entier derrière ? J'ai un peu de mal à comprendre ! Merci de votre aide

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    août 2008
    Messages
    24 929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 24 929
    Points : 170 577
    Points
    170 577
    Par défaut


    En fait, qu'est-ce que tu cherches à faire avec une telle ligne ? Intuitivement, je dirais que tu cherches l'opérateur ~ (inverser les bits). En te lisant plus, je penche plus vers un "!x + 1".

    Là, tu évalues d'abord !x (une valeur : soit 0, soit 1). Ensuite, tu cherches à incrémenter la variable !x, qui n'est pas une variable, mais juste une valeur. Quand tu écris un "++x", le compilateur comprend, grosso modo, "x += 1; x" : ici, comment pourrais-tu faire une chose comme "!x += 1" ?
    Vous souhaitez participer aux rubriques Qt ou PyQt (tutoriels, FAQ, traductions), HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par UnPetitTroll Voir le message
    Comme !B retourne 0 sous forme d'un entier, pourquoi ne peut-on pas pré-incrémenter cette valeur ?
    Parce que justement tu ne peux pas incrémenter une valeur en dur. La pré/post incrémentation ne peut s'appliquer que sur une variable (puisqu'en dehors de renvoyer une valeur, elle modifie aussi la variable incrémentée). Or !B ce n'est pas une variable, c'est une expression calculée. Donc c'est exactement comme si tu avais écrit ++0.
    Le C est très permissif dans ses écritures mais il a quand-même des limites. Et quand on les atteint c'est qu'on est déjà allé très très loin dans les instructions bizarres...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Parce que justement tu ne peux pas incrémenter une valeur en dur. La pré/post incrémentation ne peut s'appliquer que sur une variable (puisqu'en dehors de renvoyer une valeur, elle modifie aussi la variable incrémentée). Or !B ce n'est pas une variable, c'est une expression calculée. Donc c'est exactement comme si tu avais écrit ++0.
    Le C est très permissif dans ses écritures mais il a quand-même des limites. Et quand on les atteint c'est qu'on est déjà allé très très loin dans les instructions bizarres...
    En fait, qu'est-ce que tu cherches à faire avec une telle ligne ? Intuitivement, je dirais que tu cherches l'opérateur ~ (inverser les bits). En te lisant plus, je penche plus vers un "!x + 1".

    Là, tu évalues d'abord !x (une valeur : soit 0, soit 1). Ensuite, tu cherches à incrémenter la variable !x, qui n'est pas une variable, mais juste une valeur. Quand tu écris un "++x", le compilateur comprend, grosso modo, "x += 1; x" : ici, comment pourrais-tu faire une chose comme "!x += 1" ?
    Merci beaucoup c'est super clair
    Je ne cherche pas à faire quoi que ce soit d'intelligent, mais juste à faire un exercice L'écriture proposée n'a effectivement aucun intérêt pratique je pense !

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

Discussions similaires

  1. Champs virtuel auto incrémenté dans une vue
    Par berceker united dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2006, 15h33
  2. [ORACLE 10G]Incrémentation d'une date d'un jour
    Par titanblanc dans le forum Oracle
    Réponses: 2
    Dernier message: 05/01/2006, 12h07
  3. Réponses: 3
    Dernier message: 27/11/2005, 21h57
  4. [Débutant] Probleme d'incrémentation d'une variable
    Par sakuragikan dans le forum ASP
    Réponses: 2
    Dernier message: 25/08/2005, 14h11
  5. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 21h05

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