Все процессоры, поддерживающие вызовы функций, имеют инструкцию, подобную RET
, для явного возврата из вызываемой функции обратно к коду, который вызвал функцию.Адрес памяти кода, к которому необходимо вернуться после того, как вызов функции уже был сохранен в «хорошо известном месте» (например, в стеке).Инструкция RET
извлечет этот адрес памяти и укажет центральный процессор в правильном месте, чтобы возобновить выполнение кода, который идет после исходного вызова функции.
В c ++ некоторые функции объявлены как "возвращают "определенные значения (как функция main выше), в то время как другие функции никогда не возвращают никаких значений (те, которые объявлены как имеющие возвращаемый тип void).Это ваш выбор, как вы объявляете функции, которые вы пишете.Если тип возвращаемого значения функции void, вам не понадобится явный оператор возврата в вашем коде, , если вы не возвращались преждевременно, как внутри цикла if, else или.Например:
void foo(int x) {
if (x == 0)
return; // premature return to caller
int b = x*2;
// do some more stuff
// and now no need to say return, its done implicitly because we are at function end
}
Однако, когда ваша функция объявлена как имеющая тип возврата, отличный от void (например, int), вы должны иметь явный оператор возврата в функции, даже если вы не преждевременный возврат.
int bar(int y) {
return y*7;
}
, потому что вызывающая сторона ожидает его и может присвоить возвращаемое значение переменной следующим образом:
int z = bar(4);