gpt4 book ai didi

powershell - “$(($i++))”背后的魔力是什么?

转载 作者:行者123 更新时间:2023-12-04 17:18:16 24 4
gpt4 key购买 nike

这是一段小代码,每隔1秒输出1 2 3 ...

while ($true) {
sleep -s 1
"$(($i++))"
}

这怎么可能?

最佳答案

注释中有很好的指针,但让我深入一点:

$i++ 的说明:

  • $i++使用++(即increment operator)来将变量$i的值增加1 ,这在C#和C / C++之类的语言中可能是很熟悉的。不出所料,也存在强制减量运算符--)。
  • 因为++位于变量之后(后缀形式),所以在语句中使用变量的值后便会增加;将其放在变量之前-++$i(前缀形式)将首先执行递增操作;如果单独使用增量/减量运算,则该区别无关紧要。
  • $i假定包含数字类型的实例,否则会发生错误;如果尚未初始化变量$i,则其值实际上是$null,PowerShell会将其强制转换为[int]类型的0。因此,$i++在其语句的上下文中求值为0,然后再递增为1
  • $i++这样的增量/减量表达式被视为赋值-您可以将其视为$i = $i + 1-并且PowerShell中的赋值不产生任何输出(它们不返回任何内容;它们仅更新变量的值)。

  • 关于(...) $i++的说明:
  • 通过将赋值括在括号((...))中,可以将其变成一个表达式,这意味着赋值通过传递,以便它可以参与更大的表达式;例如。:
  • $i = 0 ...无输出-仅将值0分配给变量$i
  • ($i = 1) ...输出1:由于(...),也会输出分配的值。
  • (++$i) ...预递增:将$i的值递增为2并输出该值。
  • ($i++) ...后减:输出当前值2,然后将该值递增到3

  • 关于$(...) ($i++)的说明:
  • $(...) subexpression operator 是将一个或多个语句的输出嵌入到不直接支持语句的上下文中所必需的。值得注意的是,您可以使用它将命令输出嵌入可扩展的字符串("...")中,即执行字符串插值。
  • 请注意,仅需将$(...)嵌入表达式(例如,用(...)括起来的东西,属性访问($foo.bar),索引,($foo[0])和方法调用($foo.Baz()))和命令(例如Get-Date),而不仅仅是诸如此类的变量引用如"Honey, I'm $HOME"中所示。有关在PowerShell中可扩展字符串的更多信息,请参见this answer
  • 虽然在您的简单示例中并不一定需要可扩展的字符串-只是($i++)会产生看起来相同的输出[1]-$(...)可用于使($i++)的值成为较大字符串的一部分;例如"Iteration #$(($i++))"以打印"Iteration #0""Iteration #1",...


  • [1] ($i++)是一个数字,而 "$(($i++)"是一个字符串,其中数字到字符串的转换是字符串内插的一部分。
    尽管通常会产生相同的控制台输出,但是对于非整数数字(例如 1.2),它实际上可能会有所不同,因为直接输出会应用区域性敏感的字符串化,而字符串插值是区域性不变的。因此,对于使用 ,作为小数点的有效区域性-例如, fr-FR1.2适当地在区域性中作为 1,2打印到控制台,而 "$(1.2)"始终作为 1.2打印

    关于powershell - “$(($i++))”背后的魔力是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617883/

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