Returnarea în subprograme

În C++ funcțiile pot returna valori, adică pot întoarce un rezultat către locul în care ele au fost apelate în program. Acest principiu ne permite să calculăm o valoare în interiorul unei funcții, pe care să o folosim ulterior în alte expresii și instrucțiuni.

În funcție de tipul de returnare ales la declararea subprogramului, funcția trebuie să returneze un rezultat de tipul respectiv de dată. Doar în cazul tipului void funcția poate să nu returneze nimic.

Tipul de returnare poate fi orice tip valid: int, float, char, bool, long long etc. Returnarea din subprogram se realizează folosind construcția return, urmată de o expresie, sau o valoare.

#include <iostream>
using namespace std;

int Patrat(int x) {
    return x * x;
}

int main() {
    int a;
    cin >> a;
    cout << "Patratul lui " << a << " este " << Patrat(a) << endl;
    return 0;
}
8
Patratul lui 8 este 64

Particularități la returnare

Există câteva aspecte despre returnarea în subprograme, principii pe care le putem folosi în ajutorul nostru pentru a facilita un cod calitativ și simplificarea logicii din funcție.

Oprirea prematură a execuției

La întâlnirea unei instrucțiuni return, execuția subprogramului se încheie în acel punct și se revine în program la locul de unde s-a realizat apelul.

bool numarPrim (int numar) {
    if (numar == 2) return true;
    if (numar & 2 == 0 || numar < 2) return false;
    
    for (int div = 3; div * div < numar; div += 2) {
        if (numar % div == 0)
            return false;
    }
    
    return true;
}

În această implementare comună pentru verificarea proprietății de număr prim, putem trata de la început cazurile particulare, precum un rezultat afirmativ pentru numărul 2, sau de la bun început false pentru un număr par, evitând verificarea tuturor divizorilor.


Folosirea în expresii

Deoarece returnează o valoare, funcțiile pot fi integrate în expresii matematice sau logice:

int Dublu(int x) { 
    return 2 * x; 
}

int main() {
    int a = 3, b = 4;
    int s = Dublu(a) + Dublu(b);  // s = 2*3 + 2*4 = 14
    cout << s;
    
    return 0;
}

Returnarea unei expresii

Pe lângă returnarea unei variabile, sau a unei valori predefinite, funcțiile pot „returna expresii”. În acest caz, programul mai întâi va evalua expresia și va încerca să determine rezultatul său.

Se citesc n numere naturale. Să se afișeze cele care au oglinditul un număr par.

#include <iostream>
using namespace std;

bool oglinditPar(int numar) {
    while (numar > 9) numar /= 10;
    return numar % 2 == 0; // se returneaza valoarea de adevar
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> x;
        if (oglinditPar(x)) cout << x << ' ';
    }

    return 0;
}
5
785 6054 58 683 41
6054 683 41 

Pe lângă o astfel de expresie, o funcție poate returna inclusiv un alt apel de funcție. Acest principiu stă la baza recursivității.