154 votes

Le moyen le plus simple de retourner une valeur booléenne ?

Je veux juste inverser un booléen en fonction de ce qu'il est déjà. Si c'est vrai, rendez-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;
}

419voto

John T Points 14067

Vous pouvez inverser une valeur comme suit :

myVal = !myVal;

donc votre code se résumerait à :

switch(wParam) {
    case VK_F11:
    flipVal = !flipVal;
    break;

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}

14 votes

C'est non seulement le moyen le plus simple, mais aussi le plus propre.

0 votes

Les deux cas peuvent être fusionnés car ils font la même chose.

0 votes

Dommage que plus de la moitié soit gaspillée :/

99voto

Drew Points 4332

Il est clair que vous avez besoin d'un modèle d'usine !

KeyFactory keyFactory = new KeyFactory();
KeyObj keyObj = keyFactory.getKeyObj(wParam);
keyObj.doStuff();

class VK_F11 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class VK_F12 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class KeyFactory {
   public KeyObj getKeyObj(int param) {
      switch(param) {
         case VK_F11:
            return new VK_F11();
         case VK_F12:
            return new VK_F12();
      }
      throw new KeyNotFoundException("Key " + param + " was not found!");
   }
}

:D

</sarcasm>

17 votes

Nous pourrions probablement ajouter le modèle singleton pour la fabrique aussi.

1 votes

@Orm Parce que vous êtes un ORM ? :)

7 votes

Notez la recommandation subtile de passer à Java !

46voto

Mike Dunlavey Points 25419

Si vous savez que les valeurs sont 0 ou 1, vous pourriez faire flipval ^= 1 .

2 votes

Pourquoi utiliser un opérateur binaire pour une opération logique ? Ça sent l'obscurcissement inutile pour moi.

6 votes

Désolé. Je suppose que je suis vieux jeu. Mais cela aide si votre expression de valeur L est vraiment longue, ainsi vous n'avez pas à la répéter. Aussi, vous pourriez dire flipval ^= TRUE. Est-ce mieux ?

0 votes

@Mark - voir mon message - car parfois vos valeurs logiques sont stockées en bits. Tout le monde ne veut pas gaspiller 8 bits (ou plus) juste pour un booléen.

17voto

Alnitak Points 143355

Pour information, si au lieu d'un nombre entier, votre champ obligatoire est un bit unique dans un type plus grand, utilisez l'opérateur "xor" :

int flags;

int flag_a = 0x01;
int flag_b = 0x02;
int flag_c = 0x04;

/* I want to flip 'flag_b' without touching 'flag_a' or 'flag_c' */
flags ^= flag_b;

/* I want to set 'flag_b' */
flags |= flag_b;

/* I want to clear (or 'reset') 'flag_b' */
flags &= ~flag_b;

/* I want to test 'flag_b' */
bool b_is_set = (flags & flag_b) != 0;

8voto

drby Points 1811

Aussi

if (otherVal == true)

est équivalent à

if(otherVal)

Comme l'a montré John T, vous n'en avez pas besoin ici. Je me suis juste dit que je devais le signaler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X