我有一些代码,例如:
#include <iostream>
#include <string>
int main() {
std::string question;
std::getline(std::cin, question);
if (question == "yes") {
std::cout << "Let's rock and roll!" << std::endl;
return 0; // This line
} if (question == "no") {
std::cout << "Too bad then..." << std::endl;
} else {
std::cout << "What do you mean by that?" << std::endl;
}
return 0;
}
如果我不写注释的
return 0
行并输入yes
,则输出为Let's rock and roll!
后跟What do you mean by that?
。它应该只输出 Let's rock and roll!
。
但我不需要将
return 0
放入 if (question=="no"){...}
块中。如果我输入 no
,输出就是 Too bad then...
。
为什么我在第一种情况下需要
return 0
,而在第二种情况下不需要?
控制流是你的问题:
if(question == "yes"){
std::cout<<"Lets rock and roll!"<<std::endl;
return 0;
}if (question == "no"){
std::cout<<"Too bad then..."<<std::endl;
} else{
std::cout<<"What do you mean by that?"<<std::endl;
}
让我们通过用换行符包围 if/else 语句/块并在运算符周围添加一些空格来更好地格式化它。
if (question == "yes") {
std::cout << "Lets rock and roll!" << std::endl;
return 0;
}
if (question == "no") {
std::cout << "Too bad then..." << std::endl;
}
else {
std::cout << "What do you mean by that?" << std::endl;
}
这是两个不同的条件。第一个被触发不会阻止第二个 if/else 的计算。事实上,如果
question
等于 "yes"
,那么它 不能等于 "no"
,因此必须执行第二个 if/else 中的 else 子句。
通过在第一个条件块中包含
return 0;
,该函数会立即退出,从而跳过其后的所有内容。第二个 if/else 不会被评估,并且 "What do you mean by that?"
永远不会被打印。您可能希望这是一个单一的 if/else。现在将仅执行这些块之一。因为如果前面的条件均不满足,则包含
else
作为包罗万象,因此可以保证执行一个分支。
if (question == "yes") {
std::cout << "Lets rock and roll!" << std::endl;
}
else if (question == "no") {
std::cout << "Too bad then..." << std::endl;
}
else {
std::cout << "What do you mean by that?" << std::endl;
}
另一种完全替代的方法是使用字符串输入到响应的映射。这可以更好地扩展到更多种类的答案。
#include <iostream>
#include <string>
#include <unordered_map>
int main() {
const std::unordered_map<std::string, std::string> map = {
{"yes", "Lets rock and roll!"},
{"no", "Too bad then..."}
};
std::string input;
std::getline(std::cin, input);
try {
std::cout << map.at(input) << '\n';
}
catch (std::out_of_range) {
std::cout << "What do you mean by that?\n";
}
}