Eu só quero virar um booleano com base no que já é. Se é verdade - faça-o falso. Se for falso, faça-o verdadeiro.
Aqui está o meu trecho de código:
switch(wParam) {
case VK_F11:
if (flipVal == true) {
flipVal = false;
} else {
flipVal = true;
}
break;
case VK_F12:
if (otherVal == true) {
otherValVal = false;
} else {
otherVal = true;
}
break;
default:
break;
}
c++
c
boolean
boolean-logic
John T
fonte
fonte
Claramente, você precisa de um padrão de fábrica!
: D
fonte
Se você souber que os valores são 0 ou 1, é possível
flipval ^= 1
.fonte
^
é o operador exclusivo ou .0^1
é1
e1^1
é0
. É o mesmo que adicionar se você ignorar o bit de transporte. Ou você pode pensar nisso como - se um dos bits é 1, o resultado é o inverso do outro. Ou você pode pensar nisso como a pergunta: esses dois bits são diferentes?Solução mais fácil que encontrei:
fonte
x = !x;
não é apenas mais curto, mas também mais legível.longVariableName ^= true;
é claramente menor quelongVariableName = !longVariableName;
E todo programador deve conhecer o XOR.a ^= b
significaa = a ^ b
, onde^
significa XOR. A notaçãoa °= b
paraa = a ° b
qualquer operador°
é muito comum entre a sintaxe C / C ++ / C #.gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;
Naturalmente, a coisa mais limpa a fazer é expandi-la para várias linhas e usar variáveis temporárias para armazenar os objetos, masgRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1
é muito mais legível, menos suscetível a erros e menos caracteres do que o código original .Apenas para informação - se, em vez de um número inteiro, o campo necessário for um bit único em um tipo maior, use o operador 'xor':
fonte
Isso parece ser de graça para todos ... Heh. Aqui está outra variação, que eu acho que é mais na categoria "inteligente" do que algo que eu recomendaria para o código de produção:
Eu acho que as vantagens são:
E uma desvantagem tão óbvia é
Isso está próximo da solução da @ korona usando?: Mas deu um (pequeno) passo adiante.
fonte
Só porque minha maneira ímpar favorita de alternar um bool não está listada ...
funciona também :)
(sim,
x = !x;
é mais claro e fácil de ler)fonte
A solução codegolf'ish seria mais como:
fonte
Prefiro a solução de John T.
fonte
o mesmo vale para
fonte
Claramente, você precisa de uma solução flexível que suporte tipos disfarçados de booleanos. O seguinte permite isso:
Você pode especializar isso para diferentes tipos que podem fingir ser booleanos. Por exemplo:
Um exemplo de uso dessa construção:
Não, não estou falando sério.
fonte
Para números inteiros com valores de 0 e 1, você pode tentar:
MWE em C:
fonte
Só porque eu gosto de questionar o código. Proponho que você também possa fazer uso do ternário fazendo algo assim:
Exemplo:
fonte