LWN.net Logo

Grokking convoluted expressions

Grokking convoluted expressions

Posted Mar 17, 2007 12:58 UTC (Sat) by Tet (subscriber, #5433)
In reply to: Grokking convoluted expressions by nix
Parent article: Quotes of the week

I thought everyone knew the rules for operator precedence in C and C-like languages: * and / bind more tightly than + and -, and everything else gets parentheses :-)

(My Google-fu is letting me down, and I can't find the original author of that quote)


(Log in to post comments)

Grokking convoluted expressions

Posted Mar 17, 2007 16:28 UTC (Sat) by nix (subscriber, #2304) [Link]

Yeah, exactly. It really gets confusing when *, ->, [], &, &&, and
arithmetic operators all come and play together.

Grokking convoluted expressions

Posted Mar 17, 2007 18:38 UTC (Sat) by tjc (subscriber, #137) [Link]

It really gets confusing when *, ->, [], [snip] and arithmetic operators all come and play together.
Things would be simpler if *, both as a pointer declarator and as the dereference operator, were postfix (and as a consequence left-to-right associative, with the precedence level incremented by one). It looks weird, but that's mostly because we're not use to seeing it that way. It would be also consistent with the use of [].

For example, the signal function would then be:

void signal(int signum, void handler*(int)) *(int);

...which is a bit easier to untangle than the way it really is:

void (*signal(int signum, void (*handler)(int))) (int);

That would also eliminate the need for ->, since one could just do this:

foo*.bar

...which is consistent with:

foo[0].bar

Of course there's no need for -> anyway, since there's no ambiquity between struct_var.foo and pointer_var.foo -- taking the member of a pointer doesn't make sense, so there's no need for a special operator. The compiler could just take care of this for us.

It's probably too late to change. :-)

Grokking convoluted expressions

Posted Mar 18, 2007 1:53 UTC (Sun) by nix (subscriber, #2304) [Link]

This is of course exactly what Pascal, Ada and other related languages do
with ^. It *does* make more sense than the alternatives, but there's no
chance of changing now :( hell, the precedence rules couldn't be changed
when C was less than three years old (when && and || were introduced...
with the wrong precedences for compatibility reasons), so I doubt a whole
new operator could be introduced now :)

Grokking convoluted expressions

Posted Mar 24, 2007 5:21 UTC (Sat) by RareCactus (guest, #41198) [Link]

Of course there's no need for -> anyway, since there's no ambiquity between struct_var.foo and pointer_var.foo -- taking the member of a pointer doesn't make sense, so there's no need for a special operator. The compiler could just take care of this for us.

It's probably too late to change. :-)

Having the language infer what you mean to do by the context is often a bad idea. If people want to dereference a pointer, they should use the dereference operator, not just silently have the language fill that in.

And yes, the syntax of function pointers is fubar in C.

Copyright © 2013, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds