[comp.lang.c] warning: ambiguous assignment: assignment op taken

entropy@pawl.rpi.edu (Math Student from Hell) (03/08/89)

Consider this program:

main()
{
int a=4, b=5;

a=-b;

printf("a=%d\tb=%d.\n",a,b);
}

When I compile this on our Sun 3/50 I get these warning messages:
"foo.c", line 6: warning: ambiguous assignment: assignment op taken
"foo.c", line 6: warning: old-fashioned assignment operator

Which means that the a=-b was interpreted as a =- b and not as a = -b.
And of course the output is:
a=-1	b=5.

And when I compile on out Sequent Balance 21000 (V3.0.14 DYNIX) I get
no warning messages, but the same bogus output anyway.

Now, K&R First Edition (1975?) says that a =- b is obsolete and that the
correct form is a -= b, because it avoids this very ambiguity.

I gave two questions:

1) Why did Sun (and Sequent, and anyone else who did it) write their
   compiler to make the *wrong* decision on this fifteen-year-old
   mistake?  If =- was obsolete in the time of K&R1, why do these
   recent compilers assume that =- is what was intended in the
   ambiguous code?

2) What does the ANSI standard have to say about the old-fashioned
   assignment operators?

Email replies only, please; I will summarize.

 In some sense, a stochastic process can do better; at least it has a chance.
S. M-J. C. Dominus 	entropy@pawl.rpi.EDU	     entropy@rpitsmts (BITnet)

matthew@sunpix.UUCP ( Sun NCAA) (03/10/89)

In article <859@rpi.edu>, entropy@pawl.rpi.edu (Math Student from Hell) writes:

        [complaint about (a=-b;) != (a = -b;) deleted.]

    Think, at the time the compilers you are complaining about where originally
written, the (a =- b;) construct was still a problem. Old code was still being
recompiled to run under new machines, I'd rather have a compiler complain about
a possible problem, than to have it compile without a single complaint and have
the program give me an incorrect result. With or without warning messages, which
is easier to debug?

    By the way, The version of compiler you are using must be pre-4.0. I compiled
your program under SunOS 4.0.1 and it did not complain, and it did give me the
correct answer of:

a=-5    b=5.

    Editing the source to remove the ambiguity ( i.e. change (a=-b;) to (a = -b;))
resolves the problem under SunOS 3.4 and 3.5.  Atleast with the warning messages
you know which lines to edit.


-- 
Matthew Lee Stier                         |
Sun Microsystems ---  RTP, NC  27709-3447 |        "Wisconsin   Escapee"
uucp: { sun, mcnc!rti }!sunpix!matthew    |
phone: (919) 469-8300 fax: (919) 460-8355 |