【发布时间】:2012-04-19 15:39:11
【问题描述】:
在我看来,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 语言中删除 -> 不是更简单吗?
【问题讨论】:
-
今天有数十亿行 C 代码在使用。从 C 语言中删除任何内容并不容易。也就是说,关于间接的明确性是一件好事。
-
你说得对,没必要。它是
(*bar).member的语法糖。根据定义,我们不需要任何语法糖。再说一次,我们也不需要 函数。我们可以用goto做所有事情。 -
是的,但它似乎是语法糖,它使事情变得更难而不是更容易。另一方面,函数很方便。 :)
-
在 Rust 编程语言中,
.运算符在访问 struct 字段之前根据需要取消引用尽可能多的指针层。它完全符合您在此线程中的要求。