2

我正在使用 Lua 5.1。这是我目前正在尝试运行的程序。

print ("What is your name?")
playerName = io.read()

print ("Are you a boy or a girl?")
playerGender = io.read()
repeat
    if playerGender ~= "boy" or "girl" or "male" or "female" then
        print ("I'm sorry, that is not a valid answer.")
        print ("Are you a boy or a girl?")
        playerGender = io.read()
    end
until (playerGender == "boy" or "girl" or "male" or "female")

无论如何,无论我输入了一个有效答案还是只是随机的乱码——程序都会以“对不起,这不是一个有效答案。你是男孩还是女孩?” 然后你会被提示再次输入你的性别——但无论答案是什么,它都会终止程序——或者它会继续运行任何其他代码。

我的代码或逻辑有什么问题会导致程序以这种方式运行吗?除了我目前使用的“重复 - 如果 - 然后 - 结束 - 否则”块之外,我是否应该使用其他东西?任何帮助,将不胜感激!

4

1 回答 1

2

显然,对于比较和布尔运算符的工作方式存在误解。以下行将始终评估为true

playerGender ~= "boy" or "girl" or "male" or "female"

这是为什么?为了更清楚会发生什么,让我们添加一些括号来显示如何根据运算符优先级评估表达式:

(playerGender ~= "boy") or ("girl") or ("male") or ("female")

这意味着,我们有四个与or运算符相关的表达式。这意味着,如果这些子表达式中的任何一个为真,则整个表达式为真。在 Lua 中,除了之外的所有值falsenil都是真值。由于所有三个字符串"girl","male""female"都是真实的,因此整个表达式总是真实的。

以下将做你想要的:

(playerGender ~= "boy") and (playerGender ~= "girl") and (playerGender ~= "male") and (playerGender ~= "female")

现在您有四个与and运算符连接的表达式,这意味着,所有子表达式都必须为真(即所有字符串比较都不相等)才能使整个表达式为真。

条件也有同样的until问题,即表达式总是真的,因为字符串总是真的。您可以按如下方式简化循环:

while playerGender ~= "boy" and playerGender ~= "girl" and playerGender ~= "male" and playerGender ~= "female" do
    print ("I'm sorry, that is not a valid answer.")
    print ("Are you a boy or a girl?")
    playerGender = io.read()
end
于 2018-05-20T08:08:01.053 回答