Opérateur de flèche contre opérateur de point

Il me semble que l’opérateur de flèche de C (->) est inutile. L’opérateur de points (.) Devrait suffire. Prenez le code suivant:

typedef struct { int member; } my_type; my_type foo; my_type * bar; int val; val = foo.member; val = bar->member; 

Nous voyons que l’opérateur de flèche doit être utilisé pour déréférencer la barre. Cependant, je préférerais écrire

 val = bar.member; 

Il n’y a aucune ambiguïté quant à savoir si j’essaie d’extraire le «membre» d’une structure ou d’un pointeur vers la structure. Mais il est facile d’utiliser le mauvais opérateur, en particulier lors du refactoring de code. (Par exemple, je fais peut-être des opérations complexes sur foo, alors je déplace le code dans une nouvelle fonction et je passe un pointeur sur foo). Je ne pense pas avoir besoin de me soucier de savoir si foo est un pointeur ou non; le compilateur peut s’inquiéter des détails.

Donc la question: ne serait-il pas plus simple d’éliminer -> du langage C?

L’opérateur ‘flèche’ est le sucre syntaxique. bar->member est identique à (*bar).member . Une des raisons de la différence est la maintenabilité. Avec l’opérateur de flèche distinct de l’opérateur de point, il devient beaucoup plus facile de savoir quelles variables sont des pointeurs et lesquelles ne le sont pas. Il pourrait être possible de toujours utiliser . et demandez au compilateur d’essayer de faire la bonne chose, mais je doute que cela simplifie le langage. Faire confiance au compilateur pour interpréter ce que vous vouliez dire au lieu de ce que vous avez littéralement écrit s’avère généralement mauvais.

Non, il ne serait pas plus facile d’éliminer -> du langage, pour la simple raison que des mégatonnes de code devraient être réécrites si c’était le cas. Cependant, on pourrait définir que px est équivalent à p->x si p est un pointeur. Ce serait une modification rétro-compatible car ce code est actuellement illégal.