4 votes

expressions booléennes, pourquoi seulement deux termes ?

Étant donné qu'il est possible d'écrire

a = b = c = 2;

Il serait également souhaitable qu'au lieu de

bool allTwo = a == 2 && b == 2 && c == 2;

pour écrire à la place

bool allTwo = a == b == c == 2;

Mais je ne peux pas car a == b évalue un booléen qui ne peut pas être comparé à un entier.

Y a-t-il une raison de conception du langage qui explique cette façon de procéder ?

1voto

Powerlord Points 43989

Sans tenir compte des valeurs de retour, il s'agit également de l'associativité des opérateurs .

Les opérateurs d'affectation sont associatifs à droite. Cela signifie que le côté droit d'un opérateur d'affectation est évalué en premier. C'est pourquoi vous pouvez faire a = b = c = 2 et leur attribuer à tous la valeur 2. Sinon, vous obtiendrez a ayant l'ancienne valeur de b y b ayant l'ancienne valeur de c .

La plupart des autres opérateurs sont associatifs à gauche, en particulier les opérateurs logiques de court-circuit ( && y || ). C'est-à-dire que a == b o a && b évalue a d'abord.

On pourrait dire que == pourrait être associatif à droite... sauf qu'en .NET il ne peut pas l'être, car pour les objets, a == b est (à moins qu'il ne soit surchargé) converti en a.Equals(b) (ou est-ce a.ReferenceEquals(b) ... Je ne m'en souviens pas).

-1voto

JAB Points 11053

Ce n'est pas une réponse directe à votre question, mais pourquoi pas :

bool allTwo = a & b & c == 2;

EDIT : Comme le dit Pete, cela ne fonctionnerait pas. Que diriez-vous de ceci ?

bool allEqual(params int[] inputs)
{
    int lastval = inputs[0];
    for (int i = 1; i < inputs.length; i++)
    {
        if (lastval != inputs[i])
            return false;

        lastval = inputs[i];
    }

    return true;
}

Déclarez-le une fois, utilisez-le quand vous voulez avec une liste d'entiers séparés par des virgules à comparer. (Il existe probablement une fonction encore plus simple, mais peu importe).

bool allTwo = a == b && b == c && c == 2; // prefer this format over a == 2 && b == 2 && c == 2, personally

par rapport à

bool allTwo = allEqual(a, b, c, 2);

Je n'ai pas grand-chose à dire sur votre question qui n'ait déjà été dit dans les réponses des autres.

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