2011-11-04 21 views
7

stavo passando il codice alcuni VC++ in una grande base di codice e sono imbattuto in questo:Che cosa è e = e | =

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

Esiste un tale operatore & = o | = in C++? Cosa serve?
È l'equivalente di nState = nState & ~TOOL_TIPS_VISIBLE?

+0

La risposta potrebbe non essere così semplice (anche se è molto probabile che lo sia). Ho aggiunto alcune informazioni aggiuntive che potresti trovare utili. –

risposta

9

x &= y è uguale x = x & y
x |= y è uguale x = x | y

+0

Non necessariamente vero, vedere la mia risposta. –

2

x &= y mezzi x = x & y. Quindi sì hai ragione.

2

Sì. &= è quello & ciò += vale a +

3

sua bitwise eo

nel primo caso il flag (bit) viene disattivato

nState &= ~TOOL_TIPS_VISIBLE 

nel secondo caso il flag è attivato

nState |= TOOL_TIPS_VISIBLE 
1
x &= y; 

è equivalente a:

x = x & y; 

Allo stesso modo,

x|= y; 

è equivalente a:

x = x | y; 
1

& e | sono simili a && e ||, solo che lavori in bitwise moda. Quindi ora puoi immaginare &= e |= funziona come +=. Questo è x &= y; ==> x = x & y;

7

Ciò che non è stato menzionato è che entrambi gli operatori &= e |= possono essere sovraccaricati. Pertanto, il codice che hai postato dipende dal tipo di nState (anche se è abbastanza chiaramente un int, quindi molto probabilmente questo non si applica qui). Sovraccarico &= non sovraccaricare implicitamente &, quindi in questo caso

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

Potrebbe anche dipendere da quello che è TOOL_TIPS_VISIBLE.

struct s{ 
    int x; 
}; 

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

Ora ogni volta che fate:

s TOOL_TIPS_VISIBLE; 
x &= TOOL_TIPS_VISIBLE; 

x diventerà 0. Ancora una volta, altamente improbabile, ma buono a sapersi comunque.

Tutte le altre risposte probabilmente si applicano qui, ma vale la pena considerarle.

+0

Tu fai sorgere una degna preoccupazione, ma se trovassi un codice base che sovraccaricasse '& =' con un significato e '&' con un altro, correggerei immediatamente tale non-ortogonalità sfacciata, e forse cercherò qualcuno che castighi, sebbene probabilmente sarebbero andati via da tempo per un'eredità così terribile. Il sovraccarico dovrebbe essere intuitivo, migliorando la leggibilità del codice, non posizionando le mine. – wallyk

+0

Un altro caso è che se 'x' è un'espressione con effetti collaterali,' x | = y' invocherà quell'effetto collaterale una volta, mentre 'x = x | y' la applicherà due volte (o anche invocherà un comportamento indefinito, se gli effetti collaterali non sono adeguatamente protetti dai punti di sequenza). Questo è particolarmente rilevante per le macro (anche se in C++ dovresti generalmente evitare quelle). – celtschk

Problemi correlati