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 .
3 votes
@pimvdb : Intéressant, mais je pense que vous devriez tester avec l'affectation également, car
v ^= 1;
ne se comporte pas de la même manière quev = v ^ 1;
: jsperf.com/v-1-v7 votes
@Mobinga : +1. C'est aussi simple que possible. Toutes les autres réponses que je vois sont confuses, et certaines d'entre elles changent la logique ; introduisant des bugs.
0 votes
@Guffa : comment cela ? Je ne vois pas
v = v ^ 1
sur la page à laquelle vous avez renvoyé.0 votes
@LarsH : Personne n'a suggéré d'utiliser
v = v ^ 1;
mais le test de pimvdb:s a évalué l'expressionv ^ 1
ce qui équivaudrait à testerv = v ^ 1;
au lieu dev ^= 1;
. Le résultat est le même, mais les performances ne sont pas exactement les mêmes.3 votes
Pourquoi ne pas utiliser
if(v == 0) { v = 1; } else { v = 0; }
? Je doute qu'il y ait une différence de vitesse et c'est beaucoup plus facile à lire si vous ne connaissez pas le code. Si c'est plus facile à lire et à comprendre et qu'il n'y a pas de réelle différence de performance, alors c'est mieux.5 votes
Je dois admettre que cette question est étrangement intéressante, même si elle semble si simple...
1 votes
Votre voie est la plus claire, il n'y a donc aucune raison de la changer. Elle est également robuste, car la valeur résultante de
v
est garanti dans l'intervalle souhaité, quelle que soit la valeur qu'il avait auparavant. Cette robustesse est même parfaitement évidente.0 votes
@Guffa : Je crois que je vous ai mal compris. Quand vous dites qu'ils ne se "comportent" pas de la même manière, je pensais que vous vouliez dire que le résultat était différent, mais je suppose que vous parlez uniquement des différences de vitesse.
0 votes
Je suis également un fanatique de la performance, mais pour moi personnellement, aucun gain de performance (surtout lorsqu'il est aussi faible) ne vaut la peine de sacrifier la lisibilité du code. C'est pourquoi je dois voter pour cette solution.
0 votes
@holodoc : Voter pour quelle solution ?
0 votes
@Guffa J'ai voté pour la solution de l'OP (
v = (v == 0 ? 1 : 0);
) parce qu'elle montre clairement la logique qui sous-tend cette ligne de code. Je ne dis pas que les autres solutions sont mauvaises, mais d'après mon expérience personnelle, il est toujours préférable de s'en tenir à la logique qui sous-tend le code, en particulier lorsque l'on travaille avec d'autres personnes ou s'il est possible que le code soit modifié à plusieurs reprises par d'autres personnes à l'avenir.0 votes
@holodoc : Non, vous avez voté pour la question. Les votes pour les questions ne sont pas comparés aux votes pour les réponses, mais aux votes pour d'autres questions.
0 votes
@Guffa Je ne comprends pas où est le problème ? J'ai voté pour la solution de l'OP à l'intérieur de sa question parce qu'il / elle a demandé s'il y avait une meilleure façon que celle qu'il / elle utilise / a fourni.
0 votes
@holodoc : Ce n'est pas grave, mais ce n'est tout simplement pas ainsi que le site fonctionne. Vous pouvez bien sûr voter pour la question, mais cela ne fonctionnera pas comme un vote pour une réponse.
0 votes
@Guffa Je n'ai pas voté pour le post de l'OP afin de le qualifier comme une réponse acceptée, je voulais juste lui montrer que sa solution originale était la meilleure à mon avis.
2 votes
@holodoc : Vous pouvez utiliser n'importe quelle raison, mais le vote comptera simplement comme un vote pour une bonne question.
0 votes
@Guffa Que dois-je faire exactement pour qu'il soit absolument clair que je ne me soucie pas de la façon dont mon vote est utilisé, à part le fait que cela permet à l'OP de savoir que sa façon de faire est la meilleure à mon avis ? Je ne sais pas si vous êtes d'accord avec moi, mais je ne suis pas d'accord avec vous.
0 votes
@holdoc : J'essaie de vous faire comprendre que votre vote ne sera pas interprété de cette façon, mais vous pouvez continuer à le penser si vous le souhaitez.
0 votes
Est-ce que je détecte un soupçon de perfectionnisme ? ;)
8 votes
@holodoc Une meilleure solution pour exprimer votre opinion serait de créer une réponse disant que vous pensez que l'original est la meilleure solution, et de développer pourquoi vous pensez que c'est le cas. Cela permet également aux autres personnes de se ranger facilement du côté de votre réponse en la votant.
0 votes
@Chuck van der Linded Je n'aime pas la redondance. Tout ce que j'avais à dire a été dit dans mes commentaires sur le post original.
0 votes
Quoi que vous utilisiez, faites-en une macro afin de ne pas répéter les mêmes choses partout - oh, si vous utilisiez le langage C, je veux dire. Faites-en une fonction :)
0 votes
Cette question semble être hors sujet car il s'agit d'une question de code golf.
2 votes
Votre question a donné lieu à l'une des plus grandes machines de Rube Goldberg de tout le stackoverflow.
0 votes
Il se peut que vous ne souhaitiez pas faire preuve de fantaisie. Parce que vous voulez que ce soit lisible.