2010-09-10 15 views
7

L'ho già visto in codice, ma l'ho dimenticato. Fondamentalmente attiva una variabile booleana. Se è vero, verrà impostato su false e viceversa. Ma purtroppo ho dimenticato la sintassi.operazione booleana trucco

E 'fondamentalmente un uno di linea per questo:

if (myVar) { 
    myVar = false; 
} else { 
    myVar = true; 
} 

E' qualcosa di simile, ma non so come si chiama o la sintassi corretta è:

myVar = myVar : false ? true; 
+0

presumo che sia un errore di battitura, la v extra? –

+1

se trovi che una delle risposte è ciò che stavi cercando, puoi cliccare sul segno di spunta "accetto" sotto il numero. – OscarRyz

risposta

70

Come su

myVar = !myVar 

?

+1

questo è più semplice IMO –

+1

Sì, questo è un buon interruttore - anche se in realtà dipende da cosa stai facendo nella tua app se vuoi usare una sintassi data per qualcosa di simile. Sai - quanto concettualmente vicino è a ciò che stai effettivamente facendo. –

+3

+0: poiché questa risposta offre solo un'alternativa, non risponde affatto alla domanda. – Guffa

27

myVar = myVar ? false : true; utilizza conditional operator.

Si può solo fare questo, però

myVar = !myVar; 
+2

Hai il: e? indietro. Va 'condizione? vero ramo: falso ramo'. – Tesserex

+0

@Tesserex: corretto –

+0

Inoltre, questo viene spesso definito "l'operatore ternario" poiché è l'unico operatore 3-arity nella maggior parte dei linguaggi di programmazione. – Ben

4

Il codice più piccolo mi viene in mente in questo momento. Non so quale sia la sua chiamata (se ha un nome, come lei sembra suggerire)

myVar = !myVar 
+1

Si chiama a * negazione *. Dovrebbe esserci un elenco di operatori aritmetici e logici nel manuale da qualche parte. –

+1

Negazione unaria? –

+0

ce ne sono altri? –

5

Cosa state pensando di è l'operatore condizionale:

myVar = myVvar ? false : true; 

(Come si vede, un sacco di persone lo chiamano "l'operatore ternario", ma ciò significa solo che si tratta di un operatore con tre operandi, ma in questo linguaggio c'è un solo operatore con tre operandi, ma non dice ancora nulla su ciò che l'operatore

È ovviamente più semplice utilizzare l'operatore di negazione:

myVar = !myVar; 
0

C'è un operatore ternario (wikipedia). Che ti permette di scrivere una frase if-else condensata come nel secondo esempio.

in Java:

myVar = (myVar) ? true : false; 

C'è anche l'operatore NOT, che alterna una variabile booleana. In java che è! Credo che sia quello che vuoi.

myVar = !myVar; 
4

Quello di cui si parla è l'operatore "ternario" o "condizionale", che esegue una sostituzione in linea secondo una condizione.

La sintassi è:

condition ? trueValue : falseValue 

Io di solito buttare parentesi intorno alla mia condizione, a volte in giro per tutta operatore condizionale. Dipende da quanto sto cercando di delineare da tutto il resto.

Così, per esempio, si supponga di voler restituire il più grande dei due numeri:

public int max(int a, int b) 
{ 
    return (a > b) ? a : b; 
} 

Avviso che può essere sostituito in mezzo qualcos'altro.


OK, ora affrontiamo la tua domanda relativa al passaggio di un tipo booleano.

myVar = (myVar) ? false : true; 

è come si farebbe con l'operatore condizionale. (Anche in questo caso, le parentesi non sono richieste, ho appena li favore.)

ma c'è un modo più semplice per attivare o disattivare la booleano ... utilizzando l'operatore logico NOT ("!"):

myVar = !myVar; 

Tenere è semplice. :-)

3
if(myVar == true) 
{ 
    myVar = false; 
} 
else if (myVar == false) 
{ 
    myVar = true; 
} 
else 
{ 
    myVar = FILE_NOT_FOUND 
} 
+1

-1 e un gemito per l'errore di battitura (myVar vs MyVar) e per eccessivamente verboso, +1 per l'umorismo alla fine. Correggere l'errore e potrei darti +1 (e un gemito). :-) –

+6

Nessun voto da me perché non voglio confondere nessuno seriamente alla ricerca di queste informazioni, ma tu ottieni il mio uptote nello spirito. :) – Jeff

+2

-1 per essere intenzionalmente ingannevole –

2

Questo funziona anche: P

v=v?!v:!v; 
+0

Ama questo !!! Ma per mantenerlo nello spirito Java dovrebbe probabilmente essere v = (! V == false)? ! v:! v –

+0

Hahahahaha! È geniale. Troppo condensato per Java, però ... potrebbe davvero vincere un codice golf! :-P –

+1

Che dire: 'v =! V?! V:! V;' :) :) – OscarRyz

0
public boolean toggle(boolean bool) 
{ 
    return !bool; 
} 
+0

+1 per essere un buon sport e per farmi modificare. Scusa :-) –

+1

Non lo farò, ma l'idea di avere una funzione di aiuto per questo mi fa morire un po 'dentro. Sarebbe come avere una funzione 'public int plus (int a, int b) {return a + b};'. Basta aggiungere ridondanza. Potrebbe avere un merito se Java avesse pass-by-ref. –

17

Un'altra opzione è XOR:

myVar ^= true; 

E 'notevole che solo la LHS dell'incarico cambia mai; il lato destro è costante e attiva qualsiasi variabile booleana. L'IMO più auto-documentato della negazione, però.

+0

Dato un nome di variabile con lunghezza> 4, questo sarà anche il codice più breve che si possa trovare. –

+0

È anche più veloce di qualsiasi altra cosa (non che dovresti preoccuparti della velocità a questo livello). – ILMTitan

+0

puoi renderlo ancora più corto: 'myVar^= 1;' –

-1

Come altri hanno notato, ci sono due modi per negare qualcosa: "lvalue =! Lvalue;" e "lvalue^= 1;". È importante riconoscere le differenze.

Dire "lvalue =! Lvalue" farà sì che lvalue sia impostato su 1 se fosse zero e 0 se fosse impostato su altro. Il valore sarà valutato due volte; questo non è un fattore per variabili semplici, ma dire "someArray [index1] [index2] [index3] [index4] =! someArray [index1] [index2] [index3] [index4]" potrebbe rallentare le cose.

Dire "lvalue^= 1;" farà sì che lvalue sia impostato su 1 se fosse 0, 0 se fosse 1, e qualcos'altro se non fosse né zero né 1. L'lvalue deve essere specificato o valutato solo una volta e se il valore è noto come zero o 1, questa forma è probabile che sia più veloce.

Peccato che non ci sia un operatore di negazione automatica; ci sono momenti in cui una cosa del genere sarebbe utile.

+0

È una domanda Java. 1 non funzionerà. – EJP

-2

È inoltre possibile utilizzare la forma binaria di negazione come mostrato qui.

if ((v == true) && !(v = false)) { 
    v != true; /* negate with true if true. */ 
} else { 
    v =! false; /* negate with false if false. */ 
} 
+0

Magari potrei effettuare il downvote più volte. Posso solo pensare che questo non sia stato pubblicato in buona fede, è così sbagliato. Credo che per i principianti potrei dire che '! =' Non è un operatore di assegnazione, quindi 'v!= true; 'non cambierà v. –

+0

Concordato. È uno scherzo? – EJP

0

Recentemente (per conto proprio) ho trovato una risposta simile a quella già indicata qui. Tuttavia, il (nome della variabile non ripetibile con il codice almeno) più semplice e più breve risposta è:

formControl.disabled ^= 1; 

Questo funziona meglio in JavaScript quando si vuole passare boolean, attributi DOM basati (per esempio, un controllo di maschera/ingresso di proprietà disabilitata - passando da uno stato non modificabile a modifica). Dopo molte ricerche (senza alcun risultato che mi piacesse) e alcune prove ed errori, ho trovato la mia soluzione più semplice (tuttavia, invece di un 1 sarebbe più chiaro - come è stato precedentemente pubblicato).

Poiché questa sintassi non è molto chiara, immediatamente, non consiglierei di utilizzarla molto spesso (credo sia appropriato quando la variabile o la proprietà rendono ovvio il contesto). Ho postato questa risposta (invece di renderla un commento) perché il contesto in cui l'autoassegnazione bit a bit XOR dovrebbe essere usata è molto importante.Questo "trucco" dovrebbe essere evitato principalmente quando si considerano le migliori pratiche.