réponses précédentes ne sont pas vraies, mais ne dit pas comment & diffère de & &, que je pensais était votre question initiale, donc je vais prendre ça. Comme il a été dit, "&" est un AND bit à bit. "& &" est un AND logique.& exécute une opération ET sur ses opérandes bit par bit, et en général des fonctions exactement comme plus ou temps ou n'importe quel opérateur arithmétique. & & est plus complexe. Si compare chacun de ses opérandes contre zéro. Si le premier opérande est nul, il prend la valeur FALSE et court-circuite le reste de l'expression, c'est-à-dire qu'il n'évalue aucun opérande restant. Si la première valeur est différente de zéro, elle examine la deuxième valeur. Si c'est zéro, il prend la valeur false, sinon il prend la valeur true. Dans les deux cas, il continue à évaluer l'expression.
C'est, il y a deux différences fondamentales entre & et & &:
& actionnent bit par bit alors que & & ne considère que zéro et non zéro et retourne toujours 0 ou 1. Ainsi 5 & 6 (binaire 101 & 110) donne 4 (binaire 100), tandis que 5 & & 6 donne 1 (vrai).
& & "courts-circuits". Si la première valeur est zéro, elle n'évalue pas la deuxième valeur. & n'a pas cette règle. Ceci est important de plusieurs façons. Tout d'abord, si la seconde valeur a des effets secondaires, alors avec & ces effets secondaires se produisent toujours, alors qu'avec & & ils ne le font pas. Donc, "x & (y ++)" sera toujours incrémenté y, tandis que "x & & (y ++)" n'augmentera que si x n'est pas zéro. Cela devient plus important - et peut-être plus subtil - si le second opérande est un appel de fonction. Deuxièmement, la première valeur peut tester quelque chose qui détermine que la deuxième valeur est invalide. Comme "x! = NULL & & x-> foo == 3". Avec &, lorsque x est nul, il pourrait exploser avec des défauts de segment ou l'équivalent. Et troisièmement, il peut y avoir des gains de performance importants. Life, "x! = 'A' & & readTonsOfStuffFromDatabaseAndCalculateTotal (x)". Avec &, la lecture se produirait indépendamment, et peut-être une perte de temps totale.
C'est la raison pour laquelle nous utilisons presque toujours & & pour des choses qui sont vraiment des opérations logiques, et de limiter l'utilisation de & quand nous voulons vraiment une opération peu sage. Mais il y a des moments où vous ne voulez pas que le court-circuit se produise, et dans ce cas & peut être un bon choix. Mais si vous l'utilisez pour fonctionner "logiquement", soyez très prudent avec les opérandes qui peuvent avoir des valeurs autres que 0 ou 1. 1 & & 2 est vrai, mais 1 & 2 est faux.
Si vous pensez à cette affirmation ... C'est inefficace. – Min
Je l'ai eu de cette question http://stackoverflow.com/questions/1537528/how-to-convert-system-linq-enumerable-wherelistiteratorint-to-listint/1537568#1537568 dans lequel il a été indiqué que la variante & était plus rapide. –