Почему унарный плюс не имеет абсолютного значения?

Я видел много вопросов о том, почему унарный плюс существует в конкретном языке, например:
Почему в F# есть унарный оператор плюс?
Какова цель унарного оператора plus в Java?
В чем смысл унарного оператора плюс в Ruby?
Использование унарного оператора plus

И все они говорят, что '+' предназначен только для перегрузки, если вам это нужно,
или для выполнения некоторых редких/ненужных задача, зависящая от языка.
Но почему она не используется на самом деле?

Было бы разумно (по крайней мере, для меня), что унарный «+» должен действовать как абсолютное значение, например:

int x = -5; //x is -5
x = +x;     //x is now 5

Есть ли какая-то конкретная причина, по которой это не было сделано?
или потому, что это имеет смысл только для меня?


person SmRndGuy    schedule 20.03.2013    source источник
comment
Ваше предложение математически неинтуитивно... и унарный плюс на самом деле что-то делает в некоторых языках. Например, в Java он может выполнять преобразование типов.   -  person assylias    schedule 21.03.2013
comment
Потому что у него другое значение, и примерно с 1957 года оно имело одно и то же значение во всех языках программирования. Слишком поздно придумывать блестящие идеи. Не конструктивно.   -  person user207421    schedule 21.03.2013


Ответы (1)


Это не реализовано таким образом, потому что математика так не работает.

В математике:

note: the following is math on a blackboard, not a programming language

+ -5 = -5

- -5 = 5

Любой другой способ запутает любого, кто когда-либо заканчивал среднюю школу.

Очевидно, что приведенное выше является довольно слабым ответом, поскольку вы действительно можете реализовать действие, выполняемое символом ASCII «+» в коде, чтобы оно работало иначе, чем математика. Например, в Лиспе оператор + работает не так, как обычная школьная математика:

;;; Adding two numbers:
+ 1 2

А на калькуляторах TI даже наоборот:

1 2 +

Вы можете возразить, что реализация + так, как вы описываете в вашем языке программирования, имеет смысл. Существует множество различных аргументов, почему этого делать не следует, в том числе принцип наименьшего удивления, язык должен моделировать проблемную область, это то, чему нас учили в школе и т. д. Все они по существу слабые аргументы, потому что они не не дают фундаментальной причины для того, чтобы машина относилась к + так же, как к математике.

Но вот в чем дело, люди эмоциональные существа. Нам нравится то, что знакомо, и настораживает то, что идет вразрез с тем, чему нас учили. И программисты не любят, когда + ведут себя иначе, чем обычно. А программисты — это те, кто создает языки программирования, поэтому вполне логично, что они реализуют + именно так, как они это делают.

Один программист или небольшая группа могут так не думать, и они могут создать язык программирования, реализующий + по-другому. Но им будет трудно убедить сообщество программистов в том, что они поступили правильно.

Так что не так уж важно, что все аргументы, которые можно привести против +, действующего как abs(), по существу слабы. Пока большинство считает, что это правильно, + будет вести себя так же, как обычная математика.

person slebetman    schedule 21.03.2013