Хотя **
в Python есть такой оператор , мне было интересно, почему в Java и C ++ его тоже нет.
Это легко сделать для классов, которые вы определяете в C ++ с перегрузкой операторов (и я считаю, что это возможно и в Java), но когда речь идет о примитивных типах, таких как int, double и так далее, вам придется использовать библиотеку функция как Math.power
(и обычно приходится приводить оба к удвоению).
Итак, почему бы не определить такой оператор для примитивных типов?
^
оператора не совпадает с приоритетом возведения в степень. Рассмотрим выражениеa + b ^ c
. В математике сначала возводится возведение в степень (b ^ c
), затем результирующая степень прибавляется кa
. В C ++ сначала выполняется сложение (a + b
), затем выполняется^
операторc
. Таким образом, даже если вы реализовали^
оператор для обозначения возведения в степень, приоритет превзойдет всех.^
это XOR в C ++. Рекомендуется, чтобы перегруженный оператор не отличался от того, что делает примитивный тип данных, используя его.++
оператора или!
оператора и т.д. и др. означать экспонату. Но в любом случае вы не можете, потому что операторы, о которых вы говорите, принимают только один аргумент; возведение в степень требует двух аргументов.Ответы:
Вообще говоря, примитивные операторы в C (и в расширении C ++) предназначены для реализации простыми аппаратными средствами примерно в одной инструкции. Что-то вроде возведения в степень часто требует поддержки программного обеспечения; так что его там нет по умолчанию.
Также предоставляется стандартная библиотека языка в виде
std::pow
.Наконец, выполнение этого для целочисленных типов данных не имело бы большого смысла, потому что большинство даже небольших значений для возведения в степень выдувают диапазон, требуемый для int, то есть до 65 535. Конечно, вы можете сделать это для двойных и плавающих чисел, но не для целых чисел, но зачем делать язык несовместимым для редко используемой функции?
источник
DIV
выполняет как деление, так и модуль). Но у меня есть точка согласованности.div
или с FORTRAN.EQ.
); в зависимости от правил языкового пробела, может быть возможно иметь произвольное количество операторов, не требуя, чтобы они были зарезервированными словами.Этот вопрос отвечает за C ++: Страуструп, «Проектирование и развитие C ++» обсуждает этот вопрос в разделе 11.6.1, с. 247-250.
Были общие возражения против добавления нового оператора. Это добавило бы к уже слишком сложной таблице приоритетов. Члены рабочей группы думали, что это даст лишь незначительное удобство при наличии функции, и они хотели иногда иметь возможность заменять свои собственные функции.
Не было хорошего кандидата на оператора.
^
Исключительно-или, и вызывает^^
путаницу из-за отношений между&
и|
и&&
и||
.!
был неподходящим, так как была бы естественная тенденция писать!=
для возведения в степень существующей ценности, и это уже было принято. Лучшее из доступных, возможно, было*^
, которое, видимо, никому не понравилось.Страуструп считается
**
снова, но это уже имеет значение в C:a**p
этоa
-кратныйp
указует, а иchar ** c;
объявляетc
как указатель на указательchar
. Введение**
в качестве маркера значения «объявление указателя на указатель на», «время, на которое указывает следующая вещь» (если это указатель) или «возведение в степень» (если за ним следует число), вызывало проблемы с приоритетом.a/b**p
пришлось бы анализировать, какa/(b**p)
если бы p было числом, но(a/b) * *p
если бы p был указателем, то это должно быть решено в парсере.Другими словами, это было бы возможно, но это усложнило бы таблицу приоритетов и анализатор, и оба они уже слишком сложны.
Я не знаю историю о Java; все, что я мог сделать, это спекулировать. Что касается C, где он начинался, все операторы C легко переводились в ассемблерный код, частично для упрощения компилятора и частично для того, чтобы избежать сокрытия трудоемкой функциональности в простых операторах (тот факт, что
operator+()
и другие могут скрывать большие сложности и потери производительности, был одним из из ранних жалоб на C ++).источник
*^
. : Da**p
убийца. (Хаки, чтобы обойти эту проблему… Брр!)Я подозреваю, что это потому, что каждый оператор, который вы вводите, увеличивает сложность языка. Поэтому барьер для входа очень высок. Я использую возведение в степень очень, очень редко - и я более чем счастлив использовать вызов метода для этого.
источник
x**2
иx**3
не так уж редко. И было бы неплохо реализовать магическую реализацию Pow, о которой знает и оптимизирует компилятор для простых случаев.x * x
иx * x * x
не плохие заменители квадрата и куба.x*x
если х - это выражение. В лучшем случае код становится громоздким, а в худшем медленнее или даже неправильным. Поэтому вам нужно определить свои собственные функции Square и Cube. И даже тогда код будет более уродливым, чем использование ** в качестве оператора мощности.Разработчики языка Java и базовой библиотеки решили перенести большинство математических операций в класс Math . Смотрите Math.pow () .
Зачем? Гибкость для определения приоритетов производительности по сравнению с битовой точностью. Было бы противоречить остальной части языковой спецификации, чтобы сказать, что поведение встроенных математических операторов может варьироваться от платформы к платформе, в то время как класс Math специально заявляет, что поведение потенциально жертвует точностью для производительности, поэтому покупатель остерегается:
источник
Экспонирование было частью Фортрана с самого начала, потому что оно было нацелено прямо на научное программирование. Инженеры и физики часто используют его в симуляции, потому что отношения степенного закона распространены в физике.
Python также широко используется в научных вычислениях (например, NumPy и SciPy). Это, наряду с оператором возведения в степень, позволяет предположить, что оно было нацелено и на научное программирование.
C, Java и C # имеют корни в системном программировании. Возможно, это влияние не давало возведения в степень в группу поддерживаемых операторов.
Просто теория.
источник
В C определены только операторы для общих арифметических операций, доступных для ALU. Его основной целью было создание удобочитаемого интерфейса с кодом ассемблера.
C ++ не изменил никакого поведения оператора, потому что он хотел, чтобы вся кодовая база, написанная на C, была совместимой.
Java сделала то же самое, потому что не хотела запугивать существующих программистов на C ++.
источник
Хорошо, потому что каждый оператор, который имел бы смысл для власти, уже используется. ^ это XOR и ** определяет указатель на указатель. Так что вместо этого у них просто есть функция, которая делает то же самое. (например, Pow ())
источник
pow()
функция выполняет свои вычисления во время выполнения, если у вас нет компилятора, который может выполнять постоянное сворачиваниеpow()
, в чем я очень сомневаюсь. (Однако некоторые компиляторы дают вам возможность использовать встроенные функции процессора для выполнения вычислений.)*
- это лексический токен, используется ли он для косвенного или умножения.**
Значение экспоненцирование будет либо один или два лексические маркеры, и вы действительно не хотите , чтобы ваш лексический , чтобы попасть в таблицу символов разметить.На самом деле, арифметические операторы - это всего лишь ярлыки функций. (Почти) Все, что вы делаете с ними, может быть сделано с помощью функции. Пример:
Это просто более многословно, поэтому я не вижу ничего плохого в использовании функций для выполнения «силы».
источник
Сложение / вычитание / отрицание и умножение / деление являются основными математическими операторами. Если бы вы сделали власть оператором, где бы вы остановились? Оператор квадратного корня? N-корневой оператор? Логарифм оператора?
Я не могу говорить за их создателей, но я могу сказать, что я думаю, что стало бы громоздким и не ортогональным иметь такие операторы в языке. Количество не буквенно-цифровых символов / пробелов, оставшихся на клавиатуре, довольно ограничено. Странно, что в C ++ есть оператор модуля.
источник
mod
в качестве оператора странно. Обычно это одна инструкция. Это первичная операция над целыми числами. Это используется почти везде в компьютерной науке. (Реализация таких вещей, как ограниченные буферы безmod
запаха)