在C(或C++)中取消引用指针的语法

paq*_*etp 11 c c++ syntax pointers

我有一位同事在C中检查这样的代码(语法#1):

(*(*(*p_member).p_member).p_member).member
Run Code Online (Sandbox Code Playgroud)

当我问他为什么不使用 - >(语法#2)时:

p_member->p_member->p_member->member
Run Code Online (Sandbox Code Playgroud)

他得到了真正的防守,指出语法#2比#1更复杂......我最终改变了他的代码,因为我不得不修改它,不能读它,然后他就疯了,我居然感动呢?

SO社区更喜欢哪种语法?两者都有效,但我发现语法#2更具可读性.

由于问题是主观的,我将此设置为社区维基.

Cha*_*tin 22

语法#1的技术术语是"坚果".

也就是说,我担心一些代码必须间接3次.


i_a*_*orf 16

我认为你的同事要么是没有经验的,要么是某种新的,或者只是简单的"无知".你会发现一致的选择是使用 - >语法.


Edo*_* A. 11

在C++中我肯定会使用 - >,因为 - >可以重载.

在CI中也会使用 - >因为它更容易阅读,更快速的输入和更少的错误(希望你的同事不会迷失在括号中!).

  • 我认为重载是一个红鲱鱼.迭代器将使用p-> a或(*p).a.使用 - >因为它更容易阅读,而且更不容易出错.请记住,*(pa)和(*p).a是两个不同的东西,所以你必须记住使用(*p).a,但是p-> a很简单. (4认同)
  • 从理论上讲,运算符*()和运算符 - >()可能会被重载以完成截然不同的事情......但希望不是这样. (2认同)

RBe*_*eig 8

我在这里打字即兴,但我的记忆是,对的生存逻辑->在C运算符是在K&R的第1版为(意译)解释说:因为否则你必须输入(*p).a必要的因*.运算符的优先级.

不用->于其预期目的的是坚果.


Dan*_*ite 6

我会带走门#2,蒙蒂!当然它更难以打字,但它比找出哪个运算符取消引用哪个指针更清晰.


Col*_*ond 5

您可能还希望在您的团队中讨论"代码所有权"的概念.你的同事并不"拥有"代码,公司也是如此.因此,公司雇用的任何人都有充分理由可以编辑它.

  • 这里的问题不是谁合法拥有代码,而是谁需要维护和调试代码库的特定部分.如果它是同事,我说代码应该看起来像他喜欢的方式,即使我们大多数人更喜欢其他方式. (3认同)