J'apprends juste à propos de C.
Je trouve étrange que les créateurs aient choisi l'astérisque ( *
) comme symbole pour les pointeurs plutôt qu'un symbole qui ressemble en fait à un pointeur ( ->
).
Compte tenu de la confusion possible entre le déréférencement et les pointeurs de fonction, existe-t-il une raison historique, voire pratique, d'utiliser l'astérisque?
->
est utilisé dans le langage C comme opérateur de déréférence - lors de l'accès aux champs dans une structure:,struct_pointer->field
qui est l'abréviation de(*struct_pointer).field
.structs
que le déréférencement, ce qui m'a paru étrange. C'est un symbole de pointeur, non? Pourquoi pas (<-
) pour le déréférencement? Suis-je vraiment le seul à penser de cette façon?^
est utilisé et peut être considéré comme une flèche pivotée et lu comme "pointer vers", même sens->
mais plus court.^integer
signifie "pointeur vers un entier" pour la déclaration de type etvar^
signifie "la mémoirevar
pointe vers" pour le déréférencement. La position du symbole est plus logique que C lors de la lecture de gauche à droite, ce qui met toujours après le type et avant le nom de la variable. Pascal utilise également@
pour prendre l'adresse, ce qui est mieux que&
, car@var
c'est "l'adresse à laquelle se trouve var"Réponses:
Tout simplement - parce que B l'a fait.
Du développement du langage C
C'est ça. À ce stade, la question est aussi inintéressante que "pourquoi python 3 utilise-t-il
.
pour appeler une méthode? Pourquoi pas->
?" Eh bien ... parce que Python 2 utilise.
pour appeler une méthode.Il existe rarement une langue à partir de rien. Il a des influences et est basé sur quelque chose qui a précédé.
Alors, pourquoi B n'a-t-il pas utilisé
!
pour déréfrencier un pointeur comme son prédécesseur BCPL?Eh bien, BCPL était un peu verbeux. Au lieu de
&&
ou||
BCPL utilisélogand
etlogor
. En effet, la plupart des claviers ne disposent pas de touches∧
ou∨
et ce n'est pas égal au motNEQV
(voir le manuel de référence BCPL ).B semble avoir été partiellement inspiré pour resserrer la syntaxe plutôt que d'avoir des mots longs pour tous ces opérateurs logiques que les programmeurs ont fait assez fréquemment. Et c'est ainsi
!
que la déréférence est devenue*
ce qui!
pourrait être utilisé pour la négation logique. Notez qu'il y a une différence entre l'*
opérateur unaire et l'*
opérateur binaire (multiplication).Le a
->
été pris pour le sucre syntaxique autour des déréfrences de champstruct_pointer->field
qui est(*struct_pointer).field
D'autres options comme
<-
pourraient créer des analyses ambiguës. Par exemple:Est-ce à lire comme suit:
ou
La création d'un opérateur unaire composé d'un opérateur binaire et d'un autre opérateur unaire risque fort d'avoir des problèmes car le deuxième opérateur unaire peut être un préfixe pour une autre expression.
De plus, il est encore important d'essayer de réduire au minimum les éléments tapés fréquemment. Je détesterais devoir écrire:
Cela devient également difficile à lire.
D'autres personnages auraient pu être possibles (le
@
n'a pas été utilisé avant que l' Objectif C ne s'en soit approprié ). Encore une fois, cela va au cœur de «C utilise*
parce que B l'a fait». Pourquoi B n'a-t-il pas utilisé@
? Eh bien, B n'a pas utilisé tous les personnages. Il n'y avait pas debpp
programme (comparer cpp ) et d'autres caractères étaient disponibles en B (comme celui#
qui a ensuite été utilisé par cpp).Si je peux me permettre de deviner pourquoi - c'est à cause de l'emplacement des clés. D'un manuel sur B :
Notez que
&
c'est shift-7 et*
c'est shift-8. Leur proximité les uns avec les autres a peut-être été une indication pour le programmeur de ce qu'ils font ... mais ce n'est qu'une supposition. Il faudrait demander à Ken Thompson pourquoi ce choix a été fait.Alors voilà. C est ainsi parce que B l'était. B est comme ça parce qu'il voulait changer de la façon dont BCPL était.
la source
@
cela aurait été une autre possibilité.&
et*
). B n'a pas non plus utilisé,#
donc il y avait encore quelques pièces de rechange à ce moment-là ... il y en a aussi$
.Un étudiant m'a demandé si
&
et*
avait été choisi parce qu'ils étaient côte à côte sur le clavier (quelque chose que je n'avais jamais remarqué auparavant). Beaucoup de recherches sur Google m'ont conduit à la documentation B et BCPL, et à ce fil. Cependant, je n'ai pas pu trouver grand chose du tout. Il semblait qu'il y avait beaucoup de raisons pour*
B, mais je n'ai rien trouvé pour&
.Donc, suivant la suggestion de @ MichaelT, j'ai demandé à Ken Thompson:
la source