Esercizi [C]
Ho questi esercizi teorici che mi fanno tribulare.
Il primo è questo
dato il seguente programma:
indicare quale è il valore assunto dalle variabili x e y (dichiarate nel main) prima dell'esecuzione dell'istruzione presente alla linea indicata:
questa è la tabella da riempire
LINEA 1 2 3 4
x
y
Quello che non capisco è, ma alla linea 1 la x vale 2 o 7, e poi se la y non ha nessun valore come faccio a sapere che valore ha?.
ultima cosa la x nelle funzioni viene incrementata è quella che vale 2 o 7.
Il secondo esercizio è semplice ed è questo
In questo es quello che non riesco a fare è l'ultimo case. In questo caso la x quanto vale? Invece nel case 18 lo switch non genera niente giusto?
Il primo è questo
dato il seguente programma:
int x = 2; int f(int *p) { x++; *p += 5; return x + *p; } int g(int p) { x++; p += 5; return p +x; } int main() { int x, y; x = 7; /*linea 1 */ y = f(&x); /* linea 2*/ y += g(x); /* linea 3 */ return x; /*linea 4*/ }
indicare quale è il valore assunto dalle variabili x e y (dichiarate nel main) prima dell'esecuzione dell'istruzione presente alla linea indicata:
questa è la tabella da riempire
LINEA 1 2 3 4
x
y
Quello che non capisco è, ma alla linea 1 la x vale 2 o 7, e poi se la y non ha nessun valore come faccio a sapere che valore ha?.
ultima cosa la x nelle funzioni viene incrementata è quella che vale 2 o 7.
Il secondo esercizio è semplice ed è questo
int val, x; x = 50; switch(val){ default : { x++; break;} case 15: {x = val % 7;} case 17: {x += 10; break;} case 18: {/*....*/} case 22: {x val/2;break;} case 78: {x = (x<= val);break;} }
In questo es quello che non riesco a fare è l'ultimo case. In questo caso la x quanto vale? Invece nel case 18 lo switch non genera niente giusto?
Risposte
Quello che non capisco è, ma alla linea 1 la x vale 2 o 7, e poi se la y non ha nessun valore come faccio a sapere che valore ha?.
Hai perfettamente ragione infatti metti un bel - (non specificato)!
Per la x alla linea 1 (se si considera ad istruzione non completata) vale ancora - (Sicuramente non 2).
Nota che se variabili locali e globali hanno lo stesso nome alla globale ci si riferisce con ::x.
Alla funzione f gli passa direttamente la x del main che sarà incrementata ,nella g gli passa una copia di x che sarà incrementata la dentro e poi distrutta.
il case 18 è quello del 22 perchè ci va a parare senza break di mezzo.
il case 78 se ci va con x=50 alla fine x vale 1.
il case 78 se ci va con x=50 alla fine x vale 1.
Quindi se ho capito bene, nella funzione f la x vale 7 e poi viene incrementata, e la y vale 20. nella funzione g la x vale 8 e la y vale 23?
Ah scusa ,sono stato affrettato ora ti spiego meglio.
y = f(&x); /* linea 2*/
chiama la funzione f passando l'indirizzo di x variabile locale del main che vale 7.
La funzione :
int f(int *p)
{
x++; //Qui incrementa la x GLOBALE che varrà 3.
*p += 5; //Qui lavora con la x passatole dal main quindi: *p=*p+5=7+5=12
return x + *p; //Qui ritorna 12+3 Quindi 15
}
y = f(&x); /* linea 2*/
chiama la funzione f passando l'indirizzo di x variabile locale del main che vale 7.
La funzione :
int f(int *p)
{
x++; //Qui incrementa la x GLOBALE che varrà 3.
*p += 5; //Qui lavora con la x passatole dal main quindi: *p=*p+5=7+5=12
return x + *p; //Qui ritorna 12+3 Quindi 15
}
tutto più chiaro adesso grazie