if 语句后跟 return 0

问题描述 投票:0回答:1

我有一些代码,例如:

#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
,而在第二种情况下不需要?

c++ control-flow
1个回答
11
投票

控制流是你的问题:

     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"; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.