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 :

Valeur de 2<0-0<2 ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut Valeur de 2<0-0<2 ?
    Bonjour
    Je suis actuellement en train de m'amuser à réduire la taille de codes C et je tombe sur ce résultat que je ne comprends pas :
    pourquoi 2<0-0<2 donne-t-il la valeur 1 alors que (2<0)-(0<2) donne la bonne valeur -1 ??
    Merci de vos lumières

    Trap D
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  2. #2
    Invité
    Invité(e)
    Par défaut
    Mais je comprend pas pourquoi 1 puisque : ( priorité( - ) > priorité( > )) => ( ( 2<0-0<2) == ( 2<0<2)) et ( ( 2<0<2) == false)

    D’après la norme, false = 0 et true = !false, donc true n'est pas forcement égal a 1 et si true = -1 alors -true = 1, je vois pas ou est le problème.
    Dernière modification par LittleWhite ; 03/12/2015 à 10h21.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Ratator Voir le message
    Mais je comprend pas pourquoi 1 puisque : ( priorité( - ) > priorité( > )) => ( ( 2<0-0<2) == ( 2<0<2)) et ( ( 2<0<2) == false)

    D’après la norme, false = 0 et true = !false, donc true n'est pas forcement égal a 1 et si true = -1 alors -true = 1, je vois pas ou est le problème.
    Il me semble qu'en C la norme précise à un certain point qu'une condition vraie est égale à 1, ou au moins que !0 donne 1.

    Contrairement au VB6 par exemple, où !0 est la même chose que ~0, c'est-à-dire -1 (d'où la constante VARIANT_TRUE égale à -1 dans l'API Windows, pour communiquer avec des composants COM)

    Edit: ↓En effet, je me souviens avoir également -1 pour vrai sur mon vieil Amstrad CPC.
    Et une instruction du microprocesseur Motorola 68000 règle l'octet destination à 0xFF si telle ou telle condition est vraie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Contrairement au VB6 par exemple, où !0 est la même chose que ~0, c'est-à-dire -1 (d'où la constante VARIANT_TRUE égale à -1 dans l'API Windows, pour communiquer avec des composants COM)
    Et en fait, c'est vrai de très longue date, puisque c'était déjà le cas dans le Basic Microsoft de mon TO8D de 1986. :-) Ça avait du sens, d'ailleurs : c'était compatible avec les instructions type COM (complément) qu'on trouve sur 6809, ça peut se faire avec DEC et INC de la même façon qu'avec un booléen ordinaire, ça agit sur tous les bits du registre uniformément, ça permet d'utiliser le bit de signe (= bit de poids fort, dont le contrôle est disponible sur beaucoup de microprocesseurs alors que le bit de parité ou poids faible n'est contrôlé automatiquement que sur certains, dont les x86) et en plus, un DEC/INC pour passer de 0 à -1 et vice versa a le bon goût d'impliquer la retenue C, très utilisée dans les instructions de contrôle et de branchement, et souvent considérée comme le (n+1)ième bit d'un registre de n bits.

    Maintenant, je ne sais pas si c'était une directive de Kemeny & Kurtz dans le Basic original ou si c'est un choix de Microsoft en particulier… C'est à vérifier.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Oui, J'ai oublié de dire que je teste avec Visual C 2010 et que 0<2 donne 1 et 2< 0 donne 0. C'est pourquoi je ne comprends pas, mais il est tard et peut-être que demain matin j'aurai l'esprit plus clair !
    Bonne nuit.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    Citation Envoyé par Trap D Voir le message
    pourquoi 2<0-0<2 donne-t-il la valeur 1 alors que (2<0)-(0<2) donne la bonne valeur -1 ??
    Parce que les opérateurs arithmétiques sont prioritaires face aux opérateurs de comparaison. C'est donc le « - » qui va être évalué en premier. Et comme 0 - 0 = 0, on obtient :

    Ensuite, puisque les deux opérateurs sont les mêmes, ils sont évalués de gauche à droite. Et comme le C utilise « 1 » pour représenter un true, on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     2<0<2 = (2<0)<2 = 1<2 = 1
    En mettant des parenthèses, tu as deux opérations booléenes, dont la première est fausse et la seconde vraie. Elle se résolvent donc en :

    Qui vaut bien « -1 ».

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut

    Merci de ces explications, je n'avais pas pensé à tester 2< 0 < 2, je pensais que j'aurais directement un "syntax error" !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45
  2. Recherche fonctions rendant la valeur
    Par Bertrand_Collet dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/11/2002, 12h05
  3. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  4. [XSLT]position d'un element de valeur specifique
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/07/2002, 16h42
  5. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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