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 :

Forcer les opérandes à s'exécuter


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Forcer les opérandes à s'exécuter
    Bonjour à tous,

    J'ai deux traitements et au cas où d'un est effectif, je dois en faire un troisième.

    Cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(op1() || op2())
      op3();
    Sauf que si le compilateur évalue op1() à false, il ne cherche pas à exécuter op2() car il connait déjà le résultat de la condition, en tout cas c'est ce que le débogage m'inspire.

    Le problème c'est que l'exécution de op2() est nécessaire pour la routine.

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool b1 = op1();
    bool b2 = op2();
    if(b1 || b2)
       op3();
    Pareil avec des int * ^2, rien à faire

    Y a-t-il n moyen de forcer l'exécution des opérandes même si ce n'est pas nécessaire pour connaitre le résultat final ?

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    | ou lieu de || et & au lieu de &&. Cela revient en faite a faire un masque binaire de b1 et b2. Tout les resultats sont evalués pour réaliser le masque.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Attention: l'opérateur logique || forcera l'exécution du second opérande si le premier est évalué à false, car la table de vérité montre que l'état unique est false:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      A   |  B   | A||B
    ---------------------
    FALSE | FALSE  | FALSE
    FALSE |  TRUE  | TRUE
    TRUE  |  <NE>* | TRUE
    <NE> NON EVALUE car TRUE || n'importe quoi == TRUE
    C'est l'opérateur && qui n'évaluera pas le deuxième opérande si le premier est évalué à false, car sa table de vérité donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      A   |  B   | A&&B
    ---------------------
    FALSE |  <NE>* | FALSE
    TRUE  | FALSE  | FALSE
    TRUE  |  TRUE  | TRUE
    <NE> NON EVALUE car FALSE && n'importe quoi == FALSE
    Quoi qu'il en soit, étant donné que les deux opérateurs logiques ont la possibilités de ne pas évaluer le second opérande en fonction du premier, tu es pour le moins coincé (du moins avant C++17) et tu ne peux pas les utiliser "tels quels".

    Mais la solution de passer par une (ou plusieurs) variable(s) intermédiaire(s) sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool test1=operande1();
    bool test2=operande2();
    if(test1||test2)
        fonction3();
    ou, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool result = operande1();
    result ||=operande2();
    if(result)
        fonction3();
    Devraient fonctionner. Dés lors: comment en arrive tu à la conclusion que l'on ne passe pas dans le deuxième opérande Pourrais tu nous montrer un minimum de code, avec, au minimum, la signature de tes fonctions servant pour operande1 et operande2 reproduisant ton problème
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Merci pour vos réponses,

    J'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool b1 = ...;
    bool b2 = ...;
    bool b3 = ...;
    return b1 || b2 || b3;
    Si ça ne fonctionnait pas hier c'est parce que j'avais oublié de l'appliquer à un endroit.

    Merci encore

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 385
    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 385
    Par défaut
    Citation Envoyé par koala01 Voir le message
    ou, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool result = operande1();
    result ||=operande2();
    if(result)
        fonction3();
    Devraient fonctionner.
    Là, je suis surpris. C'est contre-intuitif pour moi (d'ailleurs, je ne savais même pas que ||= était supporté, mais je confonds peut-être avec C#).

    Edit: Je viens de tester sous Visual 2013, ni &&= ni ||= ne compilent.
    Par contre, |= marche parfaitement et fait ce qu'on voulait (toujours évaluer la seconde opérande).

    Edit2: C# (du moins, C# 2.0) ne reconnait pas &&= comme un opérateur non plus.
    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.

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

Discussions similaires

  1. forcer les nombres
    Par shnouf dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/05/2006, 15h08
  2. Réponses: 2
    Dernier message: 16/05/2006, 18h53
  3. Afficher les messages d'exécution
    Par batama dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 02/05/2006, 19h42
  4. [9.2] forcer les majuscules au niveau de la table
    Par Yorglaa dans le forum Oracle
    Réponses: 3
    Dernier message: 20/04/2006, 12h33
  5. Réponses: 2
    Dernier message: 23/03/2005, 09h51

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