Непонимание приоритета оператора - PullRequest
0 голосов
/ 28 мая 2020

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

Я не понимаю, почему следующий код не генерирует исключение.

if (

    object == null || 
    object.Flag && 
    object.Status == object2.Status

)

Что делать, если объект null? В этом случае не вызывает ли вызов object.Status исключение из-за высокого приоритета == над &&, аналогично && над ||? То есть,

if (

    (object == null) || 
    (object.Flag && 
    (object.Status == object2.Status))

)

Порядок звонка,

  1. object.Status == object2.Status
  2. object.Flag
  3. object == null

Что я упускаю из виду?

1 Ответ

1 голос
/ 28 мая 2020

Сначала ваша выписка:

Порядок звонка,

  1. object.Status == object2.Status
  2. object.Flag
  3. object == null

Неправильно. Начиная с spe c:

Вне зависимости от приоритета операторов и ассоциативности, операнды в выражении оцениваются слева направо.

Итак порядок оценки (или был бы, если бы || не было короткого замыкания, см. ниже):

  1. object
  2. null
  3. object == null
  4. object.Flag
  5. object.Status
  6. object2.Status
  7. object.Status == object2.Status
  8. object.Flag && (object.Status == object2.Status)
  9. object == null || (object.Flag && (object.Status == object2.Status))

На этом мы уже на полпути.

Последняя часть состоит в том, что операторы || и && замыкаются. В выражении a || b, если a истинно, то b не будет оцениваться.

From SPE c:

Обычно оцениваются все операнды операторов. Однако некоторые операторы оценивают операнды условно. То есть значение крайнего левого операнда такого оператора определяет, должны ли (или какие) оцениваться другие операнды. Эти операторы являются условными логическими операторами AND (&&) и OR (||) , операторами объединения с нулем ?? и ?? = , условные операторы NULL?. и? [] и условный оператор ?:

Итак, если object == null равно true, то другая сторона || (это То есть биты, которые обращаются к свойствам на object), никогда не оцениваются.

...