Можно ли писать заявления после возврата? - PullRequest
0 голосов
/ 25 апреля 2018

Является ли оператор return последним оператором внутри main или возможно ли писать операторы после возврата?

#include <iostream>

using namespace std;

int main() {

    cout << "Hello" << endl;

    return 0;

    cout << "Bye" << endl;
}

Эта программа компилируется, но отображает только "Hello".

Ответы [ 5 ]

0 голосов
/ 25 апреля 2018

Вы можете написать операторы после возврата, как в вашем примере, но они никогда не будут выполнены, и некоторые компиляторы выдадут вам предупреждение «недоступный код» (например, C4702 в VS2015 ).

Чтобы выполнить код после оператора возврата, см. Можно ли выполнить код после оператора возврата в C ++?

0 голосов
/ 25 апреля 2018

Такой код обычно генерируется на промежуточных этапах отладки, сужая окно для обнаружения ошибки.Это работает, но должно быть исправлено программистом как можно скорее.

0 голосов
/ 25 апреля 2018

является оператором возврата последним оператором внутри main или есть возможность написать операторы после возврата?

Поведение во время выполнения оператора return не зависит от функции.Будь то main или какая-либо другая функция, когда выполняется оператор return, после этого в функции ничего не выполняется.

Можно написать операторы после оператора return.Они излишни, так как они не выполнены.Умный компилятор может даже пропустить создание объектного кода, соответствующего операторам после оператора return.

0 голосов
/ 25 апреля 2018

Единственный способ, которым вы могли бы иметь полезный код после «возврата», - это если условный оператор «возврата» условен.

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

Это не очень хороший стиль кодирования, вы создаете код там, где2+ способа выхода.Когда вам понадобится отладить его, вам будет сложнее поставить флаги и «что случилось, когда мы вышли» и т. Д.

0 голосов
/ 25 апреля 2018

возможно ли писать операторы после возврата?

Можно и допустимо написать больше операторов после возврата.С gcc и Clang я не получаю предупреждения, даже с переключателем -Wall.Но Visual Studio выдает warning C4702: unreachable code для этой программы.


Оператор return завершает текущую функцию, будь то main или другая функция.

Даже если запись действительна, если код после return недоступен, компилятор может исключить его из программы в соответствии с как если бы правилом .


У вас может быть условный оператор 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

Другое решение, связанное с этим ответом , заключается в использовании RAII для печати после возврата:

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

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