Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - cosa fa il compilatore con questi codici?
Forum - C/C++ - cosa fa il compilatore con questi codici?

Avatar
simovik90 (Normal User)
Newbie


Messaggi: 1
Iscritto: 08/11/2011

Segnala al moderatore
Postato alle 14:31
Martedì, 08/11/2011
Ciao Ragazzi... sono nuovo del forum e mi sono appena immatricolato alla facoltà di ingegneria informatica. comunque, vorrei sapere, trovandomi davanti a questi codici qua quali operazioni svolge il compilatore per arrivare ad un determinato output:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int f(int a,int b)
  4. {
  5.         int r=1;
  6.         while (b>0)
  7.         {
  8.                 r*=a;
  9.                 b--;
  10.         }
  11.         return r;
  12. }
  13.  
  14. int main()
  15. {
  16.         printf ("%i\n",f(2,10));
  17.         printf ("%i\n",f(f(2,10),0));
  18.         printf ("%i\n",f(-1,f(2,10)));
  19.         printf ("%i\n",f(-1,f(2,10)+1));
  20.         printf ("%i\n",f(f(2,10),-1));
  21. }



Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int g(int a,int b)
  4. {
  5.         int s=0;
  6.         while (a>0)
  7.         {
  8.                 s+=a%b;
  9.                 a/=b;
  10.         }
  11.         return s;
  12. }
  13.  
  14. int f(int a,int b)
  15. {
  16.         int r=1;
  17.         while (b>0)
  18.         {
  19.                 r*=a;
  20.                 b--;
  21.         }
  22.         return r;
  23. }
  24.  
  25. int main()
  26. {
  27.         printf ("%i\n",g(10241231,10));
  28.         printf ("%i\n",g(30,5));
  29.         printf ("%i\n",g(30,3));
  30.         printf ("%i\n",g(12,2));
  31.         printf ("%i\n",g(3*f(12,3)+2*f(12,2),12));
  32. }



Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int f(int a,int b)
  4. {
  5.         int s=0;
  6.         while (a>0)
  7.         {
  8.                 s+=a%b;
  9.                 a/=b;
  10.         }
  11.         return s;
  12. }
  13.  
  14. int g(int a,int b)
  15. {
  16.         while (a>=b)
  17.                 a=f(a,b);
  18.         return a;
  19. }
  20.  
  21. int p(int a, int b)
  22. {
  23.         int r=1;
  24.         while (b>0)
  25.         {
  26.                 r*=a;
  27.                 b--;
  28.         }
  29.        
  30.         return r;
  31. }
  32.  
  33. int main()
  34. {
  35.         printf ("%i\n",g(1024,10));
  36.         printf ("%i\n",g(1024,2));
  37.         printf ("%i\n",g(2*p(3,2)+p(3,10),3));
  38.         printf ("%i\n",g(1023,2));
  39. }



sono semplici codici che ho trovato nella rete, tutti funzionanti (provati da me stesso)...

Ultima modifica effettuata da simovik90 il 08/11/2011 alle 14:42
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Up
2
Down
V
Segnala al moderatore
Postato alle 15:40
Martedì, 08/11/2011
Il compilatore prende il sorgente e lo trasforma in un formato che il tuo computer e' in grado di interpretare. Per vedere cosa fa puoi prendere un disassemblatore (IDA?) e aprire il risultante eseguibile. Oppure usa un semplice editor esadecimale.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 14:51
Martedì, 08/11/2011
Li hai provati e cosa non hai capito?

Cosa sai tu di programmazione C?


in pratica non è l output che mi interessa... ma lo svolgimento...come si arriva al risultato..... di programmazione so poco e niente (sopratutto in c) per quello sto scrivendo.... - simovik90 - 08/11/11 18:18
"Come si arriva al risultato" non è molto chiaro come quesito ma se ti è bastata la risposta di Piero, va bene ... - nessuno - 08/11/11 18:20


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Avatar
Nullable (Normal User)
Expert


Messaggi: 217
Iscritto: 12/07/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 18:31
Martedì, 08/11/2011
Vi prego di correggermi nel caso in cui stessi sbagliando : prima di avviare la fase di compilazione viene lanciato il linker che si occupa si "linkare" ovvero di *assemblare* o *unire* le direttive alle funzioni presenti negli header, nel caso in cui una funzione non si trova da nessuna parte allora viene emesso un error dal linker e ti viene anche specificato il tipo di errore con l'eventuale risoluzione. Se la fase di linking è avvenuta correttamente allora questo *pacchetto di funzioni assemblato" viene convertito in una sequenza binaria leggibile dal computer e successivamente eseguita ( da questo scaturisce l'output ).

No, semmai prima parte la compilazione e solo all'ultimo il linking ... - nessuno - 08/11/11 18:36
No, il linker combina i vari object-files, e' la fase successiva alla compilazione. - pierotofy - 08/11/11 18:38
Ok. - Nullable - 08/11/11 18:57


Hai perso.
PM