Newsgroup: it.comp.lang.c
Titolo: switch anomalo

Ciao a tutti, da qualche parte ho letto questo switch bizarro che viene
correttamente compilato, ma che secondo me non dovrebbe essere corretto:
    int i=...;
    bool b=...;
    switch (i)
    {
        case 1 : F(1); break;
        if (b)
        {
            case '2' : F(2); break;
            default : F(0); break;
         }
     }
La domanda a questo punto sorge spontanea....cosa succede se
b = 0 e i = 2 ?
Lo switch fa saltare il programma al case 2 senza tener conto della
condizione if (b) ?
Secondo me cio´ non dovrebbe essere permesso da un compilatore.

 Secondo me cio´ non dovrebbe essere permesso da un compilatore.
  Probabilmente, il compilatore non lo accetta senza reagire. Magari
"grida" qualche warning...
	Alla prossima,
		Marco

Grazie per la risposta,
ora mi vado a fare una pausa caffe´ che mi sta fumando il cervello per un
problema di lavoro :)
Mauro

 Secondo me cio´ non dovrebbe essere permesso da un compilatore.
Innanzi tutto posti su it.comp.lang.c, e quindi il linguaggio e' il C;
ma usi una variabile dichiarata di tipo bool e, a meno che tu non
abbia un compilatore che accetti il nuovo standard C99, questo non
dovrebbe essere permesso.
Comunque sia, le "case" di uno switch sono *labels*, e lo switch si
comporta come una immensa serie di "goto"; pensalo in questo modo:
switch(i) {            if (i == 1) goto 1; else if (i == '2') goto 2; else
 case 1: ...              goto default;
 case '2': ...   ===>  1: ...
 default: ...          2: ...
}                      default:
In sostanza lo switch fa deviare il flusso dell'esecuzione in modo
tale che l'if (b) non viene mai eseguito (metti una stampa per
credere).
Se vuoi vedere qualcosa di MOLTO peggio, guardati il Duff's device:
  void send(
    register short *to,
    register short *from,
    register int count
  ) {
    register n = (count+7)/8;
    switch (count%8){
      case 0: do{ *to = *from++;
      case 7:     *to = *from++;
      case 6:     *to = *from++;
      case 5:     *to = *from++;
      case 4:     *to = *from++;
      case 3:     *to = *from++;
      case 2:     *to = *from++;
      case 1:     *to = *from++;
                } while(--n>0);
    }
  }
(spiegazione sotto 
http://www.lysator.liu.se/c/
 ; cerca "Tom Duff"
nella pagina).
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

 svista, viene promossa ad /int/).
Non esistono "costanti carattere" in C; sizeof('2') e sizeof(int)
DEVONO dare lo stesso risultato.  E' in C++ che esiste una "costante
carattere"; ed e' in C++ che sizeof('2') ritorna 1.  provare per
credere, oppure leggere il punto 8.9 della FAQ list di comp.lang.c su
http://www.eskimo.com/~scs/C-faq/top.html
 .


 sizeof(int) DEVONO dare lo stesso risultato.  
<cite>
	Una costante carattere e` una sequenza di uno o piu` caratteri
	racchiusi tra singoli apici (1). 
</cite>
	Alla prossima,
		Marco
(1) Brian W. Kernighan, Dennis M. Ritchie, Il linguaggio C, seconda
edizione, Jackson Libri, 1989

 writes:

... pero' la costante carattere E' un int.  Non deve essere promossa
ad int, perche' gia' e' un int.  E' questo che intendevo dire, forse
male; e se guardi sul K&R2, vedi che e' cosi'.


Secondo me cio´ non dovrebbe essere permesso da un compilatore.
secondo me un compilatore serio COMPILA,
ma ti da un "unreachable code" warning subito
dopo il primo "break"
ciao
Luca

 ... pero' la costante carattere E' un int.  
  Su questo non ci piove. :)
	Alla prossima,
		Marco

svista, viene promossa ad /int/).
Parlare di "costanti carattere" non ha senso in quanto sono
considerate comunque interi.
sizeof( 'A' ) = sizeof ( int ) 

dovrebbe essere permesso.
typedef int      bool ;

Secondo me cio´ non dovrebbe essere permesso da un compilatore.
No.
Lo switch e' implementato tramite salti nel codice, per cui la parte
di if viene ignorata.
Comunque il codice cosi' com'e' non e' corretto a livello di
progettazione.
A parte il fatto che lo stato default non puo' rientrare in una
condizione particolare, perche' perderebbe significato, la condizione
di if deve essere spostata dentro il case '2'.

 progettazione.
  Ulp! Da te non me l'aspettavo un'affermazione simile...
	Alla prossima,
		Marco

  Ulp! Da te non me l'aspettavo un'affermazione simile...
Infatti, sono abituato a codice progettato in modo perfetto ! ;)