На многих языках есть оператор мощности; почему не С++? Например, Fortran и Python используют **
и обычно записываются (например, в LaTeX) с помощью ^
.
Почему у С++ нет оператора питания?
Ответ 1
У С++ есть оператор мощности, он написал pow(x, y)
.
Первоначально C был разработан с учетом системного программного обеспечения и
не было необходимости в силовом операторе. (Но он
побитовые операторы, такие как &
и |
, которые отсутствуют в партии
других языков.) Было некоторое обсуждение добавления одного
во время стандартизации С++, но окончательный консенсус был больше
или меньше:
-
Это не могло быть
^
, потому что приоритет был неправильным (и конечно, имея2. ^ 8 == 256.
, но2 ^ 8 == 10
не очень приятный). -
Это не может быть
**
, потому что это нарушит существующие программ (которые могут иметь что-то вродеx**p
, сx
aint
иp
anint*
). -
Это может быть
*^
, потому что эта последовательность в настоящее время не законна в C или С++. Но это все равно потребует введения дополнительный уровень приоритета. -
C и С++ уже имели достаточно специальных токенов и уровней приоритет, и после обсуждений с сообществом численностей, был сделан вывод о том, что в действительности не было ничего плохого с
pow(x, y)
.
Итак, С++ оставил вещи такими, какие они есть, и это, похоже, не имеет вызвало любые проблемы.
Ответ 2
По двум причинам
-
Символ
^
зарезервирован для бит-бит xor операция -
Вы можете использовать
std::pow
для достижения той же функциональности.
Хорошая вещь о С++ заключается в том, что вы можете перегружать operator
, чтобы делать все, что вам нравится!
template< typename T >
T operator^( T x, T y ) {
return std::pow( x, y );
}
Однако учтите, что когда вы это делаете, другие люди, которые знают C++
и не знают вас (и я считаю, что их довольно много) могут иметь значительные проблемы с пониманием вашего кода!
Ответ 3
Потому что это эксклюзивный или побитовый оператор.
Есть функции, называемые "pow", которые делают то, что вы хотите.
Ответ 4
Вы можете помочь себе, если хотите
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;