Esercizi [C]

binomio1
Ho questi esercizi teorici che mi fanno tribulare.
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
edge1
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.

edge1
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.

binomio1
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?

edge1
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
}

binomio1
tutto più chiaro adesso grazie

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.