Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!newstop!sun!ringworld.Eng.Sun.COM!eager From: eager@ringworld.Eng.Sun.COM (Michael J. Eager) Newsgroups: comp.lang.c Subject: Re: switch vs. initializing declarations Keywords: switch Message-ID: <142703@sun.Eng.Sun.COM> Date: 19 Sep 90 02:42:54 GMT References: <1990Sep14.204028.21189@ingres.Ingres.COM> <1990Sep16.005308.8804@chinet.chi.il.us> Sender: news@sun.Eng.Sun.COM Organization: Sun Microsystems, Mt. View, Ca. Lines: 56 In article <1990Sep16.005308.8804@chinet.chi.il.us> john@chinet.chi.il.us (John Mundt) writes: >In article <1990Sep14.204028.21189@ingres.Ingres.COM> jeff@ingres.com (Jeff Anton) writes: >>A few days ago, it occured to me that I didn't have a good feeling >>as to what the following code fragment which seems to be legal C >>means. This is a retorical question and is not real world code, but I >>would like to hear from someone who has a good knowledge of the >>formal C specifications. Please reply to me personally as I don't >>often read comp.lang.c but post to comp.lang.c if you wish. >> >>main(argc, argv) >>int argc; >>char *argv[]; >>{ >> switch (argc) { >> int v = 1; >> >> default: >> v += 5; >> case 1: >> printf("%d\n", v); >> } >> return 0; >>} >> >> >>The ambiguity is whether or not 'v' should be initialized or not. >>All compilers I've tested recognize the declaration but do not >>do the initialization. Some report line 6 statement not reached when >>clearly the statement does have the declaritoy effect.... > >I'm surprised it compiles, but it does. Line 6 is not reached because >it is not within any of the case statements. Therefore, there is no >argument you can give to argc which will reach the "case" of >int v = 1; so it is never executed. Shouldn't really be surprising. The definition of the switch statement is switch () That is any statement. There is no requirement that it be a compound statement with case labels, or anything that looks reasonable. When I (and many others) commented on this to the ANSI committee, the answer was that cleaning up the syntax would break existing code. Or was that existing crud? > >It runs probably because most compilers assign a type of int to >variables and functions not specifically declared. lint >has this to say about the program: > Not quite. C does give a default int declaration for undeclared functions, but it REQUIRES all variables to be defined. The code fragment has a valid declaration for the variable v and it is only reference within the scope in which it is declared.