箭头操作员与点操作员

时间:2012-04-05 21:36:58

标签: c pointers structure

在我看来,C的箭头操作符( - >)是不必要的。点运算符(。)应该足够了。请使用以下代码:

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

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

我们看到箭头操作符必须用于取消引用栏。但是,我更愿意写

val = bar.member;

对于我是否试图从结构或指针结构中拉出“成员”,没有任何歧义。但是使用错误的运算符很容易,尤其是在重构代码时。 (例如,也许我正在foo上做一些复杂的操作,所以我将代码移动到一个新函数并将指针传递给foo)。我认为我不需要关心foo是否是指针;编译器可以担心细节。

所以问题是:消除它是不是更简单 - >来自C语言?

2 个答案:

答案 0 :(得分:50)

'箭头'运算符是语法糖。 bar->member(*bar).member相同。差异的一个原因是可维护性。使用与点运算符不同的箭头运算符,可以更容易地跟踪哪些变量是指针而哪些不是。有可能总是使用.并让编译器尝试做正确的事情,但我怀疑这会使语言更简单。信任编译器解释你的意味着什么而不是你字面写的通常结果很糟糕。

答案 1 :(得分:6)

不,它会更容易从语言中消除->,原因很简单,如果需要重写大吨数的代码。但是,如果p.x是指针,则可以定义p->x等同于p。这将是一个向后兼容的更改,因为该代码目前是非法的。