A maneira mais fácil de inverter um valor booleano?
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:
Você pode inverter um valor assim:
portanto, seu código seria reduzido para:
Não é apenas a maneira mais fácil, mas também a mais limpa.
— Sharptooth 4/03/09
os dois casos podem ser mesclados, pois fazem a mesma coisa.
É o padrão: break; realmente necessário? O interruptor não terminará o mesmo sem ele?
Padrão: break; é desnecessário.
Se você estiver alternando algo de longo prazo como object1-> system1.system2.system3.parameter1, pode ser útil ter uma macro TOGGLE (a). Isso evita alguns erros e torna tudo mais legível em telas estreitas.
Claramente, você precisa de um padrão de fábrica!
Provavelmente também poderíamos adicionar o padrão singleton para a fábrica.
@ Orm Porque você é um ORM ? :)
Observe a recomendação sutil de mudar para Java!
Bem ... acho que precisamos de outra versão principal do C ++ para esta, pode ser C ++ / 51
Ei pessoal! Eu acho que sua abordagem não é reentrada. Você precisa do atomic_bool, pelo menos, melhor um mutex ou uma fila de eventos. Além disso, precisamos de um padrão de observador para monitorar o estado de val.
— Marco Freudenberger
Se você souber que os valores são 0 ou 1, é possível flipval ^= 1.
Por que usar um operador bit a bit para uma operação lógica? Cheira a ofuscação desnecessária para mim.
— Mark Pim #
@ Mark: Desculpe. Acho que sou antiquado. Mas ajuda se sua expressão de valor L for realmente longa, para que você não precise repeti-la. Além disso, você pode dizer flipval ^ = TRUE. Isto é melhor?
@ Alnitak: Você está certo em algumas circunstâncias. Eu já vi algumas pessoas juntando bits para "economizar espaço" e agir como se as instruções para acessá-los não ocupassem espaço.
— Mike Dunlavey 6/03/09
@ Albert: ^é o operador exclusivo ou . 0^1é 1e 1^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?
@ MikeDunlavey se você estiver em um dispositivo com 4 M de Flash para espaço de código e 3 K de SRAM para espaço de dados, essa é uma maneira justificada de agir!
Solução mais fácil que encontrei:
x = !x;não é apenas mais curto, mas também mais legível.
Observe que, por exemplo, longVariableName ^= true;é claramente menor que longVariableName = !longVariableName;E todo programador deve conhecer o XOR.
— Xamid 5/10
a ^= bsignifica a = a ^ b, onde ^significa XOR. A notação a °= bpara a = a ° bqualquer operador °é muito comum entre a sintaxe C / C ++ / C #.
— Xamid 6/10
Anedótico, mas me deparei recentemente com a linha 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, mas gRackWidget->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 .
Além disso, menos duplicação significa menos chance de esquecer de atualizar AMBOS os lados da equação durante mudanças rápidas no desenvolvimento / longos dias / noites de codificação.
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':
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:
Não requer ramificação
E uma desvantagem tão óbvia é
Isso está próximo da solução da @ korona usando?: Mas deu um (pequeno) passo adiante.
Por ordem das operações, acho que você pode omitir os parênteses para ficar ainda mais conciso. : O
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)
A solução codegolf'ish seria mais como:
Prefiro a solução de John T.
Você não precisa verificar o wParam no VK_F11 e no VK_F12?
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.
Para números inteiros com valores de 0 e 1, você pode tentar:
MWE em C:
Só porque eu gosto de questionar o código. Proponho que você também possa fazer uso do ternário fazendo algo assim: