【问题标题】:Is it possible to write statements after return?是否可以在返回后编写语句?
【发布时间】:2018-10-06 05:07:35
【问题描述】:

return 语句是main 中的最后一个语句还是可以在返回后编写语句?

#include <iostream>

using namespace std;

int main() {

    cout << "Hello" << endl;

    return 0;

    cout << "Bye" << endl;
}

此程序编译但只显示“Hello”。

【问题讨论】:

  • This program compiles but only displays "Hello". 否则我会感到惊讶。仅供参考,这适用于每个功能,而不仅仅是main
  • 那么你希望这个程序做什么?

标签: c++ function main


【解决方案1】:

return后可以写语句吗?

返回后可以写更多的语句,也是有效的。使用 gcc 和 Clang,即使使用 -Wall 开关,我也不会收到警告。但是 Visual Studio 确实为这个程序生成了warning C4702: unreachable code


return statement 终止当前函数,无论是 main 还是其他函数。

即使写入是有效的,但如果return 之后的代码无法访问,编译器可能会按照as-if rule 将其从程序中删除。


您可以有条件地执行return 语句,并且可以有多个return 语句。例如:

int main() {
    bool all_printed{false};
    cout << "Hello" << endl;
    if (all_printed) 
        return 0;
    cout << "Bye" << endl;
    all_printed = true;
    if (all_printed) 
        return 0;
}

或者,您可以在返回之前和之后使用goto 和一些标签,在第二个输出之后执行return 语句:

int main() {

    cout << "Hello" << endl;
    goto print;

return_here:
    return 0;

print:
    cout << "Bye" << endl;
    goto return_here;
}

打印:

Hello
Bye

链接到this answer 的另一个解决方案是在返回后使用 RAII 打印:

struct Bye {
    ~Bye(){ cout << "Bye" << endl; } // destructor will print
};

int main() {
    Bye bye;
    cout << "Hello" << endl;
    return 0; // ~Bye() is called
}

【讨论】:

  • You would need a goto before and after the return 不,他不会。写无用的代码是没用的。
  • @DimChtz 还有什么办法?
  • ..to avoid the return statement 但是你不要回避return语句。您仍然在 return 语句之前打印。
  • @DimChtz 但这并不能真正回答问题或演示如何在函数中任意放置return 语句。它不是关于实现输出的最佳方式,而是关于 return 的工作原理。
  • @DimChtz 答案背后的意义在于展示return 的工作原理。这就是节目的重点。如果它不显示 return 如何(在中间)一个函数,它就不会完成它的工作。
【解决方案2】:

return 语句是 main 中的最后一个语句还是可以在 return 之后编写语句?

执行return 语句的运行时行为与函数无关。无论是main 还是其他一些函数,当执行return 语句时,函数中不会执行任何操作。

可以在return 语句之后编写语句。它们是多余的,因为它们没有被执行。智能编译器甚至可以省略创建与return 语句之后的语句相对应的目标代码。

【讨论】:

    【解决方案3】:

    您可以像示例中那样在 return 之后编写语句,但它们永远不会被执行,并且某些编译器会给您一个警告“无法访问代码”(例如 C4702 in VS2015)。

    要在 return 语句之后执行代码,请参阅Is it possible to execute code after return statement in C++?

    【讨论】:

      【解决方案4】:

      此类代码通常在中间调试阶段生成,同时缩小窗口以捕获错误。它可以工作,但必须由程序员尽快修复。

      【讨论】:

        【解决方案5】:

        在“return”之后有效地使用代码的唯一方法是“return”语句是有条件的。

        if (error) return 0;
        # All code invoked past this point knows error is false
        

        这不是很好的编码风格,您正在创建有 2 种以上退出方式的代码。当您需要对其进行调试时,您会发现设置标志和“我们退出时发生的情况”等等更具挑战性。

        【讨论】:

        • -1 因为早期回报非常好。我会在十个嵌套的ifs 中使用十个returns,或者对那个可怕的ret 变量进行十次修改。
        • @antonio 您的编辑是正确的,但我的回答也是正确的,鉴于他的理解水平,他以前可能没有见过“如果”。
        • @quentin 在某些情况下它非常好,十个嵌套的 if 就是一个很好的例子。一般规则是为了在特定情况下被打破。但是一般规则是应该避免。
        • @DarkMatter 如果你想让它更明确,我建议使用大括号
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 2022-07-20
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多