2011-08-01 4 views
8

Existe-t-il un opérateur logique & en C++? par exemple. un opérateur qui fonctionne comme & & sauf qu'il évalue également les arguments ultérieurs même si certains d'entre eux ont déjà été évalués comme faux? L'opérateur & est le bitwise et l'opérateur que je comprends.C++ logique et opérateur

+6

Pourquoi auriez-vous besoin de cela? Pour tous les cas d'utilisation que je peux imaginer, vous devriez juste réparer ce gâchis qui mélange les conditions logiques avec les effets secondaires obligatoires. – delnan

+0

@Ziyao Wei - lire à nouveau :) à delnan - Je suis d'accord avec vous. –

+0

@Kiril: Noticed;) –

Répondre

21

L'opérateur & est en effet l'opérateur au niveau du bit. Je suppose que vous avez quelque chose comme

if (f() && g()) { /*do something*/ } 

et que vous voulez à la fois f() et g() pour exécuter, que l'un d'entre eux a été évaluée à false. Je vous suggère de faire quelque chose d'autre à la place:

bool bF = f(); 
bool bG = g(); 

if (bF && bG) { /*do something*/ } 

Cela permet également une meilleure lisibilité et ne confondez pas les autres programmeurs qui tentent de maintenir votre code. À long terme, ça vaut le coup.

+1

C'est la meilleure façon de le faire. –

+0

On peut changer 'if (f() && g())' en 'if ((int) f() + (int) g() == 2)' qui forcera les deux opérandes à évaluer. – Nawaz

+3

Que faire si f() et g() retournent int? Si f() renvoie -1 et g() renvoie 1, f() && g() donnerait vrai, alors que votre condition donnerait faux ... –

1

Il n'y a pas de & logique, mais seulement & bit à bit. Si vous voulez éviter le court-circuit des instructions logiques, vous devez utiliser un proxy pour ne pas être optimisé par le compilateur pour l'atteindre (comme un méta-template variadique).

0

Si vous surchargez l'opérateur & &, il ne court-circuite pas.

struct Bool { 
    bool val; 
    Bool(bool f): val(f) {} 
    operator bool() { 
    return val;  
    } 
}; 


bool operator&&(Bool a, Bool b) { 
    return (bool)a && (bool)b; 
} 

ref: point 19, l'article 13.9 dans le C++ FAQ lite

Bien que mentionné là, c'est une très mauvaise idée et embrouille les gens. Vous pourriez vouloir le faire d'une manière très limitée mais si vous avez un cas très spécial.

+2

C'est une chose terrible à faire. –

+0

Je ne le recommanderais à personne: D –

+1

Wow. Cela me fait peur de tous les effets secondaires funky qu'il pourrait introduire de tout le code qui suppose (correctement) qu'un court-circuit est requis. (par exemple if ((a! = null) && (a.foo = 123)) ...) – Joe

4

Il n'existe aucun opérateur "always execute" en C++. Ma première tendance est qu'au lieu de chercher un nouvel opérateur, vous devriez réévaluer ce que vos méthodes font pour éliminer les effets secondaires qui commandent qu'ils soient exécutés. Il peut être possible de simplement utiliser && et être heureux.

Cependant, si vous voulez réellement faire toutes les opérations dans l'ordre et ensuite voir si elles ont toutes réussi, probablement la réponse de Luchian Grigore serait la meilleure. Il indique clairement que ce sont des étapes séquentielles qui doivent toujours être exécutées. Il y a une autre option qui peut être ou ne pas être moins claire:

// Each method needs to execute in sequence but we use "success" to track overall success. The order of operands to `operator&&` shouldn't be changed. 
bool success = f1(); 
success = f2() && success; 
success = f3() && success; 

if(success) ... 
+1

+1 Technique utile pour apprendre. Bien que je commence toujours par 'bool success = true ', toutes les évaluations conditionnelles se ressemblent. –

+0

J'utilise 'succès & = f2();' – MSalters

Questions connexes