Подтвердить что ты не робот

Почему у С++ нет оператора питания?

На многих языках есть оператор мощности; почему не С++? Например, Fortran и Python используют ** и обычно записываются (например, в LaTeX) с помощью ^.

4b9b3361

Ответ 1

У С++ есть оператор мощности, он написал pow(x, y).

Первоначально C был разработан с учетом системного программного обеспечения и не было необходимости в силовом операторе. (Но он побитовые операторы, такие как & и |, которые отсутствуют в партии других языков.) Было некоторое обсуждение добавления одного во время стандартизации С++, но окончательный консенсус был больше или меньше:

  • Это не могло быть ^, потому что приоритет был неправильным (и конечно, имея 2. ^ 8 == 256., но 2 ^ 8 == 10 не очень приятный).

  • Это не может быть **, потому что это нарушит существующие программ (которые могут иметь что-то вроде x**p, с x a int и p an int*).

  • Это может быть *^, потому что эта последовательность в настоящее время не законна в 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;