这段代码应该从用户的输入中输出正确的颜色。用户的输入存储在数组中。但是,else 语句未执行/工作。
string eyecolor;
string colorcin[4];
void color() {
cout << "I am going to ask you for 4 colors." << endl;
for (int a = 0; a < 4; a++) {
cout << "Color " << a + 1 << ": ";
cin >> colorcin[a];
}
}
void eyes() {
cout << "What color are your eyes? ";
cin >> eyecolor;
if (eyecolor == "blue" || "Blue" || "green" || "Green" || "hazel" ||
"Hazel") {
cout << "Your favorite color is " << colorcin[0] << endl;
} else {
cout << "Your favorite color is " << colorcin[1] << endl;
}
}
int main() {
color();
eyes();
}
这不是比较多个值的方式:
if (eyecolor == "blue" || "Blue" || "green" || "Green" || "hazel" ||
"Hazel") {
这实际上做的是首先将eyecolor
与"blue"
进行比较。 如果这为 false,则在布尔上下文中评估"Blue"
。 因为它是一个字符串常量,所以它衰减到指向其第一个元素的指针,并且由于该指针无法NULL
,因此它的计算结果为 true,因此此表达式将始终为 true。
您需要将eyecolor
与每个可能的值显式比较:
if (eyecolor == "blue" || eyecolor == "Blue" || eyecolor == "green" ||
eyecolor == "Green" || eyecolor == "hazel" || eyecolor == "Hazel") {
haircolor
也是如此.
您没有正确指定布尔表达式。例如,你写道:
if (haircolor == "blond" || "Blond" || "Red" || "red" || "Auburn" || "auburn")
这应该是:
if (haircolor == "blond" || haircolor == "Blond" || haircolor == "Red"
|| haircolor == "red" || haircolor == "Auburn" || haircolor == "auburn")
文字字符数组(如"Blond"(将被隐式转换为布尔 true 值。
你的意思是hair();
函数吗? 它的工作正常 看
Pick a number betweem 1-100: 1
Pick another number between 1-100: 2
I am going to ask you for 4 colors.
Color 1: 1
Color 2: 2
Color 3: 3
Color 4: 4
What color is your hair? blond
Your favorite color is 3
Have a nice day.
在这里,很多答案解释了为什么你的方法在C++中不正确,但还没有人提供解决方案来解决多次重复一个变量的繁琐问题。
话虽如此,我不会详细介绍您的代码中存在错误的细节,相反,我将为您提供我的解决方案,在您需要经常使用此结构的情况下,它会使事情变得容易得多:
template <typename T, std::size_t TSize>
struct AnyOfThis { T values[TSize]; };
template <typename TFirst, typename... TOthers>
auto anyOf(TFirst&& first, TOthers&&... others) {
return AnyOfThis<std::decay_t<TFirst>, 1 + sizeof...(others)>{std::forward<TFirst>(first), std::forward<TOthers>(others)...};
}
template <typename T, std::size_t TSize>
bool operator==(const T value, const AnyOfThis<typename std::decay<T>::type, TSize>& anyOfThis) {
return std::find(std::begin(anyOfThis.values), std::end(anyOfThis.values), value) != std::end(anyOfThis.values);
}
基本上,它从可变参数函数创建一个静态数组。然后还有另一个函数用作比较器,它获取要比较的值并在数组中查找此值。
用例读起来也相当不错:
if (1 == anyOf(1, 2, 3)) {
// do stuff
}
正如你在下面的演示中看到的,使用一个额外的代码糖,你还可以将字符串文字放入anyOf
函数中,它会自动将它们转换为std::string
这样你就可以像这样比较它们:
std::string eyecolor("blue");
if (eyecolor == anyOf("blue", "green", "brown")) {
// do stuff
}
>现场演示