Brendan Gowing <Brendan.Gowing@cs.tcd.ie> writes:> However, I think that a more intrinsic problem raised by C's "=" and> "==" is the fact that C grammar treats both as operators in an> expression. If this were not the case and "=" was constrained to use> in a statement, then C compilers could spot a lot of the problems that> you are encountering.

I've long felt that the real problem is not that "=" is an operator
and therefore useable in arbitrary expressions. Indeed that is part
of the expressive *power* of C and C++.

Instead, I think much more type safety and syntax checking could have been
had at the cost of a little more text in some places by having a boolean
type as part of the language, and requiring a boolean expression in
the test expression of for, while, if, and do...while constructs.
In this way,

if (a = b)

Would be diagnosed as an invalid construct. If what was really intended
was to assign b to a and test for 0, then it wouild be coded as:

if ((a = b) != 0)

(or)

if ((bool)(a = b))

I am also assuming that a boolean type would be an integer type, of size
typically the same as a char. Whether it could hold nonzero values other
than 1 could be implementation-defined, but a boolean operator would only
return a 0 or a 1.

Obviously it is too late to add that to the language at this point, but
I believe that had it been there from the beginning it would have eliminated
an all too common source of error without crippling the language.

--
det@phlan.sw.stratus.com |
(Dave Toland) |
[Wizard C, the predecessor of Turbo C, had an optional warning whenever
the top-level operator in an if or while was = and it was quite useful.
Being a lazy typist, I took to writing if(!!(a = b)) { ... -John]