Приоритет логических операторов в PowerShell

#powershell

Вопрос:

Почему это выражение возвращает False вместо True ?

$true -or $false -and $false

-and должно иметь приоритет над -or , как подтверждено документацией Microsoft Powershell.

Но похоже, что выражение оценивается как ($true -or $false) -and $false вместо $true -or ($false -and $false) !

Может ли кто-нибудь объяснить мне, чего мне здесь не хватает ?

Комментарии:

1. «В следующем списке операторы перечислены в том порядке, в котором они оцениваются. Операторы в одной строке или в одной группе имеют одинаковый приоритет»

2. Эта строка привела меня к ошибке : «Список возобновляется здесь со следующими операторами в порядке приоритета:»

Ответ №1:

В связанной документации не указано, что -and имеет приоритет над -or — вместо этого в ней указано, что -and и -or — возможно, удивительно[1] — имеют одинаковый приоритет[2] в PowerShell.

Таким образом:

 $true -or $false -and $false
 

является — из-за подразумеваемой левой ассоциативности — оценивается как:

 ($true -or $false) -and $false  # -> $false
 

Другими словами: Используйте (...) для переопределения этой левой ассоциативности по требованию:

 $true -or ($false -and $false)  # -> $true
 

[1] Обсуждение см. в выпуске GitHub №8512.

[2] Список документов -and -or -xor в одной строке, подразумевающий, что все эти операторы имеют одинаковый приоритет.

Комментарии:

1. Я привык к стандартному способу (должен ли я сказать «правильному способу») оценки логических операторов, где и всегда имеет приоритет над или, поэтому это становится настоящим сюрпризом и окончательно присоединится к моей коллекции PowerShell gotcha !

2. Для меня это тоже стало неожиданностью. Что еще более удивительно, у меня никогда не было ошибки из-за этого на практике. Это возможно, потому что я склонен использовать (...) логические выражения для выражения своего намерения вместо того, чтобы полагаться на приоритет.

3. Действительно, @zett42- (...) это прагматичный способ обеспечить соблюдение и сигнализировать о желаемом приоритете, не заставляя читателя слишком задумываться о встроенном приоритете, который трудно запомнить, учитывая, сколько операторов имеет PowerShell.