J'ai utilisé le célibataire ampersand (&) en C # pour signifier "Vérifiez la déclaration Mais ce qui suit semble être une signification et code> tout à fait, peut-on expliquer comment i & 1 code> fonctionne dans l'exemple suivant? p>
6 Réponses :
Bitwise et opérateur. P>
ici : p>
Le
et opérateur unaire code> renvoie l'adresse de son opérande (nécessitedangereux code> contexte). P>binaire
& opérateurs code> sont prédéfinis pour les types intégraux et BOOL. Pour des types intégrés,& code> calcule le logiqueet code> de ses opérandes. Pour bool opérands,& code> calcule le logiqueet code> de ses opérandes; c'est-à-dire que le résultat est vrai si et seulement si ses deux opérandes sont vraies. P>Le
& opérateur code> évalue les deux opérateurs indépendamment de la valeur de première. p> blockQuote>
Pour les types booléens, ce que vous avez mentionné, c'est comment il se comporte. p>
Pour les types entier, c'est l'opérateur "et" ". p>
Il peut être surchargé pour d'autres types. P>
Fondamentalement, l'expression (i & 1) == 0 code> vérifie si le bit le moins significatif de i code> est défini, ce qui ne se produit que si le numéro est impair . p>
L'ampersand représente un peu et une opération. Un opérateur bitwise renvoie le résultat d'une comparaison entre chaque bit correspondant dans les deux opérandes. P>
Par exemple, si X est 0110 et Y est 1010, alors un peu et des x et y (x & y) entraîne 0010. P>
Un seul & est "Bitwise et Opérateur", tout comme Dove a déclaré. Je regarde la deuxième partie de la question: "Pourquoi cela fonctionne-t-il?"
penser en binaire: p> Remarque Tous les numéros pars se termine avec 0; Donc, si le dernier bit Bitwise vérifie contre 1 retourner zéro (ce qui signifie "ne correspond pas"), c'est un nombre pair; p> p>
En C ++, vous pouvez utiliser et avec des valeurs de bool car i> un bool jette automatiquement à zéro ou à un (et à l'arrière) - une fois que vous optimisez les couts, vous êtes laissé avec quelque chose d'équivalent à && mais sans le Évaluation de court-circuit (vous garantissez donc que les effets secondaires de la bonne subexpression se produisent). Je suppose que cela s'applique en C # et Java, mais je ne me souviens pas de votre guichet automatique.
@Steve: Selon la question de l'OP, ils savent déjà que ce comportement existe comme un moyen de ne pas une logique booléenne à court-circuit.
@Jeff - mais il ne savait pas ce que l'opérateur était, je ne savais donc pas pourquoi cela a fonctionné pour cela. Il suffit d'essayer de relier les connaissances existantes à la nouvelle, clarifiant que le comportement de Bool Edward sait tomber hors du comportement des bits que vous avez expliqués et le comportement de moulage BOOL <-> Int.
réponses précédentes ne sont pas vraies, mais ne traitent pas comment Comme on l'a dit, Autrement dit, il y a deux différences fondamentales entre Voilà pourquoi nous avons presque toujours utiliser & code> diffère de && code>, que je pensais était votre question initiale, donc je vais prendre ça. P >
& code> est Bitwise ET. && code> est un ET logique. & code> effectue une opération ET sur ses opérandes bit par bit, et dans les fonctions générales exactement comme + code> ou * code> ou tout opérateur arithmétique. && code> est plus complexe. Il compare chacun de ses opérandes contre zéro. Si le premier opérande est égal à zéro, il prend la valeur false code> et court-circuite le reste de l'expression, à savoir qu'il n'évalue les opérandes restants. Si la première valeur est non nulle, il examine la deuxième valeur. Si cela est zéro, il prend la valeur false code>, sinon il prend la valeur true code>. Dans les deux cas, il continue d'évaluer l'expression. P>
& code> et && code>: p>
& code> fonctionne bit par bit en && code> ne tient compte que zéro et non zéro et renvoie toujours 0 ou 1. Ainsi 5 & 6 < / code> (binaire 101 & 110 code>) donne 4 (binaire 100 code>), tandis que 5 && 6 code> donne 1 ( true code>). p> li>
&& code> "circuits courts". Si la première valeur est égale à zéro, il n'évalue pas la deuxième valeur. & code> n'a pas cette règle. Ceci est important de plusieurs façons: p>
& code> ces effets secondaires arrivent toujours, alors qu'avec && code> ils ne le font pas. Donc, x et (y ++) code> toujours incrément y code>, tandis que x && (y ++) code> ne incrément y code> si x code> est non nul. Cela devient plus important, et peut-être plus subtile, si le second opérande est un appel de fonction. Li>
x! = NULL && X-> foo == 3 code>. Avec & code>, lorsque x code> est null code>, qui pourrait bombarder avec des défauts de segment ou l'équivalent. Li>
x! = 'A' && readTonsOfStuffFromDatabaseAndCalculateTotal (x) code>. Avec & code>, la lecture se serait produit, et peut-être une perte de temps. Li>
Ol> li>
ol>
&& code> pour des choses qui sont vraiment des opérations logiques, et de limiter l'utilisation de & code> quand nous voulons vraiment une opération sage peu. Mais il y a des moments où vous ne voulez pas le court-circuit se produise, et dans ce cas, & code> peut être un bon choix. Mais si vous l'utilisez pour « logiquement », être très prudent avec des opérandes qui peuvent avoir des valeurs autres que 0 ou 1. 1 && 2 code> est true code>, mais 1 & 2 code> est false code>. p>
Merci pour en fait i> l'expliquant
Notez que dans C #, l'opérateur && > BOOL code>, alors demandez si le premier opérande est zéro n'a aucun sens (en C # A BOOL < / code> ne peut être que faux code> ou true code>, jamais un numéro), et en particulier 5 && 6 code> n'est pas autorisé. Mais la description est pertinente pour d'autres langues.
Oups, je suis dérivé de C # à C / C ++.
Si vous pensez à cette déclaration ... c'est inefficace.
Je l'ai eu de cette question