2009-04-28 12 views
10

tuve un cheque colega en código como este en C (sintaxis # 1):Sintaxis para dereferencing un puntero en C (o C++)

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

Cuando le pregunté por qué no usar -> (sintaxis # 2):

p_member->p_member->p_member->member 

se puso muy defensiva que indica que la sintaxis # 2 es más complicado que el # 1 ... acabé cambiando su código porque tuve que modificarlo y no podía leerlo, luego se enojó porque realmente lo toqué ...

Qué sintaxis ¿La comunidad SO lo prefiere? Ambos son válidos, pero encuentro que la sintaxis # 2 es más legible.

Estoy estableciendo esto en la wiki de la comunidad debido a que la pregunta es subjetiva.

+3

¿Está confundiendo la precedencia de * y. en tu primer fragmento? –

+0

En el n. ° 2, también se debe acceder al último elemento, miembro, utilizando -> – Trent

+1

Francamente, ni siquiera lo considero subjetivo. Dada la elección de tres operadores (incluido el()) y uno, puedes adivinar qué elegiría. – ojrac

Respuesta

22

El término técnico para la sintaxis # 1 es "nuts".

Dicho esto, me preocuparía un poco sobre el código que tiene que ser indirecto 3 veces también.

+0

heheh ... indirección se debió a un modelo de dominio representado en C. – paquetp

+0

Piense en utilizar un puntero temporal si necesita hacer esto más de uno: thingie_s * tp; ... tp = p_member-> p_member-> p_member; luego vaya indirectamente una vez a tp. –

+0

Oh sí, claro, por supuesto ... especialmente si lo haces más de una vez. – paquetp

6

Voy a tomar la puerta # 2, Monty! Claro que es más difícil de escribir, pero es más claro que descubrir qué operadores desreferencian qué puntero.

+0

FYI - Monty = Monty Hall de la fama de "Hagamos un trato" –

+0

Espero que esto sea una broma. –

11

En C++ Definitivamente usaría ->, porque -> puede estar sobrecargado.

En C Yo usaría -> también porque es mucho más fácil de leer, más rápido de escribir y menos propenso a errores (¡espero que su colega no se pierda entre paréntesis!).

+4

Creo que la sobrecarga es una gran amenaza aquí. Un iterador funcionará con p-> a o (* p) .a. Use -> porque es mucho más fácil de leer y mucho menos propenso a errores. Recuerde que * (p.a) y (* p) .a son dos cosas diferentes, por lo que debe recordar usar (* p) .a, pero p-> a es agradable y simple. –

+2

En teoría, el operador *() y el operador ->() podrían estar sobrecargados para hacer cosas muy diferentes ... aunque afortunadamente no. – ephemient

+0

-> a menudo está sobrecargado para los punteros inteligentes –

1

subjetiva ¿eh?

¡Voy a tomar el # 2 también!

1

La segunda variante obviamente parece más clara. La única razón para preferir el # 1 es el caso de algún extraño * operador y operador -> sobrecarga cuando el # 1 tiene un efecto realmente diferente al # 2.

+9

y si los operadores se han sobrecargado de modo que tengan efectos "realmente diferentes", el autor de ese código debe arrastrarse hacia atrás y dispararse. – rmeador

+0

la sobrecarga de estos operadores estará prohibida en los estándares de codificación de cualquier proyecto en el que trabaje. –

-1

No 2.

Una vez dicho esto, no ofender a la gente cambiando su código, sobre todo si se trata de una cuestión de estilo. No vale la pena.

+2

Si tengo que averiguar qué dice una sola línea de código, en lugar de leerla y seguir moviéndome, ese es un problema de calidad. Lo cambiaría en un abrir y cerrar de ojos. –

+3

Entonces, ¿cómo puede trabajar con otras personas que tienen diferentes opiniones, qué es legible y qué no? Trabajo con otros 40 desarrolladores (¡e inteligentes!) Y prácticamente todo el mundo tiene su idea de cómo se debe formatear el código y qué es legible. Si pisáramos los unos a los otros de esa manera, trabajar juntos sería un infierno y nunca hubiéramos logrado nada. –

+2

Creo que las normas de codificación tendrían que ser acordadas. Tener una base de código con un millón de estilos de codificación diferentes es una pesadilla propia. – jdizzle

5

Es posible que desee discutir la noción de "propiedad del código" en su equipo. Tu colega no "posee" el código, la empresa sí. Por lo tanto, cualquier persona empleada por la empresa, con buena razón, puede editarla.

+3

La pregunta aquí no es quién posee legalmente el código, sino quién necesita mantener y depurar una parte particular de la base de código. Si es el compañero de trabajo, digo que el código debe verse como a él le gusta, incluso si la mayoría de nosotros prefiere la otra opción. –

+0

Si alguien que lea esto quiere el resto de la historia, comenzó el código, tuve que "integrarlo" (agregarlo al control de código fuente, ponerlo en el proceso adecuado, hacer que ese proceso llame a su función) ... no lo hizo No funciona, así que tuve que terminarlo. – paquetp

+0

En mi libro, si no funcionó, no puede quejarse de que lo cambie. Por supuesto, dado que él prefiere el (* p). construir sobre ->, no estoy sorprendido de que no funcionó. –

16

Creo que su compañero de trabajo no tiene experiencia, es una especie de neófito o simplemente no tiene ni idea. Descubrirá que la elección unánime es usar la sintaxis ->.

+0

Eso es lo que espero ... – paquetp

8

Estoy escribiendo aquí, pero mi recuerdo es que la lógica para la existencia misma del operador -> en C se explicó en la 1ª edición de K & R como (paráfrasis): porque de lo contrario hubieras tiene que escribir (*p).a debido a la necesaria precedencia de los operadores * y ..

Para no utilizar -> para su fin previsto es tuercas.

1

Mal colega. Cambiar colega

0

He tenido experiencias donde "->" no se implementó correctamente en un par de compiladores ...por lo que lo normal (* p) .a era más probable que funcionara cuando tienes múltiples niveles de anidación.