Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

7.3Операторы

Выражения состоят из операндов и операторов. Операторы в выражении указывают, какие операции производятся с операндами. К операторам относятся, например, +, -, *, / и new. К операндам относятся, например, литералы, поля, локальные переменные и выражения.

Существует три типа операторов.

  • Унарные операторы. У унарного оператора есть только один операнд и оператор может записываться в префиксной форме (например, –x) или постфиксной форме (например, x++).

  • двоичные операторы; У бинарных операторов два операнда и они записываются в виде инфикса (например, x + y).

  • Тернарный оператор. Существует только один тернарный оператор, ?:. В нем три операнда и используется инфиксная запись (c? x: y).

Порядок вычисления операторов в выражении определяется приоритетом и ассоциативностью операторов (§7.3.1).

Операнды в выражении вычисляются слева направо. Например, в выражении F(i) + G(i++) * H(i) вызывается метод F со старым значением i, затем вызывается метод G со старым значением i и, наконец, вызывается метод H с новым значением i. Это никак не связано с приоритетом операторов.

Некоторые операторы допускают перегрузку. Перегрузка операторов позволяет использовать пользовательскую реализацию операторов в операциях, в которых один или оба операнда имеют пользовательский тип класса или структуры (§7.3.2).

7.3.1Приоритет и ассоциативность операторов

Когда выражение содержит несколько операторов, порядок вычисления отдельных операторов задается приоритетом операторов. Например, выражение x + y * z вычисляется как x + (y * z), поскольку приоритет оператора * выше, чем у бинарного оператора +. Приоритет оператора задается в определении связанной с ним грамматической структуры. Например, аддитивное_выражение состоит из последовательности мультипликативных_выражений, разделенных операторами + или –, таким образом, операторы + или – имеют более низкий приоритет, чем операторы *, / и %.

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

Раздел

Категория

Операторы

7.6

Основной

x.y f(x) a[x] x++ x-- new

typeof default checked unchecked delegate

7.7

Унарный

+ - ! ~ ++x --x (T)x

7.8

Мультипликатив-ный

* / %

7.8

Аддитивный

+ -

7.9

Сдвиг

<< >>

7.10

Отношение и проверка типа

< > <= >= is as

7.10

Равенство

== !=

7.11

Логическое И

&

7.11

Исключающее ИЛИ

^

7.11

Логическое ИЛИ

|

7.12

Условное И

&&

7.12

Условное ИЛИ

||

7.13

Объединение с нулем

??

7.14

Условный

?:

7.17, 7.15

Присваивание и лямбда-выражение

= *= /= %= += -= <<= >>= &= ^= |=

=>

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

  • За исключением операторов присваивания все бинарные операторы обладают левой ассоциативностью. Это означает, что все операции выполняются слева направо. Например, выражение x + y + z вычисляется как (x + y) + z.

  • Операторы присваивания и условный оператор (?:) обладают правой ассоциативностью. Это означает, что все операции выполняются справа налево. Например, выражение x = y = z вычисляется как x = (y = z).

Приоритетом и ассоциативностью можно управлять с помощью скобок. Например, в выражении x + y * z сначала y умножается на z, а затем результат складывается с x, но в выражении (x + y) * z сначала складываются x и y, а затем результат умножается на z.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]