Синтаксис для разыменования указателя в C (или C ++) - PullRequest
11 голосов
/ 28 апреля 2009

У меня была проверка коллеги в коде, подобном этому, в C (синтаксис # 1):

(*(*(*p_member).p_member).p_member).member

Когда я спросил его, почему он не использовал -> (синтаксис # 2):

p_member->p_member->p_member->member

он стал действительно защищаться, заявив, что синтаксис # 2 более сложен, чем # 1 ... Я закончил тем, что изменил его код, потому что мне пришлось его модифицировать, и я не мог его прочитать, затем он разозлился, что я действительно коснулся его. ..

Какой синтаксис предпочитает SO-сообщество? Оба действительны, но я нахожу синтаксис № 2 более читабельным.

Я настраиваю это на вики сообщества из-за субъективного вопроса.

Ответы [ 11 ]

22 голосов
/ 28 апреля 2009

Технический термин для синтаксиса # 1 - «орехи».

Тем не менее, я немного беспокоюсь о коде, который тоже должен идти косвенно 3 раза.

16 голосов
/ 28 апреля 2009

Я думаю, что ваш коллега либо неопытный, какой-то неофоб, либо просто невежественный. Вы обнаружите, что единодушным выбором является использование синтаксиса ->.

11 голосов
/ 28 апреля 2009

В C ++ я бы определенно использовал ->, потому что -> может быть перегружен.

В C я бы также использовал ->, потому что он намного легче читать, быстрее печатать и меньше подвержен ошибкам (надеюсь, ваш коллега не потеряется в скобках!).

8 голосов
/ 28 апреля 2009

Я печатаю здесь манжету, но я помню, что логика самого существования оператора -> в C была объяснена в 1-м издании K & R как (перефразируя): потому что в противном случае вы бы имели набрать (*p).a из-за необходимого приоритета операторов * и ..

Не использовать -> по назначению - это орехи.

6 голосов
/ 28 апреля 2009

Я открою дверь №2, Монти! Конечно, его сложнее набрать, но это более понятно, чем выяснение того, какие операторы разыменовывают какой указатель.

5 голосов
/ 28 апреля 2009

Вы также можете обсудить понятие «владение кодом» в вашей команде. Ваш коллега не «владеет» кодом, а компания. Следовательно, любой сотрудник компании, по уважительной причине, может его редактировать.

1 голос
/ 29 апреля 2009

Плохой коллега. Сменить коллегу.

1 голос
/ 28 апреля 2009

Второй вариант явно выглядит понятнее. Единственная причина, чтобы предпочесть # 1, - это случай какой-то странной операции * и operator -> перегрузки, когда # 1 действительно отличается от # 2.

1 голос
/ 28 апреля 2009

субъективно, да?

Я тоже возьму №2!

0 голосов
/ 21 июля 2009

У меня был опыт, когда "->" не был правильно реализован в нескольких компиляторах ... так что нормальный (* p) .a с большей вероятностью работал, когда у вас было несколько уровней вложенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...