为什么我的 if else 语句不起作用并从数组中输出正确的索引?

Why is my if else statements not working and outputting the right index from an array?

本文关键字:输出 索引 数组 if 我的 else 语句 不起作用 为什么      更新时间:2023-10-16

这段代码应该从用户的输入中输出正确的颜色。用户的输入存储在数组中。但是,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
}
>现场演示