2011-11-04 16 views
7

yo estaba pasando por código de alguna VC++ en una gran base de código y me encontré con esto:¿Qué es y = y | =

if (nState & TOOL_TIPS_VISIBLE) 
     nState &= ~TOOL_TIPS_VISIBLE; 
    else 
     nState |= TOOL_TIPS_VISIBLE; 
    break; 

¿Hay alguna operador como & = o | = en C++? ¿Para qué sirve?
¿Es el equivalente a nState = nState & ~TOOL_TIPS_VISIBLE?

+0

La respuesta puede no ser tan directa como esta (aunque es muy probable que lo sea). Agregué más información que podría serle útil. –

Respuesta

9

x &= y es la misma que x = x & y
x |= y es la misma que x = x | y

+0

No necesariamente cierto, ver mi respuesta. –

2

x &= y significa x = x & y. Entonces sí, tienes razón.

2

Sí. &= es & lo += es +

3

Su nivel de bits y o

en el primer caso la bandera (bits) está desactivado

nState &= ~TOOL_TIPS_VISIBLE 

en el segundo caso, el indicador se enciende

nState |= TOOL_TIPS_VISIBLE 
1
x &= y; 

es equivalente a:

x = x & y; 

De la misma manera,

x|= y; 

es equivalente a:

x = x | y; 
1

& y | son similares a && y ||, sólo que trabaja en modo bit Moda. Así que ahora podría imaginar &= y |= funciona de manera similar a +=. Eso es x &= y; ==> x = x & y;

7

Lo que no se ha mencionado es que los operadores &= y |= se pueden sobrecargar. Por lo tanto, el código que publicó depende del tipo de nState (aunque es claramente una int, por lo que probablemente esto no se aplique aquí). La sobrecarga &= no sobrecargar de forma implícita &, por lo que en este caso

x &= y might not be the same as x = x & y 

También podría depender de lo que es TOOL_TIPS_VISIBLE.

struct s{ 
    int x; 
}; 

void operator &= (int& x, s y) 
{ 
    x = 0; 
} 

Ahora cada vez que lo hacen:

s TOOL_TIPS_VISIBLE; 
x &= TOOL_TIPS_VISIBLE; 

x se convertirá en 0. De nuevo, altamente improbable, pero bueno saberlo.

Las demás respuestas probablemente se apliquen aquí, pero vale la pena considerarlas.

+0

Mencionas una preocupación digna, pero si encontrara una base de código que sobrecargara '& =' con un significado y '&' con otro, inmediatamente arreglaría una flagrante no ortogonalidad, y tal vez buscaría a alguien para castigar, aunque probablemente se habrían ido hace mucho por un legado de tal horror. La sobrecarga debe ser intuitiva, mejorando la legibilidad del código, sin colocar las minas terrestres por todas partes. – wallyk

+0

Otro caso es que si 'x' es una expresión con efectos secundarios,' x | = y' invocará ese efecto secundario una vez, mientras '' x = x | y' lo aplicará dos veces (o incluso invocará un comportamiento indefinido, si los efectos secundarios no están protegidos adecuadamente por puntos de secuencia). Esto es especialmente relevante para las macros (aunque en C++ generalmente deberías evitarlas de todos modos). – celtschk