箭头操作员与点操作员

rem*_*ine 35 c pointers structure

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

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

val = foo.member;
val = bar->member;
Run Code Online (Sandbox Code Playgroud)

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

val = bar.member;
Run Code Online (Sandbox Code Playgroud)

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

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

bta*_*bta 57

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

  • @jpm:C没有类.但是你有一个观点,因为这会引入一个与C++不必要的不​​兼容性(因为你声明可能不会采用这种约定). (4认同)
  • @MaxCoplan 是的,这两种形式仍然是等价的,但是运算符优先级很快会使事情变得非常丑陋且容易出错(`.` 和 `->` 绑定高于 `*`)。`a->b->c` 会变成 `(*(*a).b).c`。你真的不想在多层次的场景中写得很长。 (2认同)

cel*_*chk 7

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

  • 是的,但正如@bta所提到的那样,这将是一个不明智的改变.` - >`有助于确定哪些变量是值,哪些是指针,这反过来可以帮助保持内存管理的可维护性. (3认同)