Использование скобок для нескольких логических операций

Рассмотрим следующие утверждения:

Get-ChildItem -Recurse *.vbs | Where-Object{$_.name -like "d*" -and $_.name -like "*s"}
Get-ChildItem -Recurse *.vbs | Where-Object{($_.name -like "d*") -and ($_.name -like "*s")}

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

Глядя на about_Logical_Operators, примеры для -and и -or показывают эти круглые скобки.

(1 -eq 1) -or (1 -eq 2)

Но затем статья технической сети для Использование командлета Where-Object показывает это пример

$_.handles -gt 200 -and $_.name -eq "svchost"

Какое-то время я говорил людям использовать скобки, потому что «иначе это не сработает». Является ли разница чисто косметической и, в конечном счете, не имеет значения, и я просто настаиваю на своих личных предпочтениях?


person Matt    schedule 28.08.2014    source источник


Ответы (1)


Если вы посмотрите документ спецификации Windows PowerShell 3.0, он говорится об этом в разделе 7.10 (Логические операторы):

Логический оператор И -и преобразует значения, указанные его операндами, в логические значения, если это необходимо (§6.2). Результатом является логическое И возможных преобразованных значений операнда, и он имеет тип bool. Если левый операнд оценивается как False, правый операнд не оценивается. Логический оператор ИЛИ -or преобразует значения, указанные его операндами, в bool, если это необходимо (§6.2). Результатом является логическое ИЛИ возможно преобразованных значений операнда, и он имеет тип bool. Если левый операнд оценивается как True, правый операнд не оценивается. Логический оператор XOR -xor преобразует значения, указанные его операндами, в bool (§6.2). Результатом является логическое XOR возможно преобразованных значений операнда, и он имеет тип bool.

Эти операторы ассоциативны слева.

Таким образом, это определяет правила добавления (или отсутствия) круглых скобок.

person David Brabant    schedule 28.08.2014
comment
Моя интерпретация этого текста заключается в том, что он оценивает то, что слева, а затем справа, если требуется, независимо от наличия скобок. Это та точка, которую я должен получить? - person Matt; 28.08.2014
comment
Ага. Логическое выражение оценивается слева направо, и вы несете ответственность за размещение круглых скобок, если оценка по умолчанию не соответствует тому, что вы ожидаете. - person David Brabant; 28.08.2014