тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
В математике запись башни степеней a^b^c общепринято означает, что возведение в степень производится справа налево, т.е., a^(b^c)
В некоторых языках программирования для возведения в степень отведена не функция типа pow(x,y), а отдельный оператор, напр., x^y или x**y (в Си, паскале и джаве, например, такого оператора нет)
И как же в таких языках производится вычисление выражения типа a^b^c ?
Мне было не лень, я потыкал в несколько языков на ideone, посмотрел что там получается:
читать дальше
конечно, я перепробовал не все языки, можно нарыть ещё примеры, и прошу вас дополнить этот список
жутко интересно, существуют ли ещё "неправильные" языки, кроме микрософторождённых?
В некоторых языках программирования для возведения в степень отведена не функция типа pow(x,y), а отдельный оператор, напр., x^y или x**y (в Си, паскале и джаве, например, такого оператора нет)
И как же в таких языках производится вычисление выражения типа a^b^c ?
Мне было не лень, я потыкал в несколько языков на ideone, посмотрел что там получается:
читать дальше
конечно, я перепробовал не все языки, можно нарыть ещё примеры, и прошу вас дополнить этот список
жутко интересно, существуют ли ещё "неправильные" языки, кроме микрософторождённых?
Добавлю из того, что нашёл у себя на машине.
## Syntax error
C++11
PHP (5.5-)
Js/Node
Erlang
Forth
Pascal
MySQL
## К правильным в копилку
bash:
php (5.6+):
Forth (:
## К неправильным в копилку
Внезапно, MathLab:
Basic:
А вообще, есть же статья на rosettacode про этот оператор на 68 различных ЯП.
Maxima:
2^3^2;
Больше ничего из не рассмотренного выше на этой машине у меня нет(
возможно, я не очень понятно написал, но речь шла про оператор возведения в степень, как бы он ни обозначался в языке,
а не про операторы, обозначаемые символами ^ и **
так что ваш список ## Syntax error - мимо кассы
Forth - это стековый язык, там порядок выполнения задаётся стеком (а не парсером языка, который присваивает левую или правую ассоциативность оператору)
так что в Forth можно считать, нет операторов вообще, а есть только функции над ячейками стека
статья по вашей ссылке объясняет, как реализовать функцию pow даже в тех языках, где есть оператор возведения в степень.
прикольно, но не в тему
версию бейсика не уточните?
а вот за bash, пих-пих-пих и матлаб - спасибо!
А что, из списка "syntax error" хоть у одного языка есть такой оператор (как бы он ни обозначался)?
Я написал этот список затем, чтобы сузить поиск. Очевидно, что в них нужно использовать pow или самосборный глагол (как в примере с Forth) так как в некоторых из них нет вообще понятия "оператор".
Но это уже философия.
> версию бейсика не уточните?
Несколько, результаты сильно отличаются.
FreeBasic (0.91):
QBasic:
KBasic:
YaBasic (2.9):
Интересно было бы посмотреть на другие компиляторы и версии Паскаля (у меня FreePascal 2.6).
А так же глянуть на Delphi и Fortran (:
интересуют только языки, в которых ЕСТЬ арифметический оператор возведения в степень (а именно, интересует его лево- или право-ассоциативность)
другие языки не интересуют. совсем.
зачем смотреть дельфи, если в паскале такого оператора нет?
вопрос "а что скажет компилятор, если мы напишем две звёздочки подряд?", хотя и может быть интересен, но к этой теме не относится.
дельфи 7 сказал вот что:
b := 2^3; [Error] Main.pas(358): Pointer type required
b := 2**3; [Error] Main.pas(359): Expression expected but '*' found
потому что в паскале сишный xor означает получение содержимого памяти по типизированному указателю
с бейсиком интересно - что стандарт языка говорит про степень?
разные диалекты используют разные обозначения, некоторые даже глотают две звёздочки как обычное умножение (там, где результат 12)
помню, в бейсике на БК0010-01 для степени использовался символ, которого нет в ASCII-кодах (горизонтальная линия с засечкой вниз под буквой Ч, i.imgur.com/HyVQiHa.jpg )
Затем, что тот же Standart от Turbo/Object уже отличается значительно, емнип. Интересна скорее линейка XE, а не VB6.
> вопрос "а что скажет компилятор, если мы напишем две звёздочки подряд?", хотя и может быть интересен, но к этой теме не относится.
Отчего же? Задам вопрос иначе. Какие символьные представления операторов (кроме ** и ^) существуют для обозначения экспоненты в ЯП? Я знаю только два:
1. Какой-то хрен-найдёшь-клавишу-знак у APL (но так можно сказать про почти все символы языка)
2. F# с глаголом pown, который отличается от Forth тем, что заранее забит в BCL (поставляемой сразу с .NET).
Вспомнив F# не поленился и сходил в он-лайн компилятор D за правильным ответом:
Можно было бы ещё в такие языки посмотреть как J, K, R, Haskell.
> что стандарт языка говорит про степень?
Стандартов Васика с десяток, а реализаций ещё больше на каждый стандарт. Причём, разница между ними, простите за тавтологию, очень разная.
В первом стандарте операторов вообще немного и экспоненты среди них не было. До реализаций примерно конца 80х считали руками в цикле или с помощью функции EXP(), но даже она не везде существовала.
Про спецкнопку интересно, спасибо. При её нажатии что было видно на дисплее?
вот такая же загогулина и печаталась )