Je veux juste retourner un booléen basé sur ce qu'il est déjà. Si c'est vrai, faites-le faux. Si c'est faux, rendez-le vrai.
Voici mon extrait de code:
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
la source
la source
Vous avez clairement besoin d'un modèle d'usine!
:RÉ
la source
Si vous savez que les valeurs sont 0 ou 1, vous pouvez le faire
flipval ^= 1
.la source
^
est l' opérateur exclusif-or .0^1
est1
, et1^1
est0
. C'est la même chose que d'ajouter si vous ignorez le bit de retenue. Ou vous pouvez le considérer comme - si l'un des bits est 1, le résultat est l'inverse de l'autre bit. Ou vous pouvez penser que cela pose la question: ces deux éléments sont-ils différents?La solution la plus simple que j'ai trouvée:
la source
x = !x;
est non seulement plus court, mais aussi plus lisible.longVariableName ^= true;
est clairement plus court quelongVariableName = !longVariableName;
Et chaque programmeur doit connaître XOR.a ^= b
signifiea = a ^ b
, où^
signifie XOR. La notationa °= b
poura = a ° b
n'importe quel opérateur°
est très courante dans la syntaxe C / C ++ / C #.gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;
Bien sûr, la chose la plus propre à faire est de l'étendre à plusieurs lignes et d'utiliser des variables temporaires pour stocker les objets, mais ellegRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1
est beaucoup plus lisible, moins sujette aux erreurs et moins de caractères que le code d'origine .Juste pour information - si au lieu d'un entier, votre champ obligatoire est un seul bit dans un type plus grand, utilisez plutôt l'opérateur 'xor':
la source
Cela semble être un free-for-all ... Heh. Voici une autre variation, qui, je suppose, est plus dans la catégorie «intelligente» que quelque chose que je recommanderais pour le code de production:
Je suppose que ses avantages sont:
Et un inconvénient tout aussi évident est
Ceci est proche de la solution de @ korona utilisant?: Mais fait un (petit) pas plus loin.
la source
Juste parce que ma manière préférée de faire basculer un booléen n'est pas répertoriée ...
fonctionne aussi. :)
(oui
x = !x;
c'est plus clair et plus facile à lire)la source
La solution codegolf'ish serait plus comme:
la source
Je préfère la solution de John T, mais si vous voulez passer au code-golfy, votre déclaration se réduit logiquement à ceci:
la source
de même pour
la source
Il est clair que vous avez besoin d'une solution flexible capable de prendre en charge les types se faisant passer pour des booléens. Ce qui suit permet cela:
Vous pouvez ensuite le spécialiser pour différents types qui pourraient prétendre être booléens. Par exemple:
Un exemple d'utilisation de cette construction:
Non, je ne suis pas sérieux.
la source
Pour les entiers avec des valeurs de 0 et 1, vous pouvez essayer:
MWE en C:
la source
Juste parce que j'aime remettre en question le code. Je propose que vous puissiez également utiliser le ternaire en faisant quelque chose comme ceci:
Exemple:
la source