Control statements • Simple statements • Basic structured statements • Sequence • Selection • Iteration • The jump statement CSI 3125, Control, page 1 Simple statements in imperative languages These are atomic (all or nothing) operations: • assignment, • the empty statement, • a procedure call, • exit, next, break, continue • go to (jump). A block is also an all-or-nothing operation. CSI 3125, Control, page 2 Structured statements Three fundamental mechanisms allow us to group simple statements into structured statements. • sequence, or the compound statement: { S1 S2 } • selection, or the conditional statement: if (C) S1 else S2 • iteration, or the loop statement: while (C) S CSI 3125, Control, page 3 Structured statements (2) All other control structures can be easily derived from the three basic mechanisms. if (C) S if (C) S else {} do S while (C) S while (C) S switch (i) { case C1: S1 … if (i == C1) S1 else … and so on. CSI 3125, Control, page 4 Sequence (1) Languages Algol, Pascal, Ada, ... C, Java, Perl Fortran IV Prolog Mechanisms begin ... end { ... } nothing implicit a :- b, c, d. This means evaluating b, then c, then d. Scheme (begin ...) CSI 3125, Control, page 5 Sequence (2) A compound statement is treated as a simple statement. This is based on an important abstraction principle. The inner structure can be “abstracted away”. single entry, single exit CSI 3125, Control, page 6 Selection The if-else construct is present in almost all programming languages (Prolog is the only major exception). Modula and Ada were the first to have properly bracketed if-then-else, with four keywords around three elements of the selection: if C then S1 else S2 end if Nested selection if-elsif-...-else was also introduced in Ada: if C1 then S1 elsif C2 then S2 ...... elsif Cn then Sn else Sn+1 end if CSI 3125, Control, page 7 Special forms of selection in Fortran IV Computed GO TO. GO TO (label1, ..., labeln), expression Assigned GO TO. ASSIGN labeli TO variable GO TO variable(label1, ..., labeln) CSI 3125, Control, page 8 Special forms of selection (2) The switch statement in C and Java has been probably inspired by computed GO TO. switch(expression){ case const1: S1; ... case constn: Sn; default: Sn+1;} After Si has been executed, control "falls through" to the subsequent case: Si+1 is executed next. Fall-through can be avoided by adding break statements. CSI 3125, Control, page 9 Special forms of selection (3) Case statement in Pascal, Ada and other similar languages: each case is separate, there is no "fall-through". In Ada: case expression is when constantList1 => S1; ... when constantListn => Sn; when others => Sn+1; end case; CSI 3125, Control, page 10 Special forms of selection (4) Selection in Prolog is driven by success and failure, not by the true-false opposition. Selection is implicit in backtracking: if you succeed, stop; if not, try another choice . union( [Elem | S1], S2, S1_S2 ) member( Elem, S2 ), union( S1, S2, S1_S2 ). :- union( [Elem | S1], S2, [Elem | S1_S2] ) \+ member( Elem, S2 ), union( S1, S2, S1_S2 ). :- union( [], S2, S2 ). CSI 3125, Control, page 11 Graphical representation flowgraphs — flow diagrams — flowcharts if–then–else Y S1 C N S2 if–then Y C N S CSI 3125, Control, page 12 Graphical representation (2) The abstraction principle: if ( C ) S1 else S2 is a simple statement. Y S1 C N S2 Single entry, single exit CSI 3125, Control, page 13 Graphical representation (3) if–then–elsif-…elsif-then-else C1 Y N C2 Y S1 S2 N C3 Y S3 … N Cn Y Sn Sn+1 CSI 3125, Control, page 14 Graphical representation (4) case e of v1: S1; ... else Sn+1 end e=v1 Y N e=v2 Y S1 S2 N e=v3 Y S3 … N e=vn Y Sn Sn+1 CSI 3125, Control, page 15 Iteration Variations: pretest iteration or posttest iteration. while C do S Pascal repeat S until C while (C) S Java do S while (C) while C loop S end loop; Ada (no posttest iteration) CSI 3125, Control, page 16 Iteration (2) In Ada, the prefix while C is an extension of the basic iterative statement: loop S end loop; Another prefix: for i in range The bare loop statement must be stopped from inside the loop. Forced exit closes the nearest iteration: exit; unconditional exit when C; CSI 3125, Control, page 17 Iteration (3) The while prefix is an abbreviation. The construction while C loop S end loop; is equivalent to loop exit when not C; S end loop; CSI 3125, Control, page 18 Example: use of exit SUM := 0; SUM := 0; get(X); loop while X /= 0 loop get(X); SUM := SUM + X; exit when X = 0; get(X); SUM := SUM + X; end loop; end loop; Simpler, more intuitive Condition reversed, get(X) appears twice CSI 3125, Control, page 19 Graphical representation while-do repeat-until repeat-until S Y S C N Y S N C Y ¬C N S CSI 3125, Control, page 20 Graphical representation (2) loop - exit - end loop S1 C Y N S2 CSI 3125, Control, page 21 for loops For-loops ("counter-controlled") are historically earlier and less general than condition-controlled iterative structures. DO 1000 var = lo, hi Fortran IV ... 1000 CONTINUE DO label var = lo, hi, incr for var := expr do S Algol 60 for var := low step incr until high do S for var := expr while C do S Iterators can be combined: for i := 0, i+1 while i ≤ n do S(i) CSI 3125, Control, page 22 for loops (2) for var in range loop S end loop; Ada for var in reverse range loop S end loop; for (e1; e2; e3) S C, Java, Perl (enough said J) What is this? for (;;) S CSI 3125, Control, page 23 for loops 32) Iteration in Prolog and in Scheme is expressed by recursion. The same, of course, is possible in most other typical languages. CSI 3125, Control, page 24 Jump (the goto statement) Unconstrained transfer of control is the only mechanism available in low-level languages — but they are very general. One-branch selection and goto allow us to express all other control structures. The jump mechanism is dangerous, may hurt readability, and should be avoided — advanced control structures work well for all typical and for most less typical uses. CSI 3125, Control, page 25 Jump (the goto statemen)t (2) Some languages restrict goto (do not allow jumping inside an iteration or selection) and make it hard to use. Ada makes labels visible from far away (so that your boss can see it!).: SUM := 0; loop get(X); if X = 0 then goto DONE; end if; SUM := SUM + X; end loop; <<DONE>> put(SUM); goto may leave “unfinished business” — active control structures that must be "folded" at once. CSI 3125, Control, page 26