Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Opérateur virgule

4 réponses
Avatar
Christophe DUVERGER
Bonjour,

Le document n1905 dit concernant l'op=E9rateur virgule au =A75.18: "All
side effects (1.9) of the left expression, except for the destruction
of temporaries (12.2), are performed before the evaluation of the
right expression.".
Pourtant je constate le contraire avec g++ 4.5.2 avec le code suivant:

class A {
public:
int val;
A(const int& n) : val(n) {}
};
class B {
};
A operator , (A a, int* const n) {
*n =3D a.val;
std::cout << "n =3D " << *n << std::endl;
return a;
}
A operator , (A a, A b) {
std::cout << "(b % " << a.val << "), (b % " << b.val << ")" <<
std::endl;
return b;
}
A operator % (B b, int n) {
std::cout << "b % " << n << std::endl;
return A(n);
}

int main() {
B b;
int n =3D 1;

(b % n, b % 2, &n, b % n);
return 0;
}

qui donne le r=E9sultat:
b % 1
b % 2
b % 1
(b % 1), (b % 2)
n =3D 2
(b % 2), (b % 1)

C'est =E0 dire que l'expression la plus =E0 droite a =E9t=E9 =E9valu=E9e av=
ant
l'affectation de n juste =E0 gauche, contrairement =E0 la n1905.

Ai-je mal compris ou mal cod=E9 ?

Merci de votre aide.

4 réponses

Avatar
Jean-Marc Bourguet
Christophe DUVERGER writes:

Bonjour,

Le document n1905 dit concernant l'opérateur virgule au §5.18: "All
side effects (1.9) of the left expression, except for the destruction
of temporaries (12.2), are performed before the evaluation of the
right expression.".



Ce paragraphe s'applique à la version définie par le langage, pas à ceux
que tu définis toi-même; c'est le cas aussi pour && et || et c'est une
raison pour lesquelles il faut réfléchir à plusieurs fois avant d'utiliser
la possibilité de surcharge.

A+

--
Jean-Marc
FAQ de fclc++: http://web.archive.org/web/*/http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Christophe DUVERGER
Ce paragraphe s'applique la version d finie par le langage, pas ceux
que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une
raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser
la possibilit de surcharge.



Toujours dans le document n1905, on peut lire au §13.5 - 6 : "It is
not possible to change the precedence, grouping, or number of operands
of operators.".
Donc normalement, le comportement associatif de l'opérateur virgule
devrait être conservé.

Christophe
Avatar
Jean-Marc Bourguet
Christophe DUVERGER writes:

Ce paragraphe s'applique la version d finie par le langage, pas ceux
que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une
raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser
la possibilit de surcharge.



Toujours dans le document n1905, on peut lire au §13.5 - 6 : "It is
not possible to change the precedence, grouping, or number of operands
of operators.".
Donc normalement, le comportement associatif de l'opérateur virgule
devrait être conservé.



Ca ne parle pas de la presence ou non de points de sequencement. Les
operateurs definis par l'utilisateur sont des fonctions comme les autres
pour tout ce qui est semantique (ok, -> a un comportement particulier)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Christophe DUVERGER
Ca ne parle pas de la presence ou non de points de sequencement. Les
operateurs definis par l'utilisateur sont des fonctions comme les autres
pour tout ce qui est semantique (ok, -> a un comportement particulier)



Effectivement, §1.9 note 14: 14) "When one of these operators is
overloaded (clause 13) in a valid context, thus designating a user-
defined operator function, the expression designates a function
invocation, and the operands form an argument list, without an implied
sequence point between them."
Et §8.3.6 - 9: "The order of evaluation of function arguments is
unspecified."

Merci

Christophe