Подтвердить что ты не робот

Оператор стрелок против оператора точек

Мне кажется, что оператор С стрелки (- > ) не нужен. Точечный оператор (.) Должен быть достаточным. Возьмите следующий код:

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?

4b9b3361

Ответ 1

Оператором "стрелка" является синтаксический сахар. bar->member совпадает с (*bar).member. Одной из причин разницы является ремонтопригодность. С оператором стрелки, отличным от оператора точки, становится легче отслеживать, какие переменные являются указателями, а какие нет. Возможно, всегда можно использовать . и попросить компилятор сделать все правильно, но я сомневаюсь, что это упростит язык. Доверяя компилятору интерпретировать то, что вы имели в виду, вместо того, что вы буквально писали, обычно получается плохо.

Ответ 2

Нет, было бы проще удалить -> с языка, по той простой причине, что мегатонны кода пришлось бы переписать, если бы это было так. Однако можно определить, что p.x эквивалентно p->x, если p является указателем. Это было бы обратно совместимое изменение, потому что этот код в настоящее время является незаконным.