为什么
$i=1
for ($i -le 5; $i++)
{Write-Host $i}
导致无限循环? 我从来没有尝试用C#或任何其他编程语言写这样的东西,所以我不知道它会如何在那里表现,但是为什么for循环不仅仅是抓住" i"变量将它与5比较,加1并再次比较,它就像for循环是盲目的或某种形式的机器,而不是合理的,合乎逻辑的人。
为什么无限而不只是抓住预定义的i? 类似于"的答案,因为这是PowerShell的功能"没用,我想知道为什么它就像那样。
我知道它变得无限,因为它缺少第一个参数,我想知道为什么,但是,像哲学的回答一样,为什么会循环不要在其周期之外寻找同名变量,但必须明确包含在其中?"
答案 0 :(得分:4)
如果您阅读了Windows PowerShell语言规范,那么您将看到for语句的语法:
for-statement:
for new-linesopt (
new-linesopt for-initializeropt statement-terminator
new-linesopt for-conditionopt statement-terminator
new-linesopt for-iteratoropt
new-linesopt ) statement-block
for new-linesopt (
new-linesopt for-initializeropt statement-terminator
new-linesopt for-conditionopt
new-linesopt ) statement-block
for new-linesopt (
new-linesopt for-initializeropt
new-linesopt ) statement-block
for-initializer:
pipeline
for-condition:
pipeline
for-iterator:
pipeline
这意味着在您的示例中,第一个语句是INITIALIZER 。
如果以这种方式重写循环:
$i=1
for (;$i -le 5; $i++)
{Write-Host $i}
它会像你期望的那样工作。 请注意附加的";"。
如果省略&#34 ;;",则$i++
上面的语法对应于 for-condition ,其持续评估为$ true,因此循环从不结束。
答案 1 :(得分:1)
在你的编辑中,你说你知道它变得无限,但你想知道为什么。 答案是,PowerShell会自动进行类型转换。
您从int
类型开始,其值为1,递增。当它达到[int]::MaxValue
并且增加1时,类型int
不能再保持此值。然后,PowerShell会自动将其类型转换为double
。例如,试试这个:
$i=[int]::MaxValue -2
++$i
$i.GetType()
++$i
$i.GetType()
++$i
$i.GetType()
++$i
$i.GetType()
查看输出,并查看PowerShell将类型从int
转换为double
。
double
的最大值增加1等于它自己,因此,循环永远不会结束。