#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.