Domanda strano funzionamento delle funzioni c++

nonsochefaredellavit

Utente Iron
27 Gennaio 2023
1
1
0
2
Ciao,

qualche giorno fa la mia prof di informatica mi ha fatto notare che nel mio codice c++ era presente un errore particolare, che però non interferiva con il funzionamento di esso.

in sostanza ho scritto una funzione intera al posto di void e non avendo messo nessun return, nel main assegnava lo stesso un valore alla variabile che avevo scelto.

non riusciamo proprio a capire perchè non viene segnlato un errore durante la compilazione.

ho riscritto in modo accorciato il pezzo dell'esercizio.

(il compilatore usato è MinGW).

C++:
#include <iostream>

using namespace std;

int qualcosa (int a, int b, int minore)
    {
    
      if (a > b)
        {
          
          minore = b;
          
        }
        else if (a < b)
            {
              
              minore = a;
              
            }
    
    }

int main ()
    {
      int a, b, minore = 0;
    
      cout << "n1 =  ";
      cin >> a;
    
      cout << "n2 =  ";
      cin >> b;
    
      cout << "minore prima della funzione =  " << minore << endl;
    
      minore = qualcosa (a, b, minore);
    
      cout << "minore dopo la funzione =  " << minore;
    
      return 0;
    }
 
C++ è un linguaggio fortemente tipizzato ma non controlla se una funzione restituisce o meno un valore, quindi praticamente è impossibile che ti dia l'errore.

il codice non restituisce niente, per questo "minore" sarà sempre = 0

Così dovrebbe essere corretto
int qualcosa (int a, int b, int minore)
{

if (a > b)
{

minore = b;

}
else if (a < b)
{

minore = a;

}
return minore;
}

questione importante, non scrivere le funzioni in quel modo in quanto è incasinato e il main verrebbe spazzato via, dovresti fare qualcosa del genere

#include <iostream>

using namespace std;

int qualcosa (int a, int b, int minore); //descrizione di cosa fa
int main ()
{
int a, b, minore = 0;

cout << "n1 = ";
cin >> a;

cout << "n2 = ";
cin >> b;

cout << "minore prima della funzione = " << minore << endl;

minore = qualcosa (a, b, minore);

cout << "minore dopo la funzione = " << minore;

return 0;
}


int qualcosa (int a, int b, int minore)
{

if (a > b)
{

minore = b;

}
else if (a < b)
{

minore = a;

}

}

(l' identazione è sparita, ma spero tu abbia capito il concetto)
 
Il compilatore dovrebbe ritornare un warning:

Codice:
/tmp/asd ❯ g++ asd.cpp                                             29s 19:10:13
asd.cpp: In function ‘int qualcosa(int, int, int, int)’:
asd.cpp:25:5: warning: no return statement in function returning non-void [-Wreturn-type]
   25 |     }
      |     ^

Il codice funziona solo per come viene gestita la memoria: la funzione ritorna un "int", quindi `minore` nel main legge i 4 byte più alti dello stack come return value.
Tu non ritorni niente, quindi gli i 4 byte più alti sono gli ultimi i 4 byte degli argomenti che passi.

Se tu modifichi la funzione in questo modo:
C++:
#include <iostream>

using namespace std;

int qualcosa (int a, int b, int minore, int d)
    {

      if (a > b)
        {
          
          minore = b;
      d = b + 100;
          
        }
        else if (a < b)
            {
              
              minore = a;
          d = a + 100;
              
            }
    
    }

int main ()
    {
      int a, b, minore, d = 0;
    
      cout << "n1 =  ";
      cin >> a;
    
      cout << "n2 =  ";
      cin >> b;
    
      cout << "minore prima della funzione =  " << minore << endl;
    
      minore = qualcosa (a, b, minore, d);
    
      cout << "minore dopo la funzione =  " << minore;
    
      return 0;
    }

Vedrai che stampa il numero minore moltiplicato per 100.