Question

Est a && b && c définie par la langue pour dire (a && b) && c ou a && (b && c)?

Wow, Jerry a été rapide.De boeuf à la question:est-il vraiment de l'importance?Y aurait-il une différence observable entre a && b && c être interprété comme (a && b) && c ou a && (b && c)?

Était-ce utile?

La solution

§5.14/1:"Le && opérateur de groupes de gauche à droite.[...] Contrairement &, && garanties de gauche à droite évaluation:le deuxième opérande n'est pas évalué si le premier opérande est faux."

Quand ou comment il questions:Je ne suis pas sûr qu'il fait vraiment de type intégré.Il est possible, cependant, de la surcharger de manière à rendre la matière.Par exemple:

#include <iostream>

class A;

class M {
    int x;
public:
    M(int x) : x(x) {}
    M &operator&&(M const &r); 
    M &operator&&(A const &r); 
    friend class A;
};

class A {
    int x;
    public:
    A(int x) : x(x) {}
    A &operator&&(M const &r); 
    A &operator&&(A const &r);
    operator int() { return x;}
    friend class M;
};

M & M::operator&&(M const &r) {
    x *= r.x;
    return *this;
}

M & M::operator&&(A const &r) {
    x *= r.x;
    return *this;
}

A &A::operator&&(M const &r) {
    x += r.x;
    return *this;
}

A &A::operator&&(A const &r) {
    x += r.x;
    return *this;
}

int main() {
    A a(2), b(3);
    M c(4);

    std::cout << ((a && b) && c) << "\n";
    std::cout << (a && (b && c)) << "\n";
}

Résultat:

9
16

Mise en garde:cela montre seulement comment il peut être faite à la matière.Je suis pas notamment en recommandant que tout le monde à le faire, en montrant que, si vous voulez assez mal, vous pouvez créer une situation dans laquelle il fait une différence.

Autres conseils

L' && et || les opérateurs de court-circuit:si l'opérande à gauche détermine le résultat de l'expression globale, l'opérande à droite ne sera pas évalué.

Par conséquent, un mathématicien décririons comme de gauche associative, par exemple
a && b && c(a && b) && c, parce que pour un mathématicien qui signifie a et b sont considérés en premier.À des fins pédagogiques, cependant, il pourrait être utile d'écrire a && (b && c) au lieu de cela, pour souligner que ni b ni c sera évalué si a est faux.

Les parenthèses dans C uniquement modifier l'ordre d'évaluation lorsqu'ils remplacent la priorité.Les deux a && (b && c)
et (a && b) && c seront évalués en a tout d'abord, puis b, puis c.De même, l'ordre d'évaluation des deux
a + (b + c) et (a + b) + c est indéterminé.Le contraste a + (b * c) rapport (a + b) * c, où le compilateur est toujours libre d'évaluer a, b, et c dans n'importe quel ordre, mais les parenthèses de déterminer si la multiplication ou l'addition arrive en premier.Aussi contraste FORTRAN, où, dans certains cas au moins entre parenthèses les expressions doivent être évaluées en premier.

En fait, il est très important que l'expression est calculée à partir de la gauche vers la droite.Ce est utilisé pour avoir court-circuit dans quelques expressions.Voici un cas où il n'est question:

vector<vector<int> > a;
if (!a.empty()  && !a[0].empty() && a[0].back() == 3) 

Je parie que vous écrivez des déclarations similaires de quelques fois par jour.Et si l'associativité n'a pas été définie, vous devriez être dans un immense embarras.

Si a && b est faux, alors le && c la partie n'est jamais testé.Donc, oui, il n'est question (à moins que vous avez besoin d'avoir vos opérations ordonnées de gauche à droite). && est associatif fonctionnement par nature.

Associativité

Dans une expression contenant deux ou plusieurs occurrences en ligne de le même opérateur associatif, l'ordre dans lequel les opérations sont effectué n'a pas d'importance tant que la séquence des opérandes est pas changé.C'est, en réorganisant les parenthèses dans une l'expression ne va pas changer sa valeur.

Donc, il n'a pas d'importance (logiquement) si vous écrivez a && (b && c) ou (a && b) && c.Les deux sont équivalents.Mais vous ne pouvez pas changer l'ordre des opérations d'e.g a && c && b n'est pas équivalent à a && b && c).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top