punto punteros operadores operador lenguaje funciones flecha estructuras direccion con apuntadores c pointers structure

punteros - Operador de flecha contra operador de punto



operadores de direccion en lenguaje c (2)

El operador de ''flecha'' es azúcar sintáctico. bar->member es lo mismo que (*bar).member . Una de las razones de la diferencia es la capacidad de mantenimiento. Con el operador de flecha distinto del operador de punto, es mucho más fácil hacer un seguimiento de qué variables son punteros y cuáles no. Puede ser posible usar siempre . y hacer que el compilador intente hacer lo correcto, pero dudo que eso simplifique el lenguaje. Confiar en el compilador para interpretar lo que quería decir en lugar de lo que literalmente escribió generalmente resulta mal.

Me parece que el operador de flecha de C (->) es innecesario. El operador punto (.) Debería ser suficiente. Toma el siguiente código:

typedef struct { int member; } my_type; my_type foo; my_type * bar; int val; val = foo.member; val = bar->member;

Vemos que el operador de flecha se debe usar para eliminar la referencia de la barra. Sin embargo, preferiría escribir

val = bar.member;

No hay ambigüedad en cuanto a si estoy tratando de sacar ''miembro'' de una estructura o de un puntero a la estructura. Pero es fácil usar el operador incorrecto, especialmente cuando se refabrica el código. (Por ejemplo, tal vez estoy haciendo algunas operaciones complejas en foo, así que muevo el código a una nueva función y paso un puntero a foo). No creo que deba preocuparme si foo es un puntero o no; el compilador puede preocuparse por los detalles.

Entonces la pregunta: ¿no sería más simple eliminar -> del lenguaje C?


No, no sería más fácil eliminar -> del lenguaje, por la simple razón de que las megationes de código tendrían que ser reescritas si lo fueran. Sin embargo, se podría definir que px es equivalente a p->x si p es un puntero. Eso sería un cambio compatible con versiones anteriores porque ese código es actualmente ilegal.