Arrow Operator vs. Dot Operator

CPointersStructure

C Problem Overview


It seems to me that C's arrow operator (->) is unnecessary. The dot operator (.) should be sufficient. Take the following code:

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

val = foo.member;
val = bar->member;

We see that the arrow operator must be used to dereference bar. However, I would prefer to write

val = bar.member;

There is no ambiguity as to whether I am trying to pull 'member' from a structure or from a pointer to the structure. But it is easy to use the wrong operator, especially when refactoring code. (For example, maybe I am doing some complex operations on foo, so I move the code into a new function and pass a pointer to foo). I don't think I need to care whether foo is a pointer or not; the compiler can worry about the details.

So the question: wouldn't it be simpler to eliminate -> from the C language?

C Solutions


Solution 1 - C

The 'arrow' operator is syntactic sugar. bar->member is the same as (*bar).member. One reason for the difference is maintainability. With the arrow operator distinct from the dot operator, it becomes much easier to keep track of which variables are pointers and which are not. It might be possible to always use . and have the compiler try to do the right thing, but I doubt that would make the language simpler. Trusting the compiler to interpret what you meant instead of what you literally wrote usually turns out badly.

Solution 2 - C

No, it would not be easier to eliminate -> from the language, for the simple reason that megatons of code would have to be rewritten if it were. However one could define that p.x is equivalent to p->x if p is a pointer. That would be a backwards-compatible change because that code is currently illegal.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionremlineView Question on Stackoverflow
Solution 1 - CbtaView Answer on Stackoverflow
Solution 2 - CceltschkView Answer on Stackoverflow