Linguaggio c
void f1( int *a, int **b)
{
int i =0;
for( i=0; i<*a; i+=2) **b+=(*a)++;
}
Mi spiegate come posso capite cosa restituisce?
Grazie mille !
{
int i =0;
for( i=0; i<*a; i+=2) **b+=(*a)++;
}
Mi spiegate come posso capite cosa restituisce?
Grazie mille !
Risposte
a è un puntatore a intero. Il ciclo for itera fintantoché i è minore del valore puntato da a (i < *a), incrementando i di 2 ad ogni iterazione.
b è un puntatore a puntatore a intero. Nel corpo del ciclo, si accede all'intero (doppiamente) puntato e gli si aggiunge il valore puntato da a, che viene poi incrementato di 1 (**b = (a)++).
In generale, l'operatore ++ postfisso restituisce il valore corrente e poi lo incrementa, mentre l'operatore ++ prefisso fa il contrario:
Ad esempio, se a punta all'intero 3 e b punta ad puntatore a 8:
In sostanza, sia *a che i aumentano di valore ad ogni iterazione, ma i aumenta più velocemente, quindi prima o poi supera *a e il ciclo termina.
b è un puntatore a puntatore a intero. Nel corpo del ciclo, si accede all'intero (doppiamente) puntato e gli si aggiunge il valore puntato da a, che viene poi incrementato di 1 (**b = (a)++).
In generale, l'operatore ++ postfisso restituisce il valore corrente e poi lo incrementa, mentre l'operatore ++ prefisso fa il contrario:
int a = 4; int b = a++; // Ora b = 4, // a = 5 int c = ++a; // Ora c = 6, // a = 6
Ad esempio, se a punta all'intero 3 e b punta ad puntatore a 8:
int a0 = 3, b0 = 8; int * a = & a0; int * b1 = & b0; int ** b = & b1; f1(a, b);
// i = 0; i < *a = 0 < 3 sì **b += (*a)++ = 8 += 3 // b = 11, a = 4 // i = 2; i < *a = 2 < 4 sì **b += (*a)++ = 11 += 4 // b = 15, a = 5 // i = 4; i < *a = 4 < 5 sì **b += (*a)++ = 15 += 5 // b = 20, a = 6 // i = 6; i < *a = 6 < 6 no esce dal ciclo // Alla fine // a0 = 6 // b0 = 20
In sostanza, sia *a che i aumentano di valore ad ogni iterazione, ma i aumenta più velocemente, quindi prima o poi supera *a e il ciclo termina.
void f1( int *a, int **b) { int i =0; for( i=0; i<*a; i+=2) **b+=(*a)++; }
Ora che Claudio ti ha spiegato il codice, vediamo di darne una analisi approfondita.
Se \({}^*a < 0\) allora \(i > {}^*a\) e quindi il codice non fa nulla.
Se \({}^*a = 0\) allora il ciclo viene eseguito una sola volta, \({}^*a\) viene cambiato a \(1\) e \({}^{**}b\) non cambia (leggi il messaggio di Claudio su perché).
Se \({}^*a = n > 0\) allora all'inizio del programma \({}^*a-i = n\). Questa differenza decresce di \(1\) ogni ripetizione, infatti \(i\) incrementa di \(2\) e \({}^*a\) di \(1\). Il ciclo finisce quando \({}^*a-i = 0\) cioè dopo \(n\) ripetizioni. \({}^*a\) sarà grande \(n + n = 2n = i\). E \({}^{**}b\)? Beh lui sarà:
\begin{align} {}^{**}b &= b_0 + \sum_{k=n}^{2n-1} k \\
&= b_0 + n^2 + \sum_{k=1}^{n-1} k \\
&= b_0 + n^2 + \frac{n(n-1)}{2} \\
&= b_0 + \frac{2n^2 + n^2 - n}{2} \\
&= b_0 + \frac{n(3n -1)}{2}\end{align}
dove \(b_0\) era il suo valore iniziale.
I conti ti tornano, qualche dubbio?
i conti tornano grazie mille..