OVH Cloud OVH Cloud

Surcharge et priorité

39 réponses
Avatar
Etienne Rousee
Bonsoir,

J'écris une bibliothèque de polynômes et j'ai
quelques problèmes avec l'opérateur exposant (^).
J'ai écrit toutes les surcharges nécessaires et
ceci par, exemple, compile:
Polynome P = (X^3) - 6 * (X^2) + 9 * X - 4;
Par contre, ceci ne compile pas:
Polynome P = X^3 - 6 * X^2 + 9 * X - 4;
Par ailleurs X^2 - 1 compile et donne X.
Je n'ai donc pas la bonne priorité.

Y a-t-il moyen d'arranger ça ?

--

Etienne

10 réponses

1 2 3 4
Avatar
Jean-Marc Bourguet
"Etienne Rousee" writes:

Bonsoir,

J'écris une bibliothèque de polynômes et j'ai
quelques problèmes avec l'opérateur exposant (^).
J'ai écrit toutes les surcharges nécessaires et
ceci par, exemple, compile:
Polynome P = (X^3) - 6 * (X^2) + 9 * X - 4;
Par contre, ceci ne compile pas:
Polynome P = X^3 - 6 * X^2 + 9 * X - 4;
Par ailleurs X^2 - 1 compile et donne X.
Je n'ai donc pas la bonne priorité.

Y a-t-il moyen d'arranger ça ?


Non. Ni de changer la priorite, ni de faire en sorte que X ^ 2-1 ait
une interpretation differente de X^1.

Avant de regretter cet etat de chose, je voudrais signaler qu'il y a
eu au moins un langage ou on pouvait ajouter des operateurs infixes,
leur donner la priorite qu'on voulait et meme modifier la priorite des
operateurs existants: Algol 68. Le resultat de cette experience est
que c'est une tres mauvaise idee (au moins l'ajout de nouveaux
operateurs a n'importe quel priorite et surtout la modification de la
priorite des operateurs existants).

^ est l'operateur ou exclusif en C++ et en general utiliser les
operateurs pour quelque chose de tres different de ce qu'ils font sur
les types de base (utiliser ^ pour la difference symetrique d'ensemble
ne me gene absolument pas) est quelque chose a considerer avec
precaution. Le cas d'une bibliotheque de polynome est un des cas ou
ce serait a mon avis admissible sans grande contestation s'il n'y
avais mauvaise priorite qui tends a faire pencher la balance de
l'autre cote.

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
Etienne Rousee
"Jean-Marc Bourguet" a écrit ...
"Etienne Rousee" writes:

Bonsoir,

J'écris une bibliothèque de polynômes et j'ai
quelques problèmes avec l'opérateur exposant (^).
J'ai écrit toutes les surcharges nécessaires et
ceci par, exemple, compile:
Polynome P = (X^3) - 6 * (X^2) + 9 * X - 4;
Par contre, ceci ne compile pas:
Polynome P = X^3 - 6 * X^2 + 9 * X - 4;
Par ailleurs X^2 - 1 compile et donne X.
Je n'ai donc pas la bonne priorité.

Y a-t-il moyen d'arranger ça ?


Non. Ni de changer la priorite, ni de faire en
sorte que X ^ 2-1 ait une interpretation
differente de X^1.


Dommage.

Il n'y aurait pas un autre opérateur caché
que je pourrais détourner du droit chemin ?

Je ne suis sûrement pas le premier à écrire
une telle bibliothèque. Comment font les autres ?

--

Etienne


Avatar
Fabien LE LEZ
On 19 Dec 2005 08:50:45 +0100, Jean-Marc Bourguet :

Le cas d'une bibliotheque de polynome est un des cas ou
ce serait a mon avis admissible sans grande contestation


Voire... a^b signifie-t-il "a exposant b" ou "le PPCM de a et b" ?

Avatar
Cyrille


Dommage.

Il n'y aurait pas un autre opérateur caché
que je pourrais détourner du droit chemin ?


Il te faudrait, si j'ai bien compris, un opérateur binaire plus
prioritaire que +, -, *, /, mais moins que ().
D'après la table en bas de
http://www.cplusplus.com/doc/tutorial/operators.html
il n'y a que .* et ->* qui fassent l'affaire, mais ils font partie des
rares qui ne peuvent pas être surchargés. :)
Ceci dit, [] pourrait faire l'affaire...

Je ne suis sûrement pas le premier à écrire
une telle bibliothèque. Comment font les autres ?


Je ne sais pas ce que font les autres, mais on peut imaginer:
Polynome P = X[2] - 1
Polynome P = X_2 - 1 (avec X_N définit pour les N les plus courants)
Polynome P = X<2>::value - 1 avec des template mais ça devient cryptique.
Polynome P = pow(X, 2) - 1

--
Hopp Schweiz!
Forza Korea!
Go Togo!

Avatar
Etienne Rousee
"Fabien LE LEZ" a écrit ...
On 19 Dec 2005 08:50:45 +0100, Jean-Marc Bourguet :

Le cas d'une bibliotheque de polynome est un des cas ou
ce serait a mon avis admissible sans grande contestation


Voire... a^b signifie-t-il "a exposant b" ou "le PPCM de a et b" ?


En maths, on utilise a^b pour le pgcd et le même à l'envers
(un peu comme un v) pour le ppcm, mais ils sont là aussi
prioritaires par rapport à + et -, et même * et /.
Il est quand même plus courant en maths d'écrire pgcd(a,b)
et ppcm(a,b). C'est d'ailleurs la notation utilisée en lycée,
probablement parce que ^ est la puissance sur les
calculatrices.

--

Etienne


Avatar
Marc Boyer
Le 19-12-2005, Etienne Rousee a écrit :
"Fabien LE LEZ" a écrit ...
On 19 Dec 2005 08:50:45 +0100, Jean-Marc Bourguet :

Le cas d'une bibliotheque de polynome est un des cas ou
ce serait a mon avis admissible sans grande contestation


Voire... a^b signifie-t-il "a exposant b" ou "le PPCM de a et b" ?


En maths, on utilise a^b pour le pgcd et le même à l'envers
(un peu comme un v) pour le ppcm, mais ils sont là aussi
prioritaires par rapport à + et -, et même * et /.


C'est le type de notation qui dépend pas mal du contexte.
En algèbre de Boole, / c'est 'et', et '/' signifie 'ou'.
Dans le dioïde que je manipule actuellement, / c'est
min et /, c'est max.
Et par chance, dans le langage que j'utilise, on
peut définir ses propres opérateurs.

Il est quand même plus courant en maths d'écrire pgcd(a,b)
et ppcm(a,b). C'est d'ailleurs la notation utilisée en lycée,
probablement parce que ^ est la puissance sur les
calculatrices.


Et puis aussi parce que ^, c'est l'exposant en LaTeX,
et que je pense qu'une vaste majorité des mathématiciens
actuels écrivent leurs papiers en LaTeX.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain



Avatar
Fabien LE LEZ
On Mon, 19 Dec 2005 10:11:12 +0100, Cyrille :

Ceci dit, [] pourrait faire l'affaire...


Mieux vaut lui garder la signification d'origine, puisqu'un polynôme
est un tableau.

Avatar
Etienne Rousee
"Fabien LE LEZ" a écrit ...
On Mon, 19 Dec 2005 10:11:12 +0100, Cyrille :

Ceci dit, [] pourrait faire l'affaire...


Mieux vaut lui garder la signification d'origine, puisqu'un polynôme
est un tableau.



J'ai pris un deque de monomes, mais c'est vrai, il y a
la surcharge de l'opérateur [].
Bon, je crois que je vais garder ^ et mettre des
parenthèses un peu partout.
D'un autre côté, ces parenthèses ne sont nécessaires
ni dans le parser, ni dans l'affichage.

--

Etienne


Avatar
Fabien LE LEZ
On Mon, 19 Dec 2005 11:31:12 +0100, "Etienne Rousee"
:

Bon, je crois que je vais garder ^ et mettre des
parenthèses un peu partout.


... et si jamais tu oublies une parenthèse, tu auras un bug bien
pénible.

Avatar
Etienne Rousee
"Fabien LE LEZ" a écrit ...
On Mon, 19 Dec 2005 11:31:12 +0100, "Etienne Rousee"
:

Bon, je crois que je vais garder ^ et mettre des
parenthèses un peu partout.


... et si jamais tu oublies une parenthèse, tu auras un bug bien
pénible.

Ben oui, mais tu vois une autre solution ?

En plus, j'ai l'intention de le passer en template après.

--

Etienne


1 2 3 4