while ((choice != "Wizard") && (choice != "Knight"))
这是唯一有效的
while ((choice != "Wizard") || (choice != "Knight"))
while (choice != "Wizard" || "Knight")
老实说,我不明白为什么使用OR不会起作用,当我将它们分开时它有什么不同。希望有人可以帮忙解释。
答案 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)