Concepts of Programming Languages

(Sean Pound) #1

340 Chapter 7 Expressions and Assignment Statements


There is a loss of error detection in the C design of the assignment opera-
tion that frequently leads to program errors. In particular, if we type

if (x = y) ...

instead of

if (x == y) ...

which is an easily made mistake, it is not detectable as an error by the com-
piler. Rather than testing a relational expression, the value that is assigned to
x is tested (in this case, it is the value of y that reaches this statement). This is
actually a result of two design decisions: allowing assignment to behave like an
ordinary binary operator and using two very similar operators, = and ==, to
have completely different meanings. This is another example of the safety defi-
ciencies of C and C++ programs. Note that Java and C# allow only boolean
expressions in their if statements, disallowing this problem.

7.7.6 Multiple Assignments


Several recent programming languages, including Perl, Ruby, and Lua, provide
multiple-target, multiple-source assignment statements. For example, in Perl
one can write

($first, $second, $third) = (20, 40, 60);

The semantics is that 20 is assigned to $first, 40 is assigned
to $second, and 60 is assigned to $third. If the values of two
variables must be interchanged, this can be done with a single
assignment, as with

($first, $second) = ($second, $first);

This correctly interchanges the values of $first and $second,
without the use of a temporary variable (at least one created and
managed by the programmer).
The syntax of the simplest form of Ruby’s multiple assign-
ment is similar to that of Perl, except the left and right sides
are not parenthesized. Also, Ruby includes a few more elaborate
versions of multiple assignment, which are not discussed here.

7.7.7 Assignment in Functional Programming
Languages
All of the identifiers used in pure functional languages and some
of them used in other functional languages are just names of val-
ues. As such, their values never change. For example, in ML,

History Note


The PDP-11 computer, on
which C was first implemented,
has autoincrement and auto-
decrement addressing modes,
which are hardware versions of
the increment and decrement
operators of C when they are
used as array indices. One might
guess from this that the design
of these C operators was based
on the design of the PDP-11
architecture. That guess would
be wrong, however, because
the C operators were inherited
from the B language, which
was designed before the first
PDP-11.
Free download pdf