DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(gawk) Assignment Ops

Info Catalog (gawk) Concatenation (gawk) Expressions (gawk) Increment Ops
 
 Assignment Expressions
 ======================
 
    An "assignment" is an expression that stores a new value into a
 variable.  For example, let's assign the value one to the variable `z':
 
      z = 1
 
    After this expression is executed, the variable `z' has the value
 one.  Whatever old value `z' had before the assignment is forgotten.
 
    Assignments can store string values also.  For example, this would
 store the value `"this food is good"' in the variable `message':
 
      thing = "food"
      predicate = "good"
      message = "this " thing " is " predicate
 
 (This also illustrates string concatenation.)
 
    The `=' sign is called an "assignment operator".  It is the simplest
 assignment operator because the value of the right-hand operand is
 stored unchanged.
 
    Most operators (addition, concatenation, and so on) have no effect
 except to compute a value.  If you ignore the value, you might as well
 not use the operator.  An assignment operator is different; it does
 produce a value, but even if you ignore the value, the assignment still
 makes itself felt through the alteration of the variable.  We call this
 a "side effect".
 
DONTPRINTYET  Variables::); it can also be a field ( Changing the Contents of a
 Field Changing Fields.) or an array element (*note Arrays in `awk':
DONTPRINTYET  Variables::); it can also be a field ( Changing the Contents of a
 Field Changing Fields.) or an array element ( Arrays in `awk'

 Arrays.).  These are all called "lvalues", which means they can appear
 on the left-hand side of an assignment operator.  The right-hand
 operand may be any expression; it produces the new value which the
 assignment stores in the specified variable, field or array element.
 (Such values are called "rvalues").
 
    It is important to note that variables do _not_ have permanent types.
 The type of a variable is simply the type of whatever value it happens
 to hold at the moment.  In the following program fragment, the variable
 `foo' has a numeric value at first, and a string value later on:
 
      foo = 1
      print foo
      foo = "bar"
      print foo
 
 When the second assignment gives `foo' a string value, the fact that it
 previously had a numeric value is forgotten.
 
    String values that do not begin with a digit have a numeric value of
 zero. After executing this code, the value of `foo' is five:
 
      foo = "a string"
      foo = foo + 5
 
 (Note that using a variable as a number and then later as a string can
 be confusing and is poor programming style.  The above examples
 illustrate how `awk' works, _not_ how you should write your own
 programs!)
 
    An assignment is an expression, so it has a value: the same value
 that is assigned.  Thus, `z = 1' as an expression has the value one.
 One consequence of this is that you can write multiple assignments
 together:
 
      x = y = z = 0
 
 stores the value zero in all three variables.  It does this because the
 value of `z = 0', which is zero, is stored into `y', and then the value
 of `y = z = 0', which is zero, is stored into `x'.
 
    You can use an assignment anywhere an expression is called for.  For
 example, it is valid to write `x != (y = 1)' to set `y' to one and then
 test whether `x' equals one.  But this style tends to make programs
 hard to read; except in a one-shot program, you should not use such
 nesting of assignments.
 
    Aside from `=', there are several other assignment operators that do
 arithmetic with the old value of the variable.  For example, the
 operator `+=' computes a new value by adding the right-hand value to
 the old value of the variable.  Thus, the following assignment adds
 five to the value of `foo':
 
      foo += 5
 
 This is equivalent to the following:
 
      foo = foo + 5
 
 Use whichever one makes the meaning of your program clearer.
 
    There are situations where using `+=' (or any assignment operator)
 is _not_ the same as simply repeating the left-hand operand in the
 right-hand expression.  For example:
 
      # Thanks to Pat Rankin for this example
      BEGIN  {
          foo[rand()] += 5
          for (x in foo)
             print x, foo[x]
      
          bar[rand()] = bar[rand()] + 5
          for (x in bar)
             print x, bar[x]
      }
 
 The indices of `bar' are guaranteed to be different, because `rand'
 will return different values each time it is called.  (Arrays and the
 `rand' function haven't been covered yet.   Arrays in `awk'
 Arrays, and see  Numeric Built-in Functions Numeric Functions,
 for more information).  This example illustrates an important fact
 about the assignment operators: the left-hand expression is only
 evaluated _once_.
 
    It is also up to the implementation as to which expression is
 evaluated first, the left-hand one or the right-hand one.  Consider
 this example:
 
      i = 1
      a[i += 2] = i + 1
 
 The value of `a[3]' could be either two or four.
 
    Here is a table of the arithmetic assignment operators.  In each
 case, the right-hand operand is an expression whose value is converted
 to a number.
 
 `LVALUE += INCREMENT'
      Adds INCREMENT to the value of LVALUE to make the new value of
      LVALUE.
 
 `LVALUE -= DECREMENT'
      Subtracts DECREMENT from the value of LVALUE.
 
 `LVALUE *= COEFFICIENT'
      Multiplies the value of LVALUE by COEFFICIENT.
 
 `LVALUE /= DIVISOR'
      Divides the value of LVALUE by DIVISOR.
 
 `LVALUE %= MODULUS'
      Sets LVALUE to its remainder by MODULUS.
 
 `LVALUE ^= POWER'
 `LVALUE **= POWER'
      Raises LVALUE to the power POWER.  (Only the `^=' operator is
      specified by POSIX.)
 
    For maximum portability, do not use the `**=' operator.
 
Info Catalog (gawk) Concatenation (gawk) Expressions (gawk) Increment Ops
automatically generated byinfo2html