Оператор стрелок против оператора точек
Мне кажется, что оператор С стрелки (- > ) не нужен. Точечный оператор (.) Должен быть достаточным. Возьмите следующий код:
typedef struct {
int member;
} my_type;
my_type foo;
my_type * bar;
int val;
val = foo.member;
val = bar->member;
Мы видим, что оператор стрелки должен использоваться для разметки. Тем не менее, я бы предпочел написать
val = bar.member;
Нет никакой двусмысленности в отношении того, пытаюсь ли я попытаться вытащить элемент из структуры или указателя на структуру. Но легко использовать неправильный оператор, особенно при рефакторинге кода. (Например, возможно, я выполняю сложные операции над foo, поэтому я перехожу код в новую функцию и передаю указатель на foo). Я не думаю, что мне нужно заботиться о том, является ли foo указателем или нет; компилятор может беспокоиться о деталях.
Итак, вопрос: не было бы проще устранить → с языка C?
Ответы
Ответ 1
Оператором "стрелка" является синтаксический сахар. bar->member
совпадает с (*bar).member
. Одной из причин разницы является ремонтопригодность. С оператором стрелки, отличным от оператора точки, становится легче отслеживать, какие переменные являются указателями, а какие нет. Возможно, всегда можно использовать .
и попросить компилятор сделать все правильно, но я сомневаюсь, что это упростит язык. Доверяя компилятору интерпретировать то, что вы имели в виду, вместо того, что вы буквально писали, обычно получается плохо.
Ответ 2
Нет, было бы проще удалить ->
с языка, по той простой причине, что мегатонны кода пришлось бы переписать, если бы это было так. Однако можно определить, что p.x
эквивалентно p->x
, если p
является указателем. Это было бы обратно совместимое изменение, потому что этот код в настоящее время является незаконным.