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 :

Signification d'un double point d'interrogation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut Signification d'un double point d'interrogation
    Bonjour,

    à ce jour, en C comme dans un tas d'autres langages, je connaissais ! que je traduis par "inverse ce qui suit".

    Mais aujourd'hui, dans le code source de pulseaudio12.2, je rencontre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    conf->system_instance = !!b;
    Sachant que conf->system_instance est un bool et b un int, je me (vous !) demande tout simplement pourquoi ne pas avoir écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conf->system_instance = b;
    Merci de vos (comme d'habitude ) lumineuses explications, et bon 14 juillet !

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    J'ai regardé sur Internet, et la réponse est dans la question

    En C, toute valeur différente de 0 est true. Avec la double négation logique, on uniformise en réduisant aux valeurs 1 ou 0.
    • 0, false - !!0 vaut 0
    • n’importe quelle autre valeur, true - !!X vaut 1


    Il y a surtout plusieurs manières de faire ... + ou - portable, mais effectivement 1 test ternaire me semble plus propre ((X != 0)? 1: 0).

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut
    Pas trouvé sur le web (faut dire aussi que rechercher langage C explication "!!" ne m'a pas remonté des merveilles, fallait pas rêver).

    Merci pour ta réponse, cependant tu ne réponds pas à ma question : pourquoi ne pas avoir utilisé tout simplement conf->system_instance = b; puisque si b vaut 0 le boolean sera false, sinon il sera true.
    Et c'est exactement ce que tu écris.

    Je ne vois pas ce que
    Citation Envoyé par foetus Voir le message
    on uniformise en réduisant aux valeurs 1 ou 0.
    apporte.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pas trouvé sur le web (faut dire aussi que rechercher langage C explication "!!" ne m'a pas remonté des merveilles, fallait pas rêver).
    Il faut chercher "C double not logical"


    Citation Envoyé par Jipété Voir le message
    pourquoi ne pas avoir utilisé tout simplement conf->system_instance = b; puisque si b vaut 0 le boolean sera false, sinon il sera true.
    pour cela il faut lire le code, et voir comment cette variable conf->system_instance est utilisée.
    Mais on peut penser que conf veut dire configuration, et que dans 1 fichier de configuration ou 1 de base données, c'est plus facile d'avoir 2 valeurs 0 et 1 (les tests, le parsage des valeurs, l'écriture, ...) que 58446591 pour true

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    C'est une vieille syntaxe qui rapporte !b sur [0,1] puis prend l'inverse. Qui permet d'avoir 1 si b != 0, 0 sinon.
    Une syntaxe récente sera juste conf->system_instance = b != 0;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Une syntaxe récente sera juste conf->system_instance = b != 0;
    Non la + récente est 1 cast conf->system_instance = (_Bool) b;.

    Édit : Et même ici le cast ne sert à rien parce qu'on travaille en C et il faut que la variable conf->system_instance soit de type _Bool.
    Donc la solution la + récente mais effectivement, il faut utiliser le nouveau type C99 dans son code ... ce qui ne semble pas être le cas

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut
    Citation Envoyé par foetus Voir le message
    pour cela il faut lire le code, et voir comment cette variable conf->system_instance est utilisée.:
    Y aura pas des millions de possibilités, hein :
    Citation Envoyé par Jipété Voir le message
    Sachant que conf->system_instance est un bool
    (conf c'est la structure des options de configuration, oui)


    Citation Envoyé par foetus Voir le message
    Il faut chercher "C double not logical"
    Fallait en avoir l'idée ! Bien joué !

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Jipété Voir le message
    Y aura pas des millions de possibilités, hein :
    Hé non. Et j'ai beau chercher, je ne vois pas non plus l'avantage à forcer "b" à être 1 plutôt que 572542. Même la brillante () suggestion de foetus à propos des bdd ne me convainc pas (l'insertion d'un int dans un bool provoquera un cast implicite dans le champ de la bdd) ; et dans le code C lui-même, partout où b sera utilisé comme un booléen, alors sa valeur réelle n'a pas d'importance (sauf si évidemment on vient tester explicitement if (conf->system_instance == 1) mais je ne pense pas qu'un professionnel C fasse cette monumentale bêtise).
    Toutefois admettons que pour une obscure raison cela soit nécessaire, alors comme foetus j'aurais préféré le ternaire bien détaillé => conf->system_instance=b ?1 :0. Là avec son !!b je pense que l'auteur de pulseaudio12 a voulu écrire un truc à la "one again" mais qui ne séduit en fait personne.
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Résultat et explication d'une instruction
    Par mr.bigka dans le forum Débuter
    Réponses: 2
    Dernier message: 01/12/2013, 18h26
  2. Explication d'une instruction
    Par DANIA511 dans le forum OpenCV
    Réponses: 2
    Dernier message: 03/05/2012, 12h32
  3. [Débutant] Explications sur quelques instructions en Assembleur
    Par voodka2007 dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 01/01/2009, 21h47
  4. Explication d'une instruction de test
    Par ToTo13 dans le forum C
    Réponses: 8
    Dernier message: 07/02/2007, 17h02
  5. Explication sur une instruction...
    Par snoop dans le forum C++
    Réponses: 5
    Dernier message: 03/05/2006, 22h56

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