31 votes

Existe-t-il un moyen de forcer Java à tester deux conditions sans tenir compte de la première ?

Disons que j'ai une déclaration

if(stack.pop() == 1 && stack.pop() == 1)

si le haut de la pile est égal à 0, alors la deuxième condition ne sera pas mise en œuvre, ce qui signifie qu'une seule valeur sera extraite du haut de la pile. Ce que je veux, c'est que les deux valeurs soient extraites, celle du haut et celle qui suit le haut. Existe-t-il un moyen de le faire sans utiliser une autre instruction if-else ?

101voto

JB Nizet Points 250258
int first = stack.pop();
int second = stack.pop();
if (first == 1 && second == 1)

45voto

davidbuzatto Points 5148

Utilisez le bitwise AND operator ** :

if( stack.pop() == 1 & stack.pop() == 1 )

Cela forcera l'évaluation des deux parties.

** Je le connais par "non court-circuitage" du ET logique, mais il s'agit bien d'un opérateur bitwise qui agit sur des opérandes booléens (documentation ici ).

Mise à jour : Comme le dit JBNizet dans son commentaire ci-dessous, ce code est "fragile", car un développeur peut "corriger" l'opérateur à la version court-circuit. Si vous choisissez d'utiliser & au lieu de stocker les valeurs des appels de méthode (en les forçant à s'exécuter) comme le répond JBNizet, vous devriez écrire un commentaire avant votre instruction if.

4voto

blgt Points 3325

Encore une autre façon de faire en une ligne et légèrement obscurcie :

if( stack.pop() == 1 ? stack.pop() == 1 : stack.pop() == 1 && false )

Personnellement, j'opterais pour la méthode de JB Nizet. Elle rend aussi clair que possible ce que vous essayez de faire.

0voto

Zaheer Ahmed Points 12945

Le plus simple, j'ai trouvé est (si la pile ne contient que 0 et 1) :

if(stack.pop() + stack.pop() == 2)

ou la solution de JB à une variable :

int first = stack.pop();
if (stack.pop() == 1 && first == 1)

-1voto

La-comadreja Points 3057

Voici une approche qui permet de contourner l'exception EmptyStackException déclenchée lorsque la pile comporte moins de deux éléments.

if (stack.size() > 0) {
    int first = stack.pop();
    if (stack.size() > 0) {
        if (first == 1 && stack.pop() == 1) ; //do something here
    }
}

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