OberonCore
https://forum.oberoncore.ru/

Приоритет унарного минуса
https://forum.oberoncore.ru/viewtopic.php?f=29&t=5870
Страница 1 из 1

Автор:  Oleg N. Cher [ Четверг, 18 Август, 2016 00:35 ]
Заголовок сообщения:  Приоритет унарного минуса

Вопрос от Олега Комлева:
Oleg Komlev писал(а):
Почему унарный минус в Обероне/КП имеет приоритет как у аддитивной операции? Получается, что (-1 MOD 256) означает "-(1 MOD 256)" , а не "(-1) MOD 256". Кроме того, "-1" это не литерал "минус единица", а константное выражение "изменение знака у литерала 1", в результате вычисления которого получается константа "минус 1". Если бы унарный минус имел наивысший приоритет, то не было бы практической разницы для записи "-1" (и литерал и константное выражение означало бы "минус единица"). Но если приоритет унарного минуса ниже мультипликативных операций, то разница есть: (-1 MOD 256) = -1, а выражение "(-1) MOD 256" дает 255.

В Паскале, Си, Бейсике (по крайней мере, в большинстве диалектов) и многих других языках унарный минус имеет наивысший приоритет (во всяком случае, выше мультипликативных операций). Почему же в Обероне не так?

Автор:  prospero78 [ Четверг, 18 Август, 2016 11:00 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

Хороший вопрос. Не знал, что дела обстоят именно так. Дурная привычка писать (-1) MOD 255 меня в программе дорасчёта спасла, сам того не зная))
А вообще, этот момент, конечно, вызывает вопросы.

Автор:  ilovb [ Четверг, 18 Август, 2016 19:24 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

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

Автор:  Trurl [ Пятница, 28 Октябрь, 2016 08:31 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

Интересно, вы действительно хотите, чтобы (-E) и (0 - E) иногда выдавали разные результаты?

Автор:  Oleg N. Cher [ Суббота, 29 Октябрь, 2016 14:15 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

И в каком же случае будут разные результаты?

Автор:  Comdiv [ Воскресенье, 06 Ноябрь, 2016 19:15 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

Вы в вопросе написали такое выражение.
(-1) MOD 256 по правилам арифметики, согласно которым остаток неотрицательный, равен 255.
0 - (1 MOD 256) равен -1
Можете проверить хоть в ББ, хоть в python, хоть в Lua, но только в Обероне -1 MOD 256 = 0 - 1 MOD 256 (не проверял)
Одна из проблем Оберона в нашем чудном мире, что он ведёт себя более логично, чем другие языки, и потому представляется менее предсказуемым для людей, привыкшим к более нелогичному поведению.

Кстати, из побочных преимуществ - упрощается создание синтаксического дерева.

Автор:  Kemet [ Понедельник, 07 Ноябрь, 2016 08:45 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

Cтрого говоря, -1 и 255 в двоичном виде одно и то же. Если нужно учитывать знак, то спасёт приведение типов:
В Активном Обероне, например:
SIGNED8( (-1) MOD 256) = SIGNED8( -1 MOD 256 ) = -1

К тому же, как мне помнится, Excel тоже трактует остаток как положительное число, а VBA - как отрицательное.
То есть в Экселе MOD( -1, 256 ) = 255

Автор:  Kemet [ Понедельник, 07 Ноябрь, 2016 09:42 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

В чем разница между получением остатка от деления и взятия модуля?
В Обероне MOD, что как бы намекает, да.

Автор:  Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 04:29 ]
Заголовок сообщения:  Re: Приоритет унарного минуса

Comdiv писал(а):
Кстати, из побочных преимуществ - упрощается создание синтаксического дерева.
В Обероне нет унарных операций "+"/"-". Это упрощает и грамматику, и таблицу операций.

"Свободы", правда, несколько прижимаются. Трассером не постреляешь.
Код:
#include <stdio.h>
int main ()
{
int x = 1, y = 2;
printf("%i", - - - - -x + - - - - -y);
return 0;
}
Разве это не стоит 16-ти уровней приоритетов? :)

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/