gpt4 book ai didi

arrays - 阵列访问的奇怪天花板

转载 作者:行者123 更新时间:2023-12-04 18:38:14 25 4
gpt4 key购买 nike

我在使用数组索引器时在 PowerShell 中遇到了奇怪的代码片段。为什么你认为它的行为方式如下?

我期望的标准行为是每次获取数组的确切成员,在这种情况下首先是从零开始

(0, 1)[0] == 0          # as expected
(0, 1 -ne 2)[0] == 0 # as expected regardless second member would be casted from bool to int
(0, 1 -ne 0)[0] == 1 # magic starts here

到目前为止,我希望它的类型转换结果为 1 -ne 0从 bool 到 int 并与数组第一个位置的 0 一起形成已知异常,但是:

(0, 60 -ne 0)[0] == 60   # ignores first member and whole (-ne 0) part
(0, 60 -ne 1)[0] == 0 # as expected
(1, 60 -ne 0)[0] == 1 # as expected

此时似乎只有第一个成员是 0 才生效。不管它作为变量传递,第二部分必须完全是 1 -ne 0
# doesn't matter if first member is variable    
$x = 0
($x, 1 -ne 0)[0] == 1 # same magic as before
($x, 0 -ne 1)[0] == 0 # as expected by may be caused by leading zero of 0 -ne 1
($x, 0 -ne 0)[0] == null # this is also very weird
($x, 1 -ne 1)[0] == 0 # maybe return of bool comparison or simply first member, I would expect null as before

我知道所有对这些事情的疑惑都可以通过简单地防止代码在数组中混合 bool 和 int 来解决。
我是如何发现它在我们用作天花板的遗留代码中使用的

return ([int]$lastResultCode, 1 -ne 0)

代替:

if ($lastResultCode == 0) return 1
else return $lastResultCode

但请考虑当此代码已在空中无法更改此代码但该机器上可能是 PowerShell 版本的升级,因此可能会更改 future 行为的情况。对于这种情况,我想请您对导致这种行为的原因发表意见。

最佳答案

这里发生了两件事:

  • ,运算符的优先级高于比较运算符。所以,表达式如下:

    (0, 1 -ne 0)[0]

    实际上被解析为:

    ((0, 1) -ne 0)[0]

    您可以在 about_Operator_Precedence 下阅读有关 PowerShell 运算符优先级的更多信息.
  • PowerShell 比较运算符可以处理标量(单个项目)和数组。当您将它们与数组一起使用时,它们将返回所有满足条件的项目:

    PS > (4, 5, 3, 1, 2) -gt 2  # All items greater than 2
    4
    5
    3
    PS > (4, 5, 3, 1, 2) -ne 3 # All items that do not equal 3
    4
    5
    1
    2
    PS >

  • 考虑到这些要点,您所看到的行为就很容易解释了。表达方式:

    (0, 1 -ne 0)[0]

    首先被解析为:

    ((0, 1) -ne 0)[0]

    然后变成:

    (1)[0]

    因为 -ne返回来自 (0, 1) 的项目不等于 0 ,这只是 1 .

    解决方案只是使用一组额外的括号:

    (0, (1 -ne 0))[0]

    这将导致 PowerShell 评估 1 -ne 0首先部分并按您的预期行事:

    PS > (0, (1 -ne 0))
    0
    True
    PS > (0, (1 -ne 0))[0]
    0
    PS >

    关于arrays - 阵列访问的奇怪天花板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990868/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com