482 votes

Existe-t-il une meilleure façon d'écrire v = (v == 0 ? 1 : 0) ;

Je veux faire basculer une variable entre 0 et 1. Si elle est à 0, je veux la mettre à 1, sinon si elle est à 1, je veux la mettre à 0.

Il s'agit d'une opération tellement fondamentale que j'écris si souvent que j'aimerais étudier la manière la plus courte et la plus claire possible de la réaliser. Voici ce que j'ai trouvé de mieux jusqu'à présent :

v = (v == 0 ? 1 : 0);

Pouvez-vous améliorer ce point ?

Edit : la question porte sur la manière d'écrire l'énoncé ci-dessus en utilisant le moins de caractères possible tout en conservant la clarté - en quoi cela n'est-il pas une vraie question ? Il ne s'agissait pas d'un exercice de code-golf, même si des réponses intéressantes ont été données par des personnes qui l'ont abordé comme du golf - il est agréable de voir que le golf est utilisé de manière constructive et qu'il incite à la réflexion.

20 votes

Cela me semble déjà simple, clair et court.

144 votes

La tromperie : v = +!v;

48 votes

Si "meilleur" signifie aussi "plus rapide" : jsperf.com/v-0-1-0 .

755voto

Guffa Points 308133

Vous pouvez simplement utiliser :

v = 1 - v;

Cela suppose bien sûr que la variable soit initialisée correctement, c'est-à-dire qu'elle ne prenne que la valeur 0 ou 1.

Une autre méthode est plus courte mais utilise un opérateur moins courant :

v ^= 1;

Edita:

Pour être clair, je n'ai jamais abordé cette question comme un golf de code, mais simplement pour trouver un moyen court d'effectuer la tâche sans utiliser d'astuces obscures comme les effets secondaires des opérateurs.

214 votes

Ce sont de belles lignes de code, comme du verre finement taillé ou des orchidées à fleurs rares. J'aime la façon dont vous avez traversé la couche logique et traité directement les mathématiques de 1 et de 0 avec les opérations les plus optimales possibles. Je vais utiliser cela dans mes propres projets, mais malheureusement, lorsque j'aurai besoin que le code soit compris par mes collègues, je devrai me rabattre sur une approche plus logique. Je vous remercie cependant, votre réponse m'a permis de passer une bonne journée.

37 votes

Vous pouvez toujours ajouter un commentaire expliquant ce que fait le code.

2 votes

En plus d'obscurcir les intentions de la logique, vous avez introduit un bogue en modifiant la logique.

353voto

Quentin Points 325526

Desde 0 est un false valeur et 1 est un true valeur.

v = (v ? 0 : 1);

Si vous êtes heureux d'utiliser true y false au lieu de chiffres

v = !v;

ou s'il doit s'agir de chiffres :

v = +!v; /* Boolean invert v then cast back to a Number */

57 votes

Il suffit de mettre la magie + avant cela ! . Ohhh, ça a l'air tellement sale ! mais cool :p

1 votes

@Quentin - cela va briser le code du gars s'il a switch(v){ case 0 ... ou if(v == 0) ou if v === 0. Vous modifiez son résultat en plus de son approche....

34 votes

Faites-en un smiley : ({v :+! v}).v .

203voto

Prusse Points 3562

v = (v + 1) % 2 et si vous avez besoin de faire défiler plus de valeurs, il vous suffit de modifier 2 para (n + 1) . Supposons que vous ayez besoin de faire un cycle 0,1,2, il suffit de faire v = (v + 1) % 3 .

2 votes

J'adore le cycle ! C'est vraiment intelligent.

17 votes

+1 pour avoir pensé à la bascule comme à un cycle. C'est simple si l'on considère sa flexibilité.

3 votes

+1 pour la fourniture d'une solution modulaire et robuste. Dans la pratique, vous voudrez probablement utiliser un const à la place des nombres magiques 2, 3, ...

76voto

Daniel Points 1354

Vous pourriez écrire une fonction pour cela et l'utiliser comme suit :

v = inv(v)

31 votes

+1 Je suis tout à fait d'accord pour dire qu'il s'agit de la solution la plus propre (...mais alors qu'est-ce qui va dans le inv fonction :P)

4 votes

J'aimerais pouvoir donner à cette réponse plus que +1. Si le code commun n'est pas d'une évidence aveuglante, il devrait être enveloppé dans une fonction avec un nom descriptif.

11 votes

@TehShrike considérez-vous inv pour être un nom descriptif ?

51voto

Brian Points 2326

Si vous ne vous souciez d'aucune autre possibilité que la 1 :

v = v ? 0 : 1;

Dans le cas ci-dessus, v sera égal à 1 si v est 0, faux, indéfini ou nul. Soyez prudent en utilisant ce type d'approche - v sera 0 même si v est "hello world".

2 votes

Cela ne changera pas la valeur. Vous voulez dire v = v ? 0 : 1 .

3 votes

@Guffa - +1 pour avoir remarqué ma dyslexie...

3 votes

C'est la réponse logique que je préfère et que je peux utiliser avec mes collègues (je considère que la réponse de @Guffa est basée sur des chiffres). J'aime la façon dont vous avez supprimé le test inutile (v==0) et les parenthèses, en le réduisant au nombre minimum de caractères. Je vous remercie.

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