【发布时间】:2020-07-05 07:55:53
【问题描述】:
所以我是 C++ 新手,我正在学习一个 pdf 教程,该教程让我开始学习基本知识。我正在编写一个简单的案例程序,我遇到了一些奇怪的事情。
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
enum string_feeling {
eGood,
eBad,
eOk,
};
string_feeling hashit(string const& feeling) {
if (feeling == "Good" || feeling == "good" || feeling == "GOOD") {
return eGood;
}
if (feeling == "Bad" || feeling == "bad" || feeling == "BAD") {
return eBad;
}
if (feeling == "Ok" || feeling == "ok" || feeling == "OK") {
return eOk;
}
else cout << "";
}
int main() {
string username;
cout << "Hello! Please enter your first name here: \n";
cin >> username;
cout << "Hello, " << username << "!\n";
cout << "How are you today? ";
string feeling;
cin >> feeling;
cout << endl;
switch (hashit(feeling)) {
case eGood:
cout << "That's great!";
break;
case eBad:
cout << "I hope you are happy soon!";
break;
case eOk:
cout << "That's good.";
break;
default:
cout << "Ok.";
}
}
每当我在“if (feeling == ok)”之后没有“else”时,将永远不会调用默认案例,如果我输入随机的内容,它会给我 eGood 案例中的文本。我想知道为什么会发生这种情况,因为我正在学习 C++,所以我不想在我把 else 语句放在那里之后不知道为什么它会起作用。所以,如果有人可以向我解释这一点,那就太好了!抱歉我的语法不好。
【问题讨论】:
-
发布有问题的代码,而不是一些您似乎说有效但如果我们根据单独给出的说明编辑它会出现问题的代码。并删除不需要演示问题的代码。
-
无论有没有
else,你的程序都有未定义的行为。您需要在每个可达路径中使用return或throw。 -
如果您不想在
string_feeling中添加新案例,您可以将hashit更改为例如bool hashit(const string & feeling, string_feeling & v)以在不设置v 时返回false feeling 有效,否则设置 v 并返回 true -
注意此代码样式的效率。在这种情况下,这可能并不重要,但有时应该考虑一下。您在每个 if() 语句中进行三个比较,复杂度为 O(length),最坏的情况下,您的函数为 O(9*length)。首先将字符串大写(可以是“gOOd”吗?),最坏的情况是 O(4*length),或者对整个函数进行最坏情况下的 O(length) 模式比较。
标签: c++ switch-statement