On Thursday, 3 September 2015 at 17:15:25 UTC, Enamex wrote:
On Thursday, 3 September 2015 at 16:46:30 UTC, Andrei Alexandrescu wrote:
we should disallow during tokenization the sequence "=", "+", whitespace. Surely it's not a formatting anyone would aim for, but instead a misspelling of +=.

Wasn't the original design for these operators in whichever language started them actually the swapped form? In any case, I'd personally choose to warn against any operator sequence without separating whitespaces if the sequence isn't in fact one operator (like "=!" (non-warn: "= !") vs "!=", and "=&", and a lot others, given operator overloading).

The += operator originally appeared in C, as the =+ operator (K&R, 1/e, p212, "Anachronisms"). Not long afterward, the ambiguity of a=+b became apparent, along with the obvious need to change the language to resolve the problem. The issue was dealt with over several successive releases of the compiler:

(1) =+ operator is available (original compiler)
(2) =+ and += are both available (I'm not sure whether this step existed) (3) =+ and += are both available; =+ produces a deprecation warning (4) += is available; =+ now produces either a warning/error or just changes meaning, not sure which

I don't recall now where I read about that sequence of steps, and a quick, incomplete scan of my library doesn't yield it up so I could be more precise. Nonetheless, that's how the transition happened. The Rationale for the original ANSI C (X3.159-1989) mentions that =op forms have been dropped, and that in a Quiet Change, "expressions of the form x=-3 change meaning with the loss of the old-style assignment operators". Which I suppose implies that the Standard itself doesn't require a warning message, though presumably high-quality compilers would be free to implement one.

K&R C did not contain a unary + operator (K&R, 1/e, p. 37, Section 2.5). It was added by the first ANSI C, "for symmetry with unary -" (K&R, 2/e, p204, Section A7.4.4). "An integral operand undergoes integral promotion."

In terms of compiler quality, we have a long history of compilers generating warning messages for legal but questionable constructions. The first one that comes quickly to mind is GCC complaining about "if(a=b)":

warning: suggest parentheses around assignment used as truth value [-Wparentheses]

The notion here is that a common mistake is handled by:

(a) being warned about, when warnings are enabled (at least, by -Wall in GCC)
(b) having an alternate construction suggested (e.g., "if((a=b))")
(c) having a specific compiler flag to control generation of each such warning

Reply via email to