generalized switch

aglew at ccvaxa.UUCP aglew at ccvaxa.UUCP
Wed Aug 6 10:16:00 AEST 1986


... > Generalized switch

Agreed, a cascade of ifs is the way to implement a generalized
alternative statement in C:
	if( C1 ) 
		S1;
	else if( C2 )
		S2;
	else
		...

However, in a higher level language than C there are many potential
advantages to a generalized switch (I prefer to say alternative)
statement.

If the expressions are complicated, eg. (in my preferred syntax
- the ::s would be blocks `a la Dijkstra if I had them)

	IF C1 AND C2 THEN ...
	:: C1 AND NOT C2 AND C3 THEN ...
	:: NOT C1 AND NOT C2 AND C3 THEN ...
	ELSE ...
	ENDIF

you probably would not want to implement them as a cascade of IFs
- you would probably want to use some sort of tree structure
	if( C1 ) 
		if( C2 ) ...
		else ...
	else if( !C2 && C3 ) ...
	else ...
as the expressions get more complicated so does the tree, obscuring
the original branching at one point nature of the original code.
A compiler that understood a bit about logical expressions could
generate a good tree for you, automatically.

In fact, if you can ascribe probabilities to each of the conditions
or branches, an optimum tree from the point of view of speed can
be easily generated automatically. I apply this Huffman algorithm
myself in my hand coding, when I have to worry about speed.


Also, the generalized alternative is not, strictly speaking, a cascade.
Ie. no two of the alternatives should simultaneously hold, in a 
deterministic language (in an undeterministic language multiple
alternatives may be valid, of which one or more at random may be
taken). In this example
	IF C1 AND C2 THEN ...
	:: C1 AND C3 THEN ...
	ELSE ...
	ENDIF
C2 and C3 should not simultaneously hold if C1, for a deterministic 
language. A compiler can easily generate checks for this.


Anyway, enough of that. Returning to the language I have to work in,
I have found a similar construct useful in C. Coming from an 
engineering background, I am used to working in truth tables -
I like laying out functions
	Inputs		Outputs
	-----------------------
	TTT		S1
	TFT		S2
	F**		S3
In computational geometry I've gone 5 inputs deep (with lots of
don't care conditions). Laying these out as a tree of IFs obscures
the tabular nature of my understanding of the problem, but this
can be remedied with a few #defines in C:

	switch( boolvec(C1,C2,C3) ) {
		case TTT:	S1; break;
		case TFT:	S2; break;
		case Fxx:	S3; break;
	}

OK, folks, tell me I'm ...


Andy "Krazy" Glew. Gould CSD-Urbana.    USEnet:  ihnp4!uiucdcs!ccvaxa!aglew
1101 E. University, Urbana, IL 61801    ARPAnet: aglew at gswd-vms



More information about the Comp.lang.c mailing list