web-dev-qa-db-fra.com

Pourquoi C ++ n'a-t-il pas d'opérateur de puissance?

De nombreuses langues ont un opérateur de puissance; pourquoi pas C++? Par exemple, Fortran et Python utilise ** et est généralement écrit (dans LaTeX, par exemple) en utilisant ^.

25
user2015064

C++ a un opérateur de puissance — il est écrit pow(x, y).

À l'origine, C était conçu avec un logiciel système à l'esprit, et il n'y avait pas vraiment besoin d'un opérateur électrique. (Mais il a des opérateurs au niveau du bit, comme & Et |, Qui sont absents dans beaucoup d'autres langages.) Il a été question d'en ajouter un lors de la normalisation de C++, mais le consensus final était plus ou moins:

  • Cela ne pouvait pas être ^, Car la priorité était incorrecte (et bien sûr, avoir 2. ^ 8 == 256., Mais 2 ^ 8 == 10 N'est pas très agréable non plus).

  • Cela ne pouvait pas être **, Car cela casserait les programmes existants (qui pourraient avoir quelque chose comme x**p, Avec x an int et p an int*).

  • Il peut s'agir de *^, Car cette séquence n'est actuellement pas légale en C ou C++. Mais cela nécessiterait encore l'introduction d'un niveau de priorité supplémentaire.

  • C et C++ avaient déjà suffisamment de jetons spéciaux et de niveaux de priorité, et après des discussions avec la communauté numérique, il a été conclu qu'il n'y avait vraiment rien de mal avec pow(x, y).

C++ a donc laissé les choses telles qu'elles étaient, et cela ne semble pas avoir posé de problème.

46
James Kanze

Pour deux raisons

  1. Le symbole ^ est réservé pour xor bit à bit opération

  2. Vous pouvez utiliser std::pow pour obtenir la même fonctionnalité.

Ce qui est bien avec C++, c'est que vous pouvez surcharger le operator pour faire ce que vous voulez!

template< typename T >
T operator^( T x, T y ) {
    return std::pow( x, y );
}

Cependant tenez compte du fait que lorsque vous faites cela, d'autres personnes qui connaissent C++ et je ne sais pas (et je pense qu'il y en a pas mal) pourrait avoir des problèmes importants pour comprendre votre code!

9
Shai

Vous pourriez vous aider si vous le souhaitez

struct DoubleMock
{
    DoubleMock(double v){_v = v;}
    double _v;
};

double operator^(DoubleMock x, DoubleMock y)
{
    return pow(x._v,y._v);
}

double v = DoubleMock(2.0) ^ 2.0;
1
distantTransformer

Parce que c'est l'opérateur exclusif ou au niveau du bit.

Il existe cependant des fonctions appelées "pow" qui font ce que vous voulez.

1
Mats Petersson