Ahora estoy aprendiendo sobre C.
Me resulta extraño que los creadores hayan elegido el asterisco ( *
) como símbolo de los punteros en lugar de un símbolo que en realidad se parece a un puntero ( ->
).
Teniendo en cuenta lo confusos que pueden ser la desreferenciación y los punteros de función, ¿hay alguna razón histórica o incluso práctica para usar el asterisco?
->
se está utilizando en el lenguaje C como operador de desreferencia, al acceder a los campos en una estructura:struct_pointer->field
que es la abreviatura de(*struct_pointer).field
.structs
desreferenciación, lo que me pareció extraño. Es un símbolo de puntero, ¿verdad? ¿Por qué no (<-
) para desreferenciar? ¿Soy realmente el único que piensa de esta manera?^
se usa y puede pensarse en una flecha girada y leerse como "apuntar a", el mismo significado->
pero más corto.^integer
significa "puntero al entero" para la declaración de tipo, yvar^
significa "la memoriavar
apunta a" para desreferenciar. La posición del símbolo es más lógica que C cuando se lee de izquierda a derecha, lo que siempre pone después del tipo y antes del nombre de la variable. Pascal también usa@
para tomar direcciones, que es mejor que&
, porque@var
es "la dirección en la que se encuentra var"Respuestas:
Simplemente, porque B lo hizo.
Del desarrollo del lenguaje C
Eso es. En este punto, la pregunta es tan poco interesante como "¿por qué Python 3 usa
.
para llamar a un método? ¿Por qué no->
?" Bueno ... porque Python 2 usa.
para llamar a un método.Rara vez existe un lenguaje de la nada. Tiene influencias y se basa en algo que vino antes.
Entonces, ¿por qué B no utilizó
!
para desreferenciar un puntero como lo hizo su predecesor BCPL?Bueno, BCPL era un poco prolijo. En lugar de
&&
o||
BCPL utilizadologand
ylogor
. Esto se debió a que la mayoría de los teclados no tienen teclas∧
o∨
no y en realidad era la palabraNEQV
(consulte el Manual de referencia de BCPL ).B parece haber sido parcialmente inspirado para ajustar la sintaxis en lugar de tener palabras largas para todos estos operadores lógicos que los programadores hicieron con bastante frecuencia. Y así, la
!
desreferencia se convirtió en*
algo que!
podría usarse para la negación lógica. Tenga en cuenta que hay una diferencia entre el*
operador unario y el*
operador binario (multiplicación).El
->
fue tomado para azúcar sintáctico alrededor de las deserciones de campostruct_pointer->field
que es(*struct_pointer).field
Otras opciones como
<-
podrían crear análisis ambiguos. Por ejemplo:¿Es eso para ser leído como:
o
Es muy probable que crear un operador unario que esté compuesto por un operador binario y otro operador unario tenga problemas, ya que el segundo operador unario puede ser un prefijo para otra expresión.
Además, de nuevo es importante tratar de mantener las cosas que se escriben con frecuencia al mínimo. Me odio a tener que escribir:
Esto también se vuelve difícil de leer.
Otros personajes podrían haber sido posibles (el
@
no se usó hasta que el Objetivo C se lo apropió ). Aunque de nuevo, esto va al núcleo de 'C utiliza*
porque B lo hizo'. ¿Por qué no usó B@
? Bueno, B no usó todos los personajes. No había ningúnbpp
programa (compare cpp ) y otros caracteres estaban disponibles en B (como el#
que luego usó cpp).Si puedo arriesgarme a adivinar por qué, es por dónde están las llaves. De un manual sobre B :
Tenga en cuenta que
&
es shift-7 y*
shift-8. Su proximidad entre sí puede haber sido una pista para el programador sobre lo que hacen ... pero eso es solo una suposición. Uno tendría que preguntarle a Ken Thompson por qué se hizo esa elección.Entonces, ahí lo tienes. C es así porque B era. B es así porque quería cambiar de cómo era BCPL.
fuente
@
que habría sido otra posibilidad.&
y*
). B tampoco lo usó,#
así que hubo algunos repuestos más por entonces ... también hay$
.Un estudiante me preguntó si
&
y me*
eligieron porque estaban uno al lado del otro en el teclado (algo que nunca antes había notado). Muchas búsquedas en Google me llevaron a la documentación de B y BCPL, y a este hilo. Sin embargo, no pude encontrar mucho en absoluto. Parecía que había muchas razones para*
B, pero no pude encontrar nada&
.Entonces, siguiendo la sugerencia de @ MichaelT, le pregunté a Ken Thompson:
fuente