虽然不等于陈述和/或差异

时间:2018-05-25 08:59:07

标签: c++

while ((choice != "Wizard") && (choice != "Knight"))

这是唯一有效的

while ((choice != "Wizard") || (choice != "Knight"))

while (choice != "Wizard" || "Knight")

老实说,我不明白为什么使用OR不会起作用,当我将它们分开时它有什么不同。希望有人可以帮忙解释。

2 个答案:

答案 0 :(得分:5)

取字符串"Wizard"

  • 是否与"Wizard"不同?否。
  • "Knight"不同吗?是。

所以“与向导不同,与骑士不同”是假的(它与“向导”没有区别)。但是,“与巫师不同,与骑士不同”是真的(它确实与“骑士”不同)。

对于第三种形式,choice != "Wizard" || "Knight"被解析为(choice != "Wizard") || "Knight""Knight"是一个字符串文字,因此,它在大多数表达式中衰减为非空指针。由于非空,指针将转换为true。所以你有效地问:“choice"Wizard"不同或者是真的。”这当然是真的。

答案 1 :(得分:0)

作为(choice != "...") &&不断增长的链的替代品,您可以创建一个容器来测试,并查看choice是否是该容器的元素。

static const std::unordered_set<std::string> options = {
    "Wizard", 
    "Knight", 
    "Rogue", 
    "Basket Weaver", 
};
while (options.count(choice) == 0)