53

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

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

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

我们看到必须使用箭头运算符来取消引用 bar。但是,我更愿意写

val = bar.member;

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

所以问题是:从 C 语言中消除 -> 不是更简单吗?

4

2 回答 2

86

“箭头”运算符是语法糖。 bar->member是一样的(*bar).member。造成差异的原因之一是可维护性。箭头运算符与点运算符不同,跟踪哪些变量是指针,哪些不是指针变得容易得多。可能始终使用.并让编译器尝试做正确的事情,但我怀疑这会使语言更简单。相信编译器会解释你的意思而不是你真正写的东西,结果通常很糟糕。

于 2012-04-05T21:43:14.757 回答
8

不,从语言中删除并不容易->,原因很简单,如果是的话,就必须重写大量的代码。但是,可以定义它p.x等效于p->xifp是一个指针。这将是一个向后兼容的更改,因为该代码当前是非法的。

于 2012-04-05T21:41:09.073 回答