switch vs. initializing declarations

Michael J. Eager eager at ringworld.Eng.Sun.COM
Wed Sep 19 12:42:54 AEST 1990


In article <1990Sep16.005308.8804 at chinet.chi.il.us> john at chinet.chi.il.us (John Mundt) writes:
>In article <1990Sep14.204028.21189 at ingres.Ingres.COM> jeff at 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 (<expr>) <statement>  

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.



More information about the Comp.lang.c mailing list