Newsgroup: it.comp.lang.c
Titolo: baggianata su switch 8P

Ciao a tutti,
scusate per la richiesta forse troppo noob, ma su internet
non trovo niente e l'help di BC3.1 non mi aiuta......
switch (valore)
{
    case 1,2:
    {
        printf("%d",valore); break;
    }
    case 3: break;
}
perche lo switch cosi non funziona?
Grazie
Fabio

 wrote in message
news:fEhY9.771$YL4....@tornado.fastwebnet.it...

perchè dovrebbe? :)
switch (valore)
{
    case 1:
    case 2:
        printf("%d",valore);
    break;
    default:
    break;
}
Sbirish

Fabio wrote:



La notazione e', in generale, sbagliata. Alcuni compilatori (gcc ad es.)
la consentono (es case 1 ... 45 : printf("Pippo\n");) ma non e' standard
(almeno credo, meglio essere prudenti con queste affermazioni finisce che
becco un altro "pirla" :-)).
http://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Case-Ranges.html#Case%20Ranges
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
http://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Case-Ranges.html#Case%20Ranges
In effetti non l'ho trovata indicata con la virgola, ma il concetto di range 
in un costrutto case viene considerata (come parte di una consueditine in 
uso su alcuni compilatori), ma scartata.
E' indicato in questo paragrafo dello stanard (revision del 17 marzo 2001), 
che cito per intero, visto che e' breve:
+++
6.8.4.2 The switch statement
The controlling expression of a *switch* statement may now have any integer 
type, even /unsigned long long/. Floating types were rejected for *switch* 
statements since exact equality in floating-point is not portable.
*case* labels are first converted to the type of the controlling expression 
of the *switch*, then checked for equality with other labels. No two may 
match after conversion.
Case ranges of the form, /lo .. hi/, were seriously considered, but 
ultimately not adopted in the Standard on the grounds that it added no new 
capability, just a problematic coding convenience. The construct seems to 
promise more than it could be mandated to deliver:
- A great deal of code or jump table space might be generated for an 
  innocent-looking case range such as 0 .. 65535.
- The range 'A' .. 'Z' would specify all the integers between the character 
  code for "upper-case-A" and that for "upper-case-Z". In some common 
  character sets this range would include non-alphabetic characters, and in 
  others it might not include all the 40 alphabetic characters, especially 
  in non-English character sets.
No serious consideration was given to making switch more structured, as in 
Pascal, out of fear of invalidating working code.
/long/ expressions and constants in *switch* statements are no longer 
truncated to /int/.
+++
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

  case '1,2': /*ovviamente per i char ci vogliono gli apici*/
Allora vengo subito al punto dicendo che con variabili di tipo char va
scritto cosi:
case '1': case '2':
e non case '1,2':
Secondo, ma non per questo meno importante: NON e' per nulla vero che
funziona solo su variabili char.
Per finire voglio ricordare questa frase:
"Do not say that for which you lack adequate evidence"
by Grice (1975)
Tommy

 funziona solo su variabili char.
Tanto piu' che '1' e' si un "carattere", ma secondo lo standard C e'
rappresentato come un intero (nel mio computer intero 49).
printf("%d\n",sizeof('1')); in C stampa a schermo : 4 (nella maggior parte
dei casi...)
printf("%d\n",sizeof('1')); in C++ stampa a schermo: 1 (visto che in C++ il
discorso cambia...)
Tommy

 funziona solo su variabili char.
Tanto piu' che '1' e' si un "carattere", ma secondo lo standard C e'


 Funziona solo su char !!
Quote preso dal libro linguaggio C di K&R seconda edizione versione italiana
pagina 71:
<QUOTE>
L'istruzione switch e' una struttura di scelta plurima che controlla se
un'espressione assume un valore all'interno di un certo insieme di costanti
intere, e si comporta di conseguenza.
</QUOTE>
COSTANTI INTERE !!!! Come ti ho detto 49 e' una costante intera e '1' pure
(ed su molti computers, ma NON tutti, la stessa costante intera).
Voglio allora riportarti anche questa frase:
"Do not say what you believe to be false"
by Grice (1975)
Tommy

 Funziona solo su char !!
Quote preso dal libro linguaggio C di K&R seconda edizione versione italiana


 ./fuzzychar
2
devono essere i caratteri fuzzy! pero' tende molto piu' al 2 che all'1.
(sarą l'inflazione)
Uno Sbirish stupito dall' ANSI/ISO/TIN C2003

 Tommy
[SNIPPED]
Tommy stai postando doppio.. patcha outlook.
ciau :)

 ciau :)
Grazie per avermelo fatto notare..... E' il mio server della BT tuttavia,
oggi da problemi, a volte il mio computer quando spedisco mi da errore e....
devo ripostare, ma a quanto pare arrivano poi due copie.
Buffo che io ne veda una sola tuttavia.
Grazie ancora, provero' a non ripostare!
Tommy

 uso su alcuni compilatori), ma scartata.
Eppure con gli int la "ficiur" potrebbe essere comoda, con in char
una rogna. Introdurre switchint()? :-)
