Title: Expressions and Statements
1Expressions and Statements
2Contents
- Side effects expressions and statements
- Expression notations
- Expression evaluation orders
- Conditional statements
- Loops
- Unstructured statements
3Side Effects
- Expressions and statements represent the most
fundamental computation mechanisms - An expression, in its pure form, returns a value
and produces no side effect - A statement is mainly executed for its side
effect and returns no value
change variable values, do input or output
4Expression Notations
- Operators can be written in infix, postfix, or
prefix notation 3 4 5 3 4 5 3 4 5 - No operator precedence and associativity are
required for postfix and prefix notations - Lisp uses prefix notation
- Postscript and FORTH use postfix notation
5Applicative Order Evaluation
- Applicative order (or strict) evaluation
evaluates operands before operators (3 4) (5
6) - The evaluation order for operands is usually not
specified (3 4) (5 6)
6An Example
int x 1 int f(void) x 1 return
x int p( int a, int b) return a
b main() printf("d\n",p( x, f() ))
return 0
f() produces side effect
order of evaluation matters
7Operators with side effects
- Sometimes expressions are explicitly constructed
with side effects in mind - C is an expression-oriented language. In C,
assignment is an expression, not a statement x
y z - In C, sequence operator is used to combine
several expressions (with side effects) into a
single expression x (y 1, x y, x 1)
8Delayed Evaluation
- The evaluation of an expression can sometimes be
performed without the evaluation of all its
subexpressions. This is called delayed (or
non-strict) evaluation - Short-circuit evaluation of Boolean
expressions true x x true false x x
false if (i lt lastindex ai gt x) if
(p ! NULL p-gtdata x) if (x ! 0 and y
x 0)
9if and case Expressions
- An if-expression always evaluates the
test-expression, but based on that value, only
one of the then-expression or else-expression is
ever evaluated e1 ? e2 e3 - ML has case-expression case e1 of a gt e2
b gt e3 c gt e4
10Referential Transparency
- In the absence of side effects, the order of
evaluation of subexpressions is immaterial to the
final value of the expression - Such expressions share an important property with
mathematical expressions, called referential
transparency - Any two expressions in a program that have the
same value may be substituted for each other
anywhere in the program - Variables would be unknown constants
11Normal Order Evaluation
- Referential transparency allows for a very strong
form of delayed evaluation to be used - Normal order evaluation evaluates its operator
before its operands and each operand is evaluated
only it is needed for the calculation of the
value of the operation
12An Example
int double(int x) return x x int
square(int x) return x x
- square(double(2))
- double(2) double(2)
- (2 2) (2 2)
- 4 (2 2)
- 4 4
- 16
13Normal Order Evaluation
- Normal order evaluation might seem inefficient.
It can be made efficient (2 2) (2 2) - Delayed evaluation does not need special
syntax int if_exp(int x, int y, int z)
if (x) return y else return z
14Normal Order Evaluation
- The presence of side effects can substantially
change the semantics of an expression int
get_int(void) int x
scanf(d, x) return x
square(get_int())
get_int() get_int()
15If statements
if-statement ? if ( expression ) statement
else statement
if-statement ? if expression then statement
else statement end if
if e1 then s1elsif e2 then s2elsif e3 then
s3end if
C
Ada
16Case-Statements
switch (x - 1) case 0 y 0 z 2
break case 2 case 3 case 4 case 5 y 3
z 1 break case 7 case 9 z 10 break
default break
17Case-Statements
case x - 1 is when 0 gt y 0 z 2
when 2 .. 5 gt y 3 z 1 when 7
9 gt z 10 when others gt null end
case
18Guarded If Statements
- Guarded if statement if B1 -gt S1 B2 -gt
S2 Bn -gt Sn fi - If one of the Bis evaluates to true, then Si is
executed. If more than one of the Bis is true,
then one and only one Si is selected for
execution. If none of the Bi is true, then an
error occurs
Nondeterminism
19Loop-Statements
while (e) Sdo S while (e)for (e1 e2 e3) S
20Restrictions on Index Variable of For Loop
- The value of i cannot be changed within the body
of the loop - The value of i is undefined after the loop
terminates - i must be of restricted type and may not be
declared in certain way
21Questions about For Loop
- Are the bounds evaluated only once
- If the lower bound is greater than the upper
bound, is the loop executed at all - Is the value of the index variable undefined even
if an exit or break statement is used to leave
the loop before termination - What translator checks are performed on loop
structure
22Guarded Loops
- Guarded do statement do B1 -gt S1 B2 -gt
S2 Bn -gt Sn od - This statement is repeated until all the Bis are
false. At each step, one of the true Bis is
selected nondeterministically, and Si is executed
23CLU Iterators
numcount proc (s string) returns (int)
count int 0 for c char in stringchars(s)
do if numeric (c) then count count
1 end end return (count) end
numcount
24CLU Iterators
stringchars iter (s string) yields (char)
index int 1 limit int stringsize(s)
while index lt limit do yield
(stringfetch(s, index)) index index 1
end end stringchars
25The goto Controversy
- Bohm and Jacopini (1966) demonstrated that every
possible control structure could be expressed
using structured control constructs, i.e., gotos
are unnecessary - Dijkstra (1968) argued that the use of gotos was
damaging in many ways - Rubin (1987) argued that the use of gotos was
justified in certain cases
26Labeled Break in Java
if (ok) while (more)
while (!found) if (disaster)
goto 99 99
ok_break if (ok) while (more)
while (!found) if
(disaster) break ok_break