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
    Futur Membre du Club
    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



    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
    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
    Futur Membre du Club
    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 !

###raw>template_hook.ano_emploi###