Frammenti programma in C

Pivot1
Ciao a tutti.
Vorrei un parere in merito a due frammenti di codice in C.

1)Cosa stampa a video?

int i = 0;
switch(i){
case 0: i++;
case 1: i--;
case 2: i += 100;
}
printf("%d\n",i);


quindi, con la prima riga inizializzo la variabile i a 0. Successivamente ho un incremento di 1 e quindi 0+1=1; poi un decremento di 1 quindi 1-1=0 ed in fine un incremento di 100. Quindi il programma stampa 100! Giusto?


2)
int i = 0;
if (i = 1)
printf("la variabile i vale 1");
else
printf("la variabile i vale 0");


il frammento di codice dovrebbe stampare $1$ ; infatti nell'if non compare il segno di uguaglianza i==1, ma i=1 che è un assegnazione.
Se, invece compariva if( i == 1) allora sampava $1$ altrimenti $0$
E' giusto?

Grazie anticipate.

Risposte
codino75
"Pivot":

2)
int i = 0;
if (i = 1)
printf("la variabile i vale 1");
else
printf("la variabile i vale 0");


il frammento di codice dovrebbe stampare $1$ ; infatti nell'if non compare il segno di uguaglianza i==1, ma i=1 che è un assegnazione.
Se, invece compariva if( i == 1) allora sampava $1$ altrimenti $0$
E' giusto?

Grazie anticipate.


non so se e' sintatticamente corretto mettere una assegnazione dentro la condizione dell'if.
anche se fosse possiblie, si dovrebbe capire che valore booleano viene restituito da tale assegnazione.

codino75
"Pivot":

1)Cosa stampa a video?

int i = 0;
switch(i){
case 0: i++;
case 1: i--;
case 2: i += 100;
}
printf("%d\n",i);


quindi, con la prima riga inizializzo la variabile i a 0. Successivamente ho un incremento di 1 e quindi 0+1=1; poi un decremento di 1 quindi 1-1=0 ed in fine un incremento di 100. Quindi il programma stampa 100! Giusto?

.


dai miei vaghissimi ricordi lo switch-case esegue solo una delle istruzioni che ci metti dentro, ed in particolare proprio quella per cui si ha l'uguaglianza di i col numero accanto al case.

Pivot1
Ma ciò che fanno i programmi seconte te è corretto, l'interpretazione che ho dato

codino75
secondo me,
il primo stampa 1
il secondo
o ti da errore in fase di compilazione
oppure stampa "la variabile i vale 1"

n.b.:tuttavia l'uso di mettere l'assegnazione dentro la condizione dell'if, anche se fosse corretto, mi sembrerebbe da evitare (per vari motivi)

Pivot1
Codino75 scusami ma non mi trovo proprio con quello che dici....perchè il primo programma mi dovrebbe stampare 1? Potresti dirmi perchè? Io non mi trovo.
Per il secondo ho inizializzato dentro l'if per rendere piu compatto il codice.

qqwert
Ma hai provato a compilare il codice?
Essenzialmente sono anch'io d'accordo con Codino75, soprattutto per quanto riguarda il codice 2 (per l'1 non avendo mai usato lo switch non ne ho idea :-D )

codino75
devo correggere il tiro:
il primo stampa 0
infatti :
case 0 OK E' VERIFICATO(infatti i vale proprio 0) , quindi i diventa pari ad 1
case 1 OK E' VERIFICATO (infatti i ORA vale proprio 1), quindi i diventa pari a 0
case 2 NON E' VERIFICATO (infatti i vale 0 E NON 2), quindi non fa nulla e si esce dal case con i pari a 0

lorven
Secondo me, le cose stanno così:

1) stampa 100: in assenza di break, vengono eseguite in sequenza tutte le istruzioni successive degli altri casi.

2) stampa 1, in quanto, anche se nell'if non c'è un'espressione logica, per il C true è qualunque cosa diversa da 0.

codino75
"lorven":
Secondo me, le cose stanno così:

1) stampa 100: in assenza di break, vengono eseguite in sequenza tutte le istruzioni successive degli altri casi.



scusa, ma l'istruzione che sta dopo il
'case 2'
, non dovrebbe essere eseguita nel solo caso che i e' proprio uguale a 2 ?

lorven
"codino75":
[quote="lorven"]Secondo me, le cose stanno così:

1) stampa 100: in assenza di break, vengono eseguite in sequenza tutte le istruzioni successive degli altri casi.



scusa, ma l'istruzione che sta dopo il
'case 2'
, non dovrebbe essere eseguita nel solo caso che i e' proprio uguale a 2 ?[/quote]
No, il comportamento dello Switch...Case del C è un po' diverso da quello di altri linguaggi; è stato concepito così perchè sia possibile, ove necessario, eseguire codice comune a più casistiche senza duplicarlo. Se non si vuole che, dopo aver eseguito le istruzioni del case verificato, vengano eseguite in sequenza tutte le altre successive degli altri case, bisogna dare il break.

codino75
ok chiedo scusa a pivot per tutto e ritiro tutto cio' che ho detto.
l'unica cosa che invece non ritiro e' il fatto che secondo me non e' opportuno mettere una assegnazione dentro l'if....
poi ovviamente ognuno fa come vuole.
alex

df2
"Pivot":
Ciao a tutti.
Vorrei un parere in merito a due frammenti di codice in C.

1)Cosa stampa a video?

int i = 0;
switch(i){
case 0: i++; //i=1
case 1: i--; //i=0
case 2: i += 100; //i=100
}
printf("%d\n",i);// printf di 100


quindi, con la prima riga inizializzo la variabile i a 0. Successivamente ho un incremento di 1 e quindi 0+1=1; poi un decremento di 1 quindi 1-1=0 ed in fine un incremento di 100. Quindi il programma stampa 100! Giusto?


2)
int i = 0;
if (i = 1) // errore di sintassi, come già notato, forse hai batutto male, non intendevi ==?
printf("la variabile i vale 1");// se consideriamo l'if con ==, questa istruzione è saltata
else
printf("la variabile i vale 0"); // viene stamapto "la variabile vale 0"




se fra i case ci fosse break verrebbe stampato 1

secondo me è questo il risultato

vict85
"Sergio":
Assolutamente d'accordo con lorven in tutto e per tutto.


Concordo a pieno. In ogni caso, se non ricordo male, una assegnazione “ritorna” il valore assegnato e quindi in questo caso l'if(i=1) equivale alla scritta if(1) che è sempre vera.

P.S: in C non esistono i booleani quindi dire che l'if dovrebbe leggere un valore booleano non ha senso.

codino75
"vict85":


P.S: in C non esistono i booleani quindi dire che l'if dovrebbe leggere un valore booleano non ha senso.


avete demolito tutte le mie certezze informatiche.... :smt089 :smt089 :smt089

Pivot1
Grazie a tutti per le risposte.
Per quanto riguarda il primo frammento di codice, quello con la strutture switch io mi trovo cosi:

La parola chiave switch contiene tra parentesi tonde la variabile di controllo i, precedentemente inizializzata a zaro. Il valore di tele variabile sarà confrontato con ognuna della etichette case.
i++ è un postingremento e quindi significa che il contenuto di i sarà usato nell'espressione e poi incrementato di 1.
i-- è invece un postdecremento e quindi sarà prima usato il valore di i nell'espressione e poi decrementato di 1
infine io mi trovo che il programma stampa a video il valore 99.

Per quanto riguarda il secondo frammento di codice, nel caso invece ci fosse stato if (i = 1) il programma dava errore, giusto? Mentre se compariva if ( i == 1) stampava 0

lorven
"Pivot":
Grazie a tutti per le risposte.
Per quanto riguarda il primo frammento di codice, quello con la strutture switch io mi trovo cosi:

La parola chiave switch contiene tra parentesi tonde la variabile di controllo i, precedentemente inizializzata a zaro. Il valore di tele variabile sarà confrontato con ognuna della etichette case.
i++ è un postingremento e quindi significa che il contenuto di i sarà usato nell'espressione e poi incrementato di 1.
i-- è invece un postdecremento e quindi sarà prima usato il valore di i nell'espressione e poi decrementato di 1
infine io mi trovo che il programma stampa a video il valore 99.

Ribadisco che viene stampato 100, secondo i passaggi già evidenziati da df. Fra l'altro, in quel codice, ++i , i++ produrrebbero gli stessi risultati, così come, naturalmente, --i , i-- . Provato anche eseguendo il codice con Dev-C++.

"Pivot":

Per quanto riguarda il secondo frammento di codice, nel caso invece ci fosse stato if (i = 1) il programma dava errore, giusto? Mentre se compariva if ( i == 1) stampava 0

Chiarisco quanto scritto precedentemente:
if (i = 1)
è corretto per il C ed equivale a:
i=1; 
if i != 0 ...

per cui viene stampato "la variabile i vale 1".
Se ci fosse stato: if (i == 1) , allora i avrebbe avuto ancora valore 0.

vict85
"lorven":

Ribadisco che viene stampato 100, secondo i passaggi già evidenziati da df. Fra l'altro, in quel codice, ++i , i++ produrrebbero gli stessi risultati, così come, naturalmente, --i , i-- . Provato anche eseguendo il codice con Dev-C++.


Per far comprendere ricordo che l'espressione finisce con il ';'. Quindi a = ++i + 17; è diverso da a = i++ + 17; ma se non li metti in una espressione non cambia nulla (per vari motivi il primo è preferibile quando non si vuole incrementare la variabile dopo una espressione).

Pivot1
Bene lorver ora mi trovo. Grazie a tutti alla prossima

Gummitch1
"vict85":
... una assegnazione “ritorna” il valore assegnato ...
Brrr! "restituisce" (in inglese "return" però in inglese ci sono tanti "false friend" :)

vict85
"Gummitch":
[quote="vict85"]... una assegnazione “ritorna” il valore assegnato ...
Brrr! "restituisce" (in inglese "return" però in inglese ci sono tanti "false friend" :)[/quote]

Sul momento non mi veniva il termine corretto... lo sapevo che era brutto e infatti l'ho scritto tra virgolette.

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