[COFF] [TUHS] What would early alternatives to C have been?

Dan Cross crossd at gmail.com
Thu Mar 13 04:52:36 AEST 2025


On Tue, Mar 11, 2025 at 10:22 PM Douglas McIlroy
<douglas.mcilroy at dartmouth.edu> wrote:
> Beating a nearly dead horse, I'm shipping this to COFF instead of TUHS
> to which it responds.
>
> >  I find
> >
> >       if (a == b && c == d)
> >
> > perfectly reasonable, but
> >
> >       if ((a == b) && (c == d))
> >
> > to be just silly.
>
> Amusing. IT's odd that no one has mentioned the use of spaces for
> grouping.  When the operands of == are simple, I prefer to vary the
> spacingy spacing. It's less intrusive than extra parentheses and just
> as clear.
>
>         if(a==b && c==d) or
>         if( a==b && c==d )

I definitely agree that judicious use of spacing can aid
comprehension, though it can only be a hint to the programmer, since
it's not semantically meaningful to the compiler. I would fear
something like this, given a, b, and c bool:

    if (b||c && a)  /* ?if (b or c) and a? */

Surely experience and good taste can find a happy medium here.

> K&R usually flank every infix operator with spaces, unlike classical
> mathematical usage, where spacing reflects operator precedence. I
> usually write a*b + c*d, not a * b + c * d, which wantonly flattens
> the parse tree. Here's an example from K&R, where uniform spacing
> hampers intelligibility.
>
>         for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
>                 n = 10 * n + (s[i] - '0');
>
> The "extra" parens in the second line admirably show the intent of the
> subtraction. Other groupings are not so well indicated. I would write
> it like this:
>
>         for(i=0; s[i]>='0' && s[i]<='9'; ++i)
>                  n = 10*n + (s[i]-'0');
>
> (I'll admit that the juxtaposition ]>= is less than perspicuous.)

I personally like this elements of this style, but I have grown fond this:

    for (i = 0; '0' <= s[i] && s[i] <= '9'; ++i)
        n = 10*n + (s[i] - '0');

Which makes the range comparison obvious and mimics what I'd expect to
see in a written formula using standard mathematical notation. Here,
factors are clustered together without space, while terms are
separated by spaces; again closer to the usual conventions for typeset
mathematical formulae.

> Long identifiers constitute a level of grouping that takes precedence
> even over multiplication. So I may flank long identifiers with spaces.
> I suppose then + in a sum of  products might deserve double spaces.
> That's probably a bridge too far, but double spaces after the
> semicolons in the "for" statement above seem justifiable
>
> K&R aren't absolutely rigid about spacing. In the following oddly
> mixed specimen, the first of three operands in a conjunction is spaced
> tightly, but the third is not; I guess they feel about != the way I do
> about long identifiers.
>
>         i<lim-1 && (c = getchar()) != '\n' && c != EOF
>
> The middle conjunct is a challenge. I'd probably squeeze out the
> spaces. But I might instead try to hold it together with outer parens.

Here, I think a single expression is trying to do too much. Assuming
this extracted from a loop, one might write this as:

    while ((c = getchar()) != EOF) {
        if (i < lim - 1 && c != '\n')
            /* do something with c and increment i */
    }

Though I'm a fan of Dijkstra's guarded statements, which can be
simulated in C via conditions and break:

    while ((c = getchar()) != EOF) {
        if (c == '\n' || i >= lim)
            break;
        /* Do something with c and i. */
    }

The question of indentation levels and characters for them comes up
frequently. Here, I use 4 space indent because gmail won't accept tab
literals, which I'm most accustomed to from Unix source code. Nowadays
it doesn't matter that much, but I imagine in the early PDP-11 days it
did, from a space saving perspective on small disks.

I was always struck by how John Lions's commentary formatted the
source code so that the first indentation level was 4 spaces, and
subsequent levels 8 spaces (I think. My copy isn't to hand just now).
I thought that was visually rather appealing.

        - Dan C.


More information about the COFF mailing list