2010-09-05 8 views

Répondre

11

| est un opérateur au niveau du bit OR, alors que || est un opérateur OR logique. A savoir, le premier est utilisé pour "combiner" les bits de deux valeurs numériques comme une union, tandis que le second évalue à vrai si l'une ou l'autre des conditions du côté gauche ou du côté droit de l'opérateur est vraie.

Plus précisément, les opérateurs binaires (pas confondre avec les opérateurs logiques) opèrent sur chaque bit des nombres (à la même position ordinale), et calcule en conséquence un résultat. Dans le cas d'une opération de bits OR, le bit résultant est 1 si bit est 1 et 0 seulement si les deux bits sont 0. Par exemple, 1 | 2 = 3, parce que:

1 = 0001 
2 = 0010 
-------- 
    0011 = 3 

En outre, 2 | 3 = 3, parce que:

2 = 0010 
3 = 0011 
-------- 
    0011 = 3 

Cela peut sembler déroutant au premier abord, mais finalement vous obtenez le coup de lui. Bitwise OR est utilisé principalement dans les cas pour définir des indicateurs sur un champ de bits. C'est-à-dire une valeur qui maintient l'état activé/désactivé pour un ensemble de conditions connexes dans une seule valeur (généralement un nombre de 32 bits). Dans Win32, la valeur de style de fenêtre est un bon exemple d'un champ de bits, où chaque style est représenté par un seul bit (ou un drapeau), comme WS_CAPTION, qui indique si la fenêtre a une barre de titre ou non.

3

Il y a plusieurs (généralement 32, 16, 8 ou 64) bits dans un mot. Le OU bit à bit (une barre verticale) renvoie le OU logique pour chaque position de bit dans cette position de bit. L'OR logique (deux barres verticales) ne renvoie que TRUE ou FALSE.

0

Le || est un ou logique et le | est un peu au niveau ou. La plupart du temps quand vous vérifiez des choses comme si (i == 0 || i == 1) vous voulez juste utiliser || mais quand vous faites des choses comme passer des drapeaux en tant que variable, utilisez |. (Si vous ne savez pas ce qui vous ne avez probablement pas besoin | du tout)

2

Comme d'autres l'ont mentionné, | est le au niveau du bit opérateur OU et || est le logique opérateur OU, et ils sont conceptuellement différents opérations qui (généralement) fonctionnent sur différents types d'entrées. Mais cela pourrait alors soulever une autre question: si vous utilisiez | avec des opérandes booléens, cela ne ferait-il pas la même chose que || puisque tout se résume finalement à des bits de toute façon? Un opérateur || est-il nécessaire? En dehors de la différence conceptuelle, une autre différence importante est que || est court-circuitant. Cela signifie que si le premier opérande est vrai, le second opérande n'est pas évalué du tout. Par exemple:

int flag = Foo() || Bar(); 

invoquerait Bar() seulement si Foo() renvoie 0. Si | ont été utilisés, les deux opérandes seraient toujours évaluées.

(Et, bien sûr, & et && ont des comportements analogues.)

+0

+1 voudrais pouvoir voter ce plus d'une fois. Point TRES important –