2012-04-05 205 views
23

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

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 utilizar para desremarizar la barra. Sin embargo, preferiría escribir

val = bar.member; 

No hay ninguna ambigüedad en cuanto a si estoy tratando de tirar de '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?

+1

Esta pregunta no encaja bien con nuestro formato de preguntas y respuestas. Esperamos que las respuestas generalmente involucren hechos, referencias o experiencia específica; es probable que esta pregunta solicite opiniones, debates, argumentos, encuestas o debates extensos. – bzlm

+3

Hay miles de millones de líneas de código C en uso en la actualidad. No sería sencillo eliminar nada del lenguaje C. Dicho esto, lo explícito sobre la indirección es A Good Thing. –

+6

Tienes razón, es innecesario. Es azúcar sintáctico para '(* bar) .member'. Por definición, no necesitamos ningún azúcar sintáctico. Por otra parte, tampoco necesitamos _necesitas funciones. podríamos _hacer_ todo con 'goto'. – jpm

Respuesta

3

No, sería no ser más fácil de eliminar -> de la lengua, por la sencilla razón de que megatones de código tendrían que ser reescrito si lo fuera. Sin embargo, uno podría definir que p.x 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.

+3

Sí, pero como @bta menciona, sería un cambio imprudente. '->' ayuda significativamente a determinar qué variables son valores y cuáles son punteros, lo que a su vez puede ayudar a mantener la gestión de la memoria en condiciones de mantenimiento. – jpm

38

El operador '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. Es posible que siempre use . y que el compilador intente hacer lo correcto, pero dudo que eso simplifique el lenguaje. Confiar en el compilador para interpretar lo que significaba en lugar de lo que literalmente escribió generalmente resulta mal.

+0

Sin mencionar las clases que actúan como punteros (que proporcionan operadores '*' y '->'), pero en las cuales '.' también es una operación válida. – jpm

+2

@jpm: C no tiene clases. Sin embargo, tiene sentido en la medida en que esto introduciría una incompatibilidad innecesaria con C++ (que por la razón que usted indica probablemente no adoptaría esa convención). – celtschk

Cuestiones relacionadas