为什么 PowerShell 中的整数按数字比较?
Why do integers in PowerShell compare by digits?
我的代码告诉你你猜的数字是高于还是低于随机生成的数字,但它似乎只比较其中一个数字低于 10 时的第一位数字。
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
$isQuitting = $false
Do{
[int]$Input = Read-Host "Take a guess!"
If($Input -lt $GeneratedNum){Write-Output "Too Low"}
If($Input -gt $GeneratedNum){Write-Output "Too High"}
If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
例如,当$GeneratedNum = 56
和$Input = 7
时,它returns"Too High"
这是因为您要将字符串与整数进行比较。顺序很重要。
"56" -lt 7
其实是一样的:
"56" -lt "7"
或者:
56 -lt "7"
会给你正确的结果。 PowerShell 尝试将右侧参数强制转换为左侧的类型。
您可以尝试显式转换:
[int]$Input -lt $GeneratedNum
问题来自这样一个事实,即 Read-Host
return 一个字符串,所以你的演员表 $Input
是一个 ArrayListEnumeratorSimple
try :
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum
$isQuitting = $false
Do{
$Input = (Read-Host "Take a guess!") -as [int]
If($Input -lt $GeneratedNum){Write-Output "Too Low"}
If($Input -gt $GeneratedNum){Write-Output "Too High"}
If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
您还应该使用 try{}catch{}
来捕捉输入不是 int 的情况。
你要明白的是,当你使用PowerShell比较运算符时,左边的类型是用selected的,所以右边的部分被强制转换成左边的类型。知道您可以编写以下内容,我只是将 $GeneratedNum
这是一个整数放在比较的左侧:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum
$isQuitting = $false
Do{
$Input = (Read-Host "Take a guess!")
If($GeneratedNum -gt $Input){Write-Output "Too Low"}
If($GeneratedNum -lt $Input){Write-Output "Too High"}
If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
切勿使用与自动变量同名的变量:$input
是自动变量。
查看这段代码,我在其中通过管道从主机读取值(并且不使用 $input
变量):
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
$isQuitting = $false
Do{
Read-Host "Take a new guess!" | %{
if($_ -as [int] -gt 0){
If($_ -lt $GeneratedNum){Write-Output "Too Low"}
If($_ -gt $GeneratedNum){Write-Output "Too High"}
If($_ -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
}
}
} Until($isQuitting -eq $true)
重要的是要注意我的代码正确处理 错误的 输入(非数字字符),例如 w
或字符串 (qwerty
),这使得其他提议失败。
我利用了你生成整数总是大于 0 的事实。
使用 switch
:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
:lop Do{
switch ((Read-Host 'Take a new guess!') -as [int])
{
{$_ -eq $null}{continue}
{$_ -lt $GeneratedNum}{'Too Low';continue}
{$_ -gt $GeneratedNum}{'Too High';continue}
{$true}{'Good Job!';break lop}
}
} while($true)
我的代码告诉你你猜的数字是高于还是低于随机生成的数字,但它似乎只比较其中一个数字低于 10 时的第一位数字。
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
$isQuitting = $false
Do{
[int]$Input = Read-Host "Take a guess!"
If($Input -lt $GeneratedNum){Write-Output "Too Low"}
If($Input -gt $GeneratedNum){Write-Output "Too High"}
If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
例如,当$GeneratedNum = 56
和$Input = 7
时,它returns"Too High"
这是因为您要将字符串与整数进行比较。顺序很重要。
"56" -lt 7
其实是一样的:
"56" -lt "7"
或者:
56 -lt "7"
会给你正确的结果。 PowerShell 尝试将右侧参数强制转换为左侧的类型。
您可以尝试显式转换:
[int]$Input -lt $GeneratedNum
问题来自这样一个事实,即 Read-Host
return 一个字符串,所以你的演员表 $Input
是一个 ArrayListEnumeratorSimple
try :
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum
$isQuitting = $false
Do{
$Input = (Read-Host "Take a guess!") -as [int]
If($Input -lt $GeneratedNum){Write-Output "Too Low"}
If($Input -gt $GeneratedNum){Write-Output "Too High"}
If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
您还应该使用 try{}catch{}
来捕捉输入不是 int 的情况。
你要明白的是,当你使用PowerShell比较运算符时,左边的类型是用selected的,所以右边的部分被强制转换成左边的类型。知道您可以编写以下内容,我只是将 $GeneratedNum
这是一个整数放在比较的左侧:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum
$isQuitting = $false
Do{
$Input = (Read-Host "Take a guess!")
If($GeneratedNum -gt $Input){Write-Output "Too Low"}
If($GeneratedNum -lt $Input){Write-Output "Too High"}
If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
切勿使用与自动变量同名的变量:$input
是自动变量。
查看这段代码,我在其中通过管道从主机读取值(并且不使用 $input
变量):
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
$isQuitting = $false
Do{
Read-Host "Take a new guess!" | %{
if($_ -as [int] -gt 0){
If($_ -lt $GeneratedNum){Write-Output "Too Low"}
If($_ -gt $GeneratedNum){Write-Output "Too High"}
If($_ -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
}
}
} Until($isQuitting -eq $true)
重要的是要注意我的代码正确处理 错误的 输入(非数字字符),例如 w
或字符串 (qwerty
),这使得其他提议失败。
我利用了你生成整数总是大于 0 的事实。
使用 switch
:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
:lop Do{
switch ((Read-Host 'Take a new guess!') -as [int])
{
{$_ -eq $null}{continue}
{$_ -lt $GeneratedNum}{'Too Low';continue}
{$_ -gt $GeneratedNum}{'Too High';continue}
{$true}{'Good Job!';break lop}
}
} while($true)