Уровни приоритета оператора D (версия 1.0) - PullRequest
4 голосов
/ 19 апреля 2010

Кто-нибудь знает, где находится список уровней приоритета операторов для версии D D 1.0?

Ответы [ 5 ]

6 голосов
/ 21 апреля 2010

На странице http://www.digitalmars.com/d/1.0/expression.html, материал, показанный выше, имеет более низкий приоритет в целом. Чтобы получить конкретный приоритет, следуйте правилам парсера.

15.   typeof() typeid() is()
      assert() import() mixin()
      function delegate
      T.x x!y
      variables
      (...) [...]       //(Primary expressions)
      "x" "y"           //(Concatenation between string literals)
14.   . x++ x--
      x() x[]           //(Postfix operators)
13.   & ++x --x * 
      +x -x ! ~ (T).
      new delete
      cast              //(Prefix operators)
12½.  ^^                //(Power. D2 only)
12.   * / %            ///(Multiplicative operators)
11.   + - ~             //(Additive operators)
10.   >> << >>>         //(Bitwise shift)
 9.   == != is !is
      > < >= <=
      !> !< !>= !<=
      <> !<> <>= !<>=
      in !in            //(Comparison operators)
 8.   &                 //(Bitwise AND)
 7.   ^                 //(Bitwise XOR)
 6.   |                 //(Bitwise OR)
 5.   &&                //(Logical AND)
 4.   ||                //(Logical OR)
 3.   ?:                //(Conditional operator)
 2.   op=               //(Assignment operator)
 1⅔.  =>                //(Lambda. D2 only. Not really an operator)
 1⅓.  ..                //(Slicing. Not really an operator)
 1.   ,                 //(Comma operator)
2 голосов
/ 19 апреля 2010

См. Страницу D 1.0 в выражениях .

Порядок оценки

Следующие двоичные выражения оценивается строго слева направо заказ:

CommaExpression, OrOrExpression, AndAndExpression

Следующие двоичные выражения оценивается в реализации, определенной заказ:

AssignExpression, OrExpression, XorExpression, AndExpression, CmpExpression, ShiftExpression, AddExpression, CatExpression, MulExpression, параметры функции

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

i = i++;
c = a + (a = b);
func(++i, ++i);

Если компилятор может определить, что результат выражения незаконно в зависимости от порядка оценки, может выдать ошибку (но не обязательно, чтобы). Способность обнаруживать ошибки такого рода - это качество вопрос реализации.

По крайней мере, это была ссылка, упомянутая Уолтером (создатель D) в этой ветке списка рассылки .

1 голос
/ 20 апреля 2010

Насколько мне известно, в настоящее время нет хорошей таблицы приоритетов операторов для D. Вы можете посмотреть страницу с выражениями (http://www.digitalmars.com/d/1.0/expression.html) и разбить любое имеющееся у вас выражение в соответствии с грамматикой и изобразить еговне, но, очевидно, это не так красиво и просто, как в таблице.

Однако код на C и C ++ гарантированно будет корректным D-кодом с идентичным поведением, иначе он не скомпилируется.Таким образом, до тех пор, пока у вас будет действительное выражение C или C ++, вы можете просто использовать таблицу приоритетов операторов C / C ++: http://www.cppreference.com/wiki/operator_precedence

Так что, к сожалению, пока нетТаблица приоритетов операторов для D, если вы понимаете приоритет операторов C / C ++, действительно не должно быть никаких сюрпризов.

Редактировать: Что касается операторов, специфичных для D, рассмотримСтраница выражений, у вас есть

Тот же приоритет, что и у других операторов присваивания

  • =

Вероятно, тот же приоритет, что и ==

  • в
  • ! В
  • равен
  • !is

Тот же приоритет, что и <</p>

  • ! <> =
  • ! <>
  • <>
  • <> =
  • !>
  • !> =
  • ! <</li>
  • ! <= </li>

Тот же приоритет, что и>>

  • >

Возможно, такой же приоритет аs *

  • ~

Я считаю, что это полный список новых D-операторов.Я говорю «вероятно» в паре этих случаев, потому что похоже, что это определяется реализацией, как указано в ответе Марка Рушакова (в этом случае приоритет очень близок к данному оператору, если не идентичен).Тем не менее, я не уверен, что на самом деле это будет иметь значение, поскольку может быть довольно сложно смешать некоторые из них таким образом, который был бы совершенно неоднозначным (особенно - и в ).

Вообще говоря, если вы придерживаетесь правил приоритета C / C ++, все должно быть в порядке.Во всяком случае, D будет несколько более строгим, чем C / C ++, из-за более строгих правил преобразования и тому подобного, поэтому я не думаю, что у вас возникнут какие-то дополнительные двусмысленности.Тем не менее, было бы неплохо предложить добавить в документацию D явную таблицу приоритетов операторов.

0 голосов
/ 20 апреля 2010

Где возможно, D использует приоритет оператора C.

0 голосов
/ 19 апреля 2010

Google не нашел много, думаю, D немного нишевый язык

Однако я наткнулся на комментарий в потоке о преобразовании из C ++ в D, где создатель D говорит: «Преобразование - это одна из причин, по которой я сохранил такие вещи, как приоритет операторов». Поэтому, если вы можете найти приоритет оператора C ++, вы сможете использовать его для D

...