为什么在PowerShell中省略for循环中的变量会导致无限循环?

时间:2015-01-16 08:29:35

标签: powershell powershell-v4.0

为什么

 $i=1
 for ($i -le 5; $i++)
 {Write-Host $i}

导致无限循环? 我从来没有尝试用C#或任何其他编程语言写这样的东西,所以我不知道它会如何在那里表现,但是为什么for循环不仅仅是抓住" i"变量将它与5比较,加1并再次比较,它就像for循环是盲目的或某种形式的机器,而不是合理的,合乎逻辑的人。

为什么无限而不只是抓住预定义的i? 类似于"的答案,因为这是PowerShell的功能"没用,我想知道为什么它就像那样。

我知道它变得无限,因为它缺少第一个参数,我想知道为什么,但是,像哲学的回答一样,为什么会循环不要在其周期之外寻找同名变量,但必须明确包含在其中?"

2 个答案:

答案 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等于它自己,因此,循环永远不会结束。