3.12 Example 11

  4856 bawrite (bp)
       struct buf *bp;
       {
         register struct buf *rbp;
         rbp = bp;
         rbp->b_flags =| B_ASYNC;
         bwrite (rbp);
       }

The second last statement is interesting because it could have been written as

   rbp->b_flags = rbp->b_flags | B_ASYNC;

In this statement the bit mask “B ASYNC” is “or”ed into “rbp-$>$b_flags”. The symbol “|” is the logical disjunction for arithmetic values.

This is an example of a very useful construction in UNIX, which can save the programmer much labour. If “O” is any binary operator, then

    x = x O a;

where “a” is an expression, can be rewritten more succinctly as

    x =O  a;

A programmer using this construction has to be careful about the placement of blank characters, since

    x =+ 1;

is different from

    x = +1;

What is to be the meaning of

    x =+1;        ?