2010-09-10 12 views
7

Ich habe das vorher im Code gesehen, aber es vergessen. Im Grunde schaltet es eine boolesche Variable um. Wenn es wahr ist, wird es auf falsch gesetzt und umgekehrt. Habe aber leider die Syntax vergessen.Boolesche Operation Trick

Es ist im Grunde ein Motto für diese:

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

Es ist so etwas, aber nicht wissen, was es heißt oder die korrekte Syntax davon:

myVar = myVar : false ? true; 
+0

ich nehme an, das ist ein Tippfehler, der extra v? –

+1

Wenn Sie eine der Antworten finden, wonach Sie gesucht haben, können Sie auf das Häkchen "Akzeptieren" unter der Nummer klicken. – OscarRyz

Antwort

70

Wie wäre es

myVar = !myVar 

?

+1

das ist einfacher IMO –

+1

Ja, das ist ein guter Toggle - obwohl es wirklich darauf ankommt, was Sie in Ihrer App tun, ob Sie eine bestimmte Syntax für so etwas verwenden möchten. Sie wissen - wie konzeptionell nah ist es zu dem, was Sie tatsächlich tun. –

+3

+0: Weil diese Antwort nur eine Alternative bietet, beantwortet sie die Frage überhaupt nicht. – Guffa

27

myVar = myVar ? false : true; verwendet die conditional operator.

Sie können dies nur tun, wenn

myVar = !myVar; 
+2

Sie haben die: und? rückwärts. Es geht 'Bedingung? Wahrer Zweig: falscher Zweig. – Tesserex

+0

@Tesserrex: behoben –

+0

Dies wird häufig auch als "ternärer Operator" bezeichnet, da es in den meisten Programmiersprachen der einzige 3-Stellen-Operator ist. – Ben

4

Der kleinste Code, den ich von im Moment denken. Ich weiß nicht, was sein genannt

myVar = !myVar 
+1

Es wird eine * Negation * genannt. Es sollte irgendwo im Handbuch eine Liste von arithmetischen und logischen Operatoren geben. –

+1

Unäre Negation? –

+0

Gibt es noch andere? –

5

(wenn es einen Namen hat, wie Sie vorschlagen scheinen) Was denken Sie über die bedingte Operator:

myVar = myVvar ? false : true; 

(Wie Sie sehen, viele Leute nennen das den "ternären Operator", aber das bedeutet nur, dass es sich um einen Operator mit drei Operanden handelt, da es in dieser Sprache nur einen Operator mit drei Operanden gibt, der aber noch nichts über den Operator aussagt tut.)

Es ist natürlich einfacher, den Negationsoperator zu verwenden:

myVar = !myVar; 
0

Es gibt einen ternären Operator (wikipedia). Damit können Sie wie im zweiten Beispiel eine verdichtete if-else-Anweisung schreiben.

in Java:

myVar = (myVar) ? true : false; 

Es ist auch der NOT-Operator, der eine boolean Variable schaltet. In Java ist das! Ich glaube das ist was du willst.

myVar = !myVar; 
4

Worüber Sie sprechen, ist der "ternäre" oder "bedingte" Operator, der eine Inline-Substitution gemäß einer Bedingung ausführt.

Die Syntax ist:

condition ? trueValue : falseValue 

ich in der Regel werfen Klammern um meinen Zustand, manchmal um den gesamten Bedingungsoperator. Hängt davon ab, wie sehr ich versuche, es von allem anderen abzugrenzen.

So zum Beispiel an, dass Sie die größere von zwei Zahlen zurückkehren wollen:

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

Beachten Sie, dass es in der Mitte etwas anderes ersetzt werden kann.


Okay, jetzt wollen wir Ihre eigentliche Frage über das Umschalten eines booleschen Typs angehen.

myVar = (myVar) ? false : true; 

ist, wie Sie es mit dem bedingten Operator tun würden. (Wieder Klammern sind nicht erforderlich, bin ich für sie nur.)

Aber es gibt einen einfacheren Weg, um die boolean zu wechseln ... die logische NOT ("!") Operator:

myVar = !myVar; 

Halten es ist einfach. Dies funktioniert :-)

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

-1 und ein Stöhnen für den Tippfehler (myVar vs MyVar) und für zu ausführlich, +1 für den Humor am Ende. Repariere den Tippfehler und ich gebe dir +1 (und ein Stöhnen). :-) –

+6

Keine Verbesserung von mir, weil ich niemanden ernsthaft nach dieser Information fragen will, aber du bekommst meinen Aufschlag im Geiste. :) – Jeff

+2

-1 für absichtlich irreführend –

2

auch: P

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

Liebe diesen !!! Aber um es im Java-Geist zu halten, sollte es wahrscheinlich v = (! V == falsch) sein? ! v:! v –

+0

Hahahahaha! Das ist hervorragend. Zu kompakt für Java, das könnte einen Code-Golf gewinnen! :-P –

+1

Was ist mit: 'v =! V?! V:! V;' :) :) – OscarRyz

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

+1 für einen guten Sport und lassen Sie mich bearbeiten. Sorry :-) –

+1

Ich werde nicht ablehnen, aber die Idee, eine Hilfsfunktion dafür zu haben, lässt mich ein wenig innerlich sterben. Es wäre wie eine Funktion 'public int plus (int a, int b) {return a + b};'. Einfach Redundanz hinzufügen. Es könnte einen Vorteil haben, wenn Java Pass-by-Ref hatte. –

17

Eine weitere Option ist XOR:

myVar ^= true; 

Es ist bemerkenswert, dass nur die linke Seite von der Zuordnung immer ändert; Die rechte Seite ist konstant und schaltet jede boolesche Variable um. Negation ist jedoch mehr selbstdokumentierende IMO.

+0

Bei einem Variablennamen mit einer Länge> 4 ist dies auch der kürzeste Code, den Sie finden können. –

+0

Es ist auch schneller als alles andere (nicht, dass Sie über die Geschwindigkeit auf diesem Niveau besorgt sein sollten). – ILMTitan

+0

Sie können es noch kürzer machen: 'myVar^= 1;' –

-1

Wie andere bemerkt haben, gibt es zwei Möglichkeiten, etwas zu negieren: "lvalue =! Lvalue;" und "lvalue^= 1;". Es ist wichtig, die Unterschiede zu erkennen.

Wenn "lvalue =! Lvalue" angegeben wird, wird lvalue auf 1 gesetzt, wenn es 0 war, und 0, wenn es auf gesetzt wurde, sonst noch. Der Lvalue wird zweimal ausgewertet; Dies ist kein Faktor für einfache Variablen, aber "someArray [index1] [index2] [index3] [index4] =! someArray [index1] [index2] [index3] [index4]" könnte die Dinge verlangsamen.

Sagen "Lvalue^= 1;" Lvalue wird auf 1 gesetzt, wenn es 0 war, 0, wenn es 1 war, und etwas anderes, wenn es weder Null noch 1 war. Der Lvalue muss nur einmal spezifiziert oder ausgewertet werden, und wenn der Wert als Null bekannt ist oder 1, diese Form ist wahrscheinlich schneller.

Schade, es gibt keinen Auto-negate-Operator; Es gibt Zeiten, in denen so etwas praktisch wäre.

+0

Es ist eine Java-Frage. 1 wird nicht funktionieren. – EJP

-2

Sie können auch die binäre Form der Negation wie hier gezeigt verwenden.

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

Ich wünschte, ich könnte dies mehrmals ablehnen. Ich kann nur denken, dass dies nicht in gutem Glauben gepostet wurde, es ist so falsch. Ich denke, für Anfänger könnte ich sagen, '! =' Ist kein Zuweisungsoperator, also 'v!= wahr; 'ändert sich nicht v. –

+0

Einverstanden. Ist das ein Witz? – EJP

0

Ich habe kürzlich (auf eigene Faust) eine ähnliche Antwort auf eine bereits hier angegeben gefunden. Allerdings ist die einfachste und kürzeste (nicht wiederholenden Variablennamen mit mindestens Code) Antwort lautet:

formControl.disabled ^= 1; 

Das beste in JavaScript funktioniert, wenn boolean umschalten wollen, DOM-basierte Attribute (zum Beispiel ein Formular Steuerung/Eingang des Behinderte Eigenschaft - von einem nicht bearbeitbaren in den Bearbeitungszustand wechselnd. Nach vielem Suchen (ohne Ergebnis, das mir gefiel) und etwas Versuch und Irrtum fand ich meine Lösung am einfachsten (wahr, anstelle von 1 wäre klarer - wie zuvor gepostet).

Da diese Syntax nicht sehr klar ist, würde ich sofort davon abraten, es sehr oft zu verwenden (ich glaube, es ist angemessen, wenn die Variable oder Eigenschaft den Kontext offensichtlich macht). Ich habe diese Antwort gepostet (anstatt sie zu kommentieren), weil der Kontext, in dem die XOR bitweise Selbstzuweisung verwendet werden sollte, sehr wichtig ist.Dieser "Trick" sollte meist vermieden werden, wenn Best Practices berücksichtigt werden.