2012-02-03 1 views
3

Tenir compte de ce code:peu de détails sur l'utilisation de l'opérateur « ou »

int a = 5; 
if (a == 5 || a == 10) 
    doSomething(); 

Dans ce cas a est 5 donc la première condition est vraie. Est-ce que le programme vérifiera si la deuxième condition est vraie ou il commencera à exécuter doSomething() immédiatement après s'être assuré que a est vraiment 5?

+1

Non, il ne vérifie pas la deuxième condition - elle ira seulement aussi loin que possible dans les conditions nécessaires. S'il est évident que la valeur de vérité de la condition est, à mi-chemin, cela ne dérange pas avec l'autre reste de la condition. Copie possible de [Comment le C++ gère-t-il &&? (Évaluation de court-circuit)] (http://stackoverflow.com/questions/5211961/how-does-c-handle-short-circuit-evaluation): opérateur différent, même problème. Voir aussi: http://en.wikipedia.org/wiki/Short-circuit_evaluation – Piskvor

+0

Vérifiez la sortie de l'assemblage, et vous le saurez. utilisez le -S pour le compilateur, certains peuvent être différents. – L7ColWinters

+1

@Piskvor Pas tout à fait un doublon - celui-ci est étiqueté "C" plutôt que "C++" (même si dans le cas de l'opérateur || ils ont un comportement commun) – razlebe

Répondre

4

La deuxième condition ne sera pas vérifiée. C court-circuite les évaluations logiques, de sorte que dès que la vérité ou la fausseté de la condition peut être déterminée, elle s'arrête. Notez que, vu le code affiché, le compilateur pourrait même ne pas générer de code pour effectuer la première comparaison car il peut déterminer au moment de la compilation que la condition est satisfaite et qu'aucun code intervenant ne peut modifier la valeur de a.

Partagez et appréciez.

+0

J'ai essayé avec mingw, seulement optimisé l'a fait sauter la comparaison. – L7ColWinters

1
int a = 5; 
if (a == 5 || a == 10) 
    doSomething(); 

dans cet exemple, l'opérande opérande gauche de || est évalué à 1 si l'opérande de droite ne sera pas évalué.

Le compilateur est nécessaire de ne pas évaluer le droit opérande de || opérateur lorsque l'opérande gauche est évaluée à 1.

1

Lorsqu'il s'agit du logical operations, le compilateur arrête d'évaluer l'expression dès qu'il trouve la vérité ou la fausseté de l'expression.

Le truth-table pour logical or (||) Le fonctionnement est comme suit:

A B A||B A&&B 
0 0 0  0 
0 1 1  0 
1 0 1  0 
1 1 1  1 

Donc, pour une expression comme a == 5 || a == 10, quand a est égal à 5, l'expression sera évaluée à true lorsque le compilateur voit a == 5 partie . Ainsi, indépendamment du fait que le reste de l'expression soit évalué à true ou false, en raison de l'opérateur logical or (||) (voir ci-dessus truth-table), cette expression sera évaluée à true. Ainsi, le compilateur supprimera l'exécution du reste de l'expression.

1

Tout compilateur décent ne vérifie même pas la première condition, car au moment de la compilation il sait immédiatement qu'il devrait appeler votre méthode. (mais bien sûr, tous les commentaires sur le court-circuit restent vrai - mais pas ici ;-)