2010-09-10 6 views
7

He visto esto antes en el código, pero lo olvidé. Básicamente alterna una variable booleana. Si es verdad, se establecerá en falso y viceversa. Pero lamentablemente olvidé la sintaxis.truco de operación booleana

Es básicamente un chiste para esto:

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

Es algo así, pero no sé cómo se llama o la sintaxis correcta de la misma:

myVar = myVar : false ? true; 
+0

supongo que es un error tipográfico, el v extra? –

+1

si encuentra una de las respuestas es lo que estaba buscando, puede hacer clic en la marca de verificación "Aceptar" debajo del número. – OscarRyz

Respuesta

70

¿Qué tal

myVar = !myVar 

?

+1

esto es más simple IMO –

+1

Sí, este es un buen alternar, aunque realmente depende de lo que esté haciendo en su aplicación si quiere usar una sintaxis dada para algo como esto. Ya sabes, cuán cerca está conceptualmente de lo que estás haciendo en realidad. –

+3

+0: como esta respuesta solo ofrece una alternativa, no responde la pregunta en absoluto. – Guffa

27

myVar = myVar ? false : true; está utilizando el conditional operator.

Usted sólo puede hacer esto sin embargo

myVar = !myVar; 
+2

Usted tiene el: y? hacia atrás. Va 'condición? rama verdadera: rama falsa'. – Tesserex

+0

@Tesserex: fijo –

+0

Además, esto se conoce con frecuencia como "el operador ternario" debido a que es el único operador de 3 arios en la mayoría de los lenguajes de programación. – Ben

4

El código más pequeño que se me ocurre en este momento. No sé lo que se llama (si no tiene un nombre, como parece sugerir)

myVar = !myVar 
+1

Se llama a * negation *. Debería haber una lista de operadores aritméticos y lógicos en el manual en alguna parte. –

+1

Negación unaria? –

+0

¿Hay alguno más? –

5

Lo que está pensando es el operador condicional:

myVar = myVvar ? false : true; 

(Como se ve, mucha gente lo llama "el operador ternario", pero eso solo significa que es un operador con tres operandos. Como sucede, solo hay un operador con tres operandos en este idioma, pero aún no dice nada sobre lo que el operador Sí.)

Por supuesto, es más fácil de usar el operador de negación:

myVar = !myVar; 
0

Hay un operador ternario (wikipedia). Lo cual le permite escribir una declaración condensada if-else como en el segundo ejemplo.

en Java:

myVar = (myVar) ? true : false; 

También existe el operador NOT, que cambia una variable booleana. En java eso es! Creo que eso es lo que quieres.

myVar = !myVar; 
4

Lo que estamos hablando es el "ternaria" o "condicional" operador, lo que hace una sustitución en línea de acuerdo con una condición.

La sintaxis es la siguiente:

condition ? trueValue : falseValue 

lo general tirar paréntesis alrededor de mi condición, a veces alrededor de todo el operador condicional. Depende de cuánto estoy tratando de delinearlo de todo lo demás.

Así, por ejemplo, suponga que desea devolver el mayor de dos números:

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

Tenga en cuenta que puede ser sustituido en el medio de algo más.


Bien, ahora abordemos su pregunta real sobre alternar un tipo booleano.

myVar = (myVar) ? false : true; 

es cómo lo haría con el operador condicional. (Una vez más, no se requieren paréntesis, sólo los favorecen.)

pero hay una manera más sencilla de cambiar el booleano ... usando la lógica NOT ("!") Del operador:

myVar = !myVar; 

Keep es simple. :-)

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

-1 y un gemido por el error tipográfico (myVar vs MyVar) y por demasiado prolijo, +1 por el humor al final. Repara el error tipográfico y podría darte +1 (y un gemido). :-) –

+6

No voto en mi contra porque no quiero confundir a nadie que busque esta información en serio, pero mi espíritu favorito es mi aval. :) – Jeff

+2

-1 por ser intencionalmente engañoso –

2

Esto también funciona: P

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

¡Me encanta! Pero para mantenerlo en el espíritu de Java, probablemente debería ser v = (! V == false)? ! v:! v –

+0

¡Jajajaja! Eso es brillante. Demasiado condensado para Java, sin embargo, ¡eso podría ganar un código de golf! :-P –

+1

¿Qué pasa con: 'v =! V?! V:! V;' :) :) – OscarRyz

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

+1 por ser un buen deporte y dejarme editar. Lo siento :-) –

+1

No voy a menospreciar, pero la idea de tener una función auxiliar para esto me hace morir un poco por dentro. Sería como tener una función 'public int plus (int a, int b) {return a + b};'. Solo agregando redundancia. Podría ser útil si Java tuviera pass-by-ref. –

17

Otra opción es XOR:

myVar ^= true; 

Es notable que sólo la LHS de la asignación cambia nunca; el lado derecho es constante y alternará cualquier variable booleana. Sin embargo, la OMI más autoritaria de Negation.

+0

Dado un nombre de variable con longitud> 4, este también será el código más corto que pueda encontrar. –

+0

También es más rápido que cualquier otra cosa (no es que deba preocuparse por la velocidad en este nivel). – ILMTitan

+0

puede hacerlo aún más corto: 'myVar^= 1;' –

-1

Como han notado otros, hay dos formas de negar algo: "lvalue =! Lvalue;" y "lvalue^= 1;". Es importante reconocer las diferencias.

Diciendo "lvalue =! Lvalue" hará que lvalue se establezca en 1 si era cero, y 0 si se configuró en cualquier cosa. El lvalue se evaluará dos veces; este no es un factor para variables simples, pero decir "someArray [index1] [index2] [index3] [index4] =! someArray [index1] [index2] [index3] [index4]" podría ralentizar las cosas.

Diciendo "lvalue^= 1;" hará que lvalue se establezca en 1 si fuera 0, 0 si fuera 1 y en otra cosa si no fuera cero ni 1. El valor l solo necesita especificarse o evaluarse una vez, y si se sabe que el valor es cero o 1, es probable que esta forma sea más rápida.

Lástima que no hay un operador de auto-negate; hay momentos en que tal cosa sería útil.

+0

Es una pregunta de Java. 1 no funcionará – EJP

-2

También puede usar la forma binaria de negación como se muestra aquí.

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

Desearía poder rechazar esto varias veces. Solo puedo pensar que esto no fue publicado de buena fe, está muy mal. Supongo que para empezar, podría decir '! =' No es un operador de asignación, entonces 'v!= verdadero; 'no cambiará v. –

+0

De acuerdo. ¿Esto es una broma? – EJP

0

Recientemente (por mi cuenta) encontré una respuesta similar a la ya mencionada aquí. Sin embargo, el (nombre de la variable que no se repite con el código de menos) más simple y más corta respuesta es:

formControl.disabled ^= 1; 

Esto funciona mejor en JavaScript cuando se quiere cambiar booleano, atributos basados ​​en DOM (por ejemplo, un control de formulario/entrada de propiedad deshabilitada: pasar de un estado no editable a uno de edición). Después de mucha búsqueda (sin ningún resultado que me gustara) y un poco de prueba y error, encontré que mi solución era la más simple (sin embargo, la verdadera en lugar de 1 sería más clara, como se publicó anteriormente).

Como esta sintaxis no es muy clara, inmediatamente, no aconsejaría usarla muy a menudo (creo que es apropiado cuando la variable o propiedad hace que el contexto sea obvio). He publicado esta respuesta (en lugar de hacer un comentario) porque el contexto en el que se debe utilizar la autoasignación de bit XOR es muy importante.Este "truco" debería evitarse principalmente al considerar las mejores prácticas.