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 ^
.
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.
Pour deux raisons
Le symbole ^
est réservé pour xor bit à bit opération
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!
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;
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.