La deuxième innovation qui distingue le plus clairement le C de ses prédécesseurs est cette structure de type plus complète et surtout son expression dans la syntaxe des déclarations... étant donné un objet de n'importe quel type de n'importe quel type, il devrait être possible de décrire un nouvel objet qui en rassemble plusieurs dans un tableau, le rend à partir d'une fonction, ou est un pointeur vers it.... [Ceci] a conduit à une syntaxe de déclaration pour les noms reflétant celle de la syntaxe d'expression dans laquelle les noms apparaissent généralement. Ainsi,
int i, *pi, **ppi;
déclarer un nombre entier, un pointeur vers un nombre entier, un un pointeur vers un pointeur vers un entier. La syntaxe de ces déclarations reflète l'observation que i, *pi, and **ppi
donnent tous un int
type lorsqu'il est utilisé dans une expression.
De même, int f(), *f(), (*f)();
déclarer une fonction retournant un entier, une fonction retournant un pointeur vers un entier, un pointeur vers une fonction retournant un entier. un pointeur vers un entier, un pointeur vers une fonction retournant un entier. int *api[10], (*pai)[10];
déclare un tableau de pointeurs sur des entiers, et un pointeur sur un tableau d'entiers.
Dans tous ces cas, la déclaration d'une variable ressemble à son utilisation dans une expression dont le type est celui nommé en tête de la déclaration .
Un accident de syntaxe a contribué à la complexité perçue de la langue. L'opérateur d'indirection, orthographié * en C, est syntaxiquement un op préfixe unaire préfixe unaire, comme dans BCPL et B. Cela fonctionne bien dans les expressions expressions simples, mais dans les cas plus complexes, les parenthèses sont sont nécessaires pour diriger l'analyse syntaxique. Par exemple, pour distinguer l'indirection par la valeur retournée par une fonction de l'appel d'une fonction désignée par un pointeur, on écrit *fp() and (*pf)()
respectivement. Le style utilisé dans les expressions se retrouve dans les de sorte que les noms peuvent être déclarés
int *fp(); int (*pf)();
Dans des cas plus ornés mais toujours réalistes, les choses s'aggravent : int *(*pfp)();
est un pointeur vers une fonction retournant un pointeur vers un entier.
Il y a deux effets qui se produisent. Le plus important est que C dispose d'un ensemble relativement riche de moyens de décrire les types (comparé, par exemple, à Pascal). Les déclarations dans des langages aussi expressifs comme le C-Algol 68, par exemple-décrivent des objets tout aussi difficiles à difficile à comprendre, simplement parce que les objets eux-mêmes sont complexes. A deuxième effet est dû aux détails de la syntaxe. Les déclarations en C doivent être doivent être lues dans un style "à l'envers" que beaucoup trouvent difficile à comprendre. Sethi [Sethi 81] a observé que de nombreuses déclarations et expressions imbriquées seraient plus simples si l'opérateur d'indirection avait été considéré comme un opérateur postfixe au lieu d'un opérateur préfixe, mais mais il était alors trop tard pour changer.
11 votes
On ne peut pas répondre à cette question, on ne peut que spéculer.
0 votes
Qu'y a-t-il de mal à faire preuve d'une véritable curiosité ?
0 votes
@diggingforfire : Rien, mais ce n'est pas à ça que sert le SO. Essayez Programmeurs.SE pour les questions à débattre.
18 votes
@bmargulies On peut y répondre directement ; le créateur du C a écrit un document expliquant exactement pourquoi il en est ainsi.
4 votes
Une question peut prendre la forme d'une véritable curiosité, non ? En fait, je trouve que la réponse de Crashworks est exactement cela, une réponse directe à ma question. Alors pourquoi cela ne peut être qu'une spéculation ?
0 votes
@ildjarn : dire aux gens d'aller créer leur propre langage implique que je dis "geez c++ sucks who thought of this stupid idea", ce qui n'est guère le cas ici.
3 votes
@ildjarn : Ce n'est pas une discussion, il y a une réponse claire à la question et nous l'avons tous donnée.
1 votes
Il pourrait être judicieux de retirer le
phooehy
et réduire le code à une version simplifiéemain
. J'ai retiréreference
des balises, car la question ne semble pas du tout porter sur les références. Bien que le connexe La question pourrait être : "Pourquoi l'opérateur d'adresse (&) est-il également utilisé pour déclarer une référence ?". Il est également surchargé de manière similaire.0 votes
@diggingforfire : Je n'ai rien dit de tel, donc je ne vois pas où vous voulez en venir.
0 votes
@ildjarn : Je faisais référence au commentaire de Tomalak Geret'kal, pardonnez la confusion.
0 votes
@Stuart : La seule vraie réponse ici est celle qui cite le créateur de la langue ; votre réponse en particulier est purement subjective et les réponses subjectives ne sont pas encouragées sur SO. C'était mon point de vue, et il est toujours valable, en général.
0 votes
Crashworks a donné une réponse beaucoup plus utile, c'est pourquoi j'ai voté en haut. Mais la mienne n'était pas subjective, elle venait du fait que je traînais dans comp.lang.c++ et que j'avais déjà rencontré cette raison auprès de personnes qui en savent plus que moi :) Quoi qu'il en soit, ne vous inquiétez pas.
1 votes
Eh bien, ça dépend... lesquels sont les plus mignons, les chiots ou les chatons ?
1 votes
Celui qui me rapporte le plus, mon pote.