Почему плюс и унарный плюс ведут себя странно в синтаксисе массива? - PullRequest
0 голосов
/ 05 октября 2018

После этот вопрос об операторе плюса У меня есть дополнительный вопрос.Мы знаем разницу между plus и uplus, и, таким образом, 1+2 разрешается до 3, так же как 1++2 или даже 1++++++++2.Странная вещь происходит в синтаксисе массива, рассмотрим этот пример:

>> [1 ++ 2]
ans =
     1     2 % Two unary plusses
>> [1 + + 2]
ans =
     3 % A normal plus and a unary one
>> [1++2]
ans =
     3 % A normal plus and a unary one

То же самое работает с несколькими плюсами, [1 +++..+++ 2], поэтому при всех последовательных плюсах в середине генерируется [1 2], все другие комбинации (какнасколько я тестировал) результат 3.

Насколько я знаю, пробелы имеют ограниченное значение в MATLAB;exp(3*x/y) совпадает с exp( 3 * x / y ).Они используются при создании массивов: [1 2] сгенерирует массив 1 -by- 2, и есть несколько других применений, но операторы разделения не являются одним из них.

Поэтому мой вопрос: почему [1 ++ 2] и [1 + + 2] разрешаются по-разному?

Обратите внимание, что minus и uminus имеюттакое же поведение, и то, что синтаксический анализатор является достаточно волшебным, чтобы разобрать [1;;;3++ + + +--+ + ++4,;;;,;] совершенно нормально до [1;7].

1 Ответ

0 голосов
/ 05 октября 2018

Я подозреваю, что это связано с тем, как анализируются числовые литералы.В частности, рассмотрим следующие сложные примеры:

>> [1+2i]

ans =

   1.0000 + 2.0000i

>> [1 +2i]

ans =

   1.0000 + 0.0000i   0.0000 + 2.0000i

>> [1 + 2i]

ans =

   1.0000 + 2.0000i

Существует конфликт между пробелом как разделителем массива и пробелом как частью комплексного числа.

Я считаю, что парсер был написан такчто он пытается разобраться в комплексных числах (по сравнению со сложными массивами) настолько разумно, насколько это возможно.Это может легко привести к нетривиальному поведению при разборе выражений, включающих сложение / вычитание и пробел.


Чтобы быть немного более конкретным:

1 ++ 2 может анализироваться как 1 +2, поскольку множественные унарные плюсы все еще являются унарным плюсом, а унарный плюс может действовать только на 2.

Но 1 + + 2 может рассматриваться как 1 + (+ 2), где последний плюс потребляется как унарный плюс., оставляя 1 + 2, который является единственным "сложным" числом.


Дальнейшее продолжение после пытливого комментария от @ Adriaan :

[...] [1 ++ + 2] - это [1 2], но [1 + ++ 2] - это 3

Поэтому мое правильное предположение состоит в том, что парсер перемещается справа налево.

  • [1 ++ + 2] -> [1 ++ (+ 2)] -> [1 ++ 2], против
  • [1 + ++ 2] -> [1 + (++ 2)] -> [1 + 2].

Thisтакже подразумевает, что любая комбинация [1 + ...2] (где в первом подключенном блоке плюсов есть только один плюс) даст вам [3], тогда как, если первый блок плюсов содержитдва или более вы получите [1 2].Несколько псевдослучайных тестов, казалось, подтвердили это поведение.

Конечно, пока MathWorks не сделает свой парсер открытым исходным кодом или документально подтвержденным, мы можем только догадываться.

...