猿问

为什么C中的箭头(->)运算符存在?

点(.)运算符用于访问结构的成员,而->C语言中的箭头运算符()用于访问所讨论的指针引用的结构的成员。

指针本身没有可以通过点运算符访问的任何成员(实际上,它只是一个数字,描述了虚拟内存中的位置,因此它没有任何成员)。因此,如果我们将点运算符定义为在指针上使用时自动取消引用该指针(编译器在编译时知道的信息afaik),则不会有歧义。

那么,为什么语言创建者决定通过添加此看似不必要的运算符来使事情变得更复杂?重大的设计决定是什么?


侃侃尔雅
浏览 584回答 3
3回答

蛊毒传说

除了历史原因(良好且已报告的原因)之外,运算符优先级还存在一个小问题:点运算符的优先级高于星形运算符,因此,如果您的结构包含指向结构的指针,则包含指向结构的指针...这两个等效:(*(*(*a).b).c).da->b->c->d但是第二点显然更具可读性。箭头运算符具有最高优先级(只是点),并且从左到右关联。我认为这比使用点运算符同时指向struct和struct更为清晰,因为我们从表达式中知道类型,而不必查看声明,该声明甚至可以位于另一个文件中。

婷婷同学_

C在不使任何歧义方面也做得很好。当然,点可以重载以表示两者的含义,但是箭头可确保程序员知道他正在对指针进行操作,就像编译器不允许您混合使用两种不兼容的类型一样。
随时随地看视频慕课网APP
我要回答