On Mon, 16 Feb 2004, Alexandre Oliva wrote: > On Feb 16, 2004, "John V. Pope" <jpope_rhn@xxxxxxxxx> wrote: > > > The following code is a simple demonstration of the bug and should compile without errors: > > As others have pointed out, the meaning this had with older versions > of GCC is not what you expect: > > > isprint(a[x]) ? b[x] = a[x]: b[x] = '.'; > > this meant: > > (isprint(a[x]) ? (b[x] = a[x]): b[x]) = '.'; > > i.e., it would assign '.' to b[x] regardless of the result. > > That was because, if both branches of a ternary operator were lvalues, > GCC would, as an extension, consider the result of the expression to > be an lvalue as well. Just a technicality: "b[x] = a[x]" is not an lvalue. I think the extension construct was more like this: (flag == set_a) ? a : b = 1 which would set a to 1 if flag == set_a and would set b to 1 otherwise. > Precisely because of coding errors like the one you mention, this > extension was removed, so now you get an error, as you should always > have. And now you know the code is broken and has to be fixed. Amen! -- Matthew Saltzman Clemson University Math Sciences mjs AT clemson DOT edu http://www.math.clemson.edu/~mjs