Приоритет и порядок вычисления

Очередность и ассоциативность операторов c# влияют на группирование и оценки операндов в выражениях.Приоритет операторов может применяться только в том случае, если другие операторы с более высоким или более низким приоритетом.Выражения с операторами с наивысшим приоритетом вычисляются первыми.Приоритет может быть также описывается машинным словом «привязки». Считается, что имеются операторы с более высоким приоритетом, плотную привязку.

В следующей таблице приведены приоритет и ассоциативность (порядок, в котором операнды операторов, вычисляются) c#, и содержит их в порядке приоритетов от самого высокого до самого низкого.Где несколько операторов отображаются вместе они имеют одинаковый приоритет и ассоциативность, оцениваются в соответствии с их.Операторы в таблице описаны в разделах, начиная с Постфиксная операторы.В остальной части данного раздела предоставляют общие сведения о приоритет и ассоциативность.

Очередность и Ассоциативность операторов C#

Symbol1

тип операции

Ассоциативность

[ ] ( ) . - > Постфикс ++ и постфикс --

Выражение

Слева направо

префикс ++ и префикс –– sizeof - ~ & * +!

Унарный

Справа налево

предоставляет подходящую роль

Унарный

Справа налево

* / %

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

Слева направо

+ –

Аддитивные

Слева направо

<< >>

Побитовое миграция

Слева направо

< > <= >=

реляционно

Слева направо

== !=

Равенство

Слева направо

&

Побитового и

Слева направо

^

Битовый-монопольный-ИЛИ

Слева направо

|

Битовый-включительн-ИЛИ

Слева направо

&&

Логически-И

Слева направо

||

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

Слева направо

?:

условное выражение

Справа налево

= *= /= %= 

+= - = <<= >>=&=

^= |=

простое и составное assignment2

Справа налево

,

последовательная оценка

Слева направо

1.Операторы перечислены в порядке убывания приоритета.Если несколько операторов отображаются на одну линию или в группу, то они имеют одинаковый приоритет.

2.Все операторы простых и составн-назначения имеют одинаковый приоритет.

Выражение может содержать несколько операторов с равными приоритетом.Если несколько таких операторов отображаются на один и тот же уровень в выражение, вычисление продолжает в соответствии с ассоциативность операторов или справа налево или слева направо.Направление вычисления не влияет на результаты выражений, включающие несколько умножение (*сложение ()+или binary-битовый ()& | ^), оператор на том же уровне.Порядок операций не определенный языком.Компилятор free иметь такие выражения в любом порядке, если компилятор может гарантировать последовательный результат.

(Только последовательн-оценка**"логически-И ()&&логического или ()||условное выражение ()- .) и операторы вызова функции образуйте точки последовательности и поэтому гарантируйте заданный порядок вычисления для своих операндов.Оператор вызова функции круглые скобки, за которым следует идентификатор функции.Оператор (последовательн-оценки"**) гарантирует, что оценивать свои операнды слева направо.(Обратите внимание, что оператор " запятая " в вызове функции отличается от оператора последовательн-оценки и не предоставляет каких-либо гарантированную.) Дополнительные сведения см. в разделе Элементы последовательности.

Логические операторы также гарантируют, что вычисление своих операндов слева направо.Однако они вычисляются наименьшее число операндов, необходимых для определения результата выражения.Это называется оценкой «короткого замыкания».Таким образом, некоторые операндов выражения быть не могут.например, в выражении

x && y++

второй операнд, y++оценивает, только если x true (не равен нулю).таким образом, y если не увеличивает x имеет значение false (0).

Примеры

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

Выражение

Автоматическая привязка

a & b || c

(a & b) || c

a = b || c

a = (b || c)

q && r || s--

(q && r) || s––

В первом выражении оператор побитового и (&) имеет более высокий приоритет, чем оператор логического или (||), a & b формы первый операнд операции логического или.

Во втором выражении оператор логического или (||) имеет более высокий приоритет, чем оператор (простой-назначения=), b || c группирует как правый операнд в назначении.Обратите внимание, что значение, присвоенное параметру a 0 или 1.

Третье выражение отображает правильно, образованное выражение, которое может выдать непредвиденный.Оператор (логически-И&&) имеет более высокий приоритет, чем оператор логического или (||), q && r группирует в качестве операнда.Поскольку логические операторы гарантируют оценка операндов слева направо q && r вычисляет before s––.однако, если q && r результатом которого является значение, как значение s–– не вычисляет и s не уменьшается.если не декрементирующ s вызвал проблему в программе s–– выглядеть как первый операнд выражения или s быть декрементировано в отдельной операции.

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

Недопустимое выражение

Группирование по умолчанию

p == 0 ? p += 1: p += 2

( p == 0 ? p += 1 : p ) += 2

В этом выражении оператор равенства (==имеет наивысший приоритет), p == 0 группирует в качестве операнда.Условного выражения (оператор? :следующ-самый) имеет высокий приоритет.Первого операнда p == 0и его второй операнд p += 1.Однако считается, что последний операнд оператора условного выражения p вместо p += 2с помощью этого вхождений p более тесно привязывается к оператору условного выражения, чем он делает оператора составн-назначения.Синтаксическая ошибка возникает, поскольку += 2 нет левый операнд.Следует использовать скобки для предотвращения ошибок этого типа и более четкого Кода продукта.Например, можно использовать круглые скобки, как показано ниже, чтобы исправить и прояснить предыдущий пример:

( p == 0 ) ? ( p += 1 ) : ( p += 2 )

См. также

Ссылки

Операторы C#