An amusing piece of code

Root Boy Jim rbj at icst-cmr
Tue Apr 8 07:13:15 AEST 1986


	A, B, C, D, and E are constant expressions, so this is not elegant.
	We would like to use a switch for everything.  Here is a solution:
	
		switch ( thing ) {
	case A:         A-code; break;
	case B:         B-code; if ( 0 ) {
	case C:         C-code; if ( 0 ) {
	case D:         D-code; }}
			BCD-common-code; break;
	case E:         E-code;
		}
	
	Noone here has been able to come up with a reasonable style for this. 
	The example above is not to bad, but if B-code, C-code, etc, are
	complicated, then it starts to get ugly.
	
	Tim Smith       sdcrdcf!ism780c!tim || ima!ism780!tim || ihnp4!cithep!tim
	
Great! You also discovered how to remove all break's from swithces too!
But this method will comlain about non-conditional conditionals as well.
I can recommend several solutions in my order of preference:

	1) Use Goto's. After case B & C, goto BCD-common

	2) Use a flag:
		flag = 0;
		switch(thing) {
		case A: A-code; break;
		case B: B-code; ++flag; break;
		case C: C-code; ++flag; break;
		case D: D-code; ++flag; break;
		case E: E-code; break;
		} if (flag) BCD-code;

	3) If the switch is isolated in it's own function:
		switch(thing) {
		case A: A-code; return;
		case B: B-code; ++flag; break;
		case C: C-code; ++flag; break;
		case D: D-code; ++flag; break;
		case E: E-code; return;
		} BCD-code;
		
	4) Use a switch within a switch
		switch(thing) {
		case A: A-code; break;
		case B: 
		case C: 
		case D: switch(thing) {
			case B: B-code; break;
			case C: C-code; break;
			case D: D-code; break;
			} BCD-code;
			break;
		case E: E-code; break;
		}
	...
	99) Use your solution

	(Root Boy) Jim Cottrell		<rbj at cmr>



More information about the Comp.lang.c mailing list