code C de l'exercice 4

Bonjour,

Le code template de l'exercice 4 a subi une modification qui ne me semble pas heureuse. En effet, on lit :

for(int _i = 0; _i

D'abord, je ne vois pas l'intérêt d'utiliser ce type de déclaration propre à C99 (moi je travaille en général en C90) mais surtout, je rappelle qu'on n'a pas le droit d'utiliser des identificateurs commençant par un underscore, cf. la Norme C99 :

  • 7.1.3 Reserved identifiers
    (...) All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use. —
    *

Franchement pourquoi ne pas faire simple et déclarer la variable i ... ?

Autre détail moins gênant : pourquoi dans le code-source la variable est-elle déclarée n (en minuscule) et non pas N (en majuscule dans l'énoncé). Vu que les majuscules sont en général réservées pour former les macro-constantes, je trouve que n dans l'énoncé aurait été mieux.

Le C99 est un standard qui a plusieurs années et je pense qu'il est intéressant de l'utiliser. Pour la boucle, cela permet de limiter la portée de la variable. Je trouve ça plus propre et plus clair : on voit au premier coup d'oeil que i appartient à la boucle et qu'il ne pourra en aucun cas être utilisé ailleurs (d'ailleurs, la plupart des langages récents ont adopté un système semblable). Je pense que c'est une bonne pratique.

L'underscore n'aurait pas dû être là, je pense qu'il s'agit d'une erreur lors de la mise à jour.

Concernant la majuscule, nous avons décidé de ne pas utiliser de majuscule dans les identifiants : cette règle sera vraie pour tous les exercices (la règle est intégrée dans le générateur de code). La première raison est que cela sert souvent à définir une constante ou une macro. Ici, ce n'est absolument pas une macro. Pour quelle raison certaines entrées seraient plus "constantes" que d'autres ? n provient de l'entrée standard, tout comme le tableau. Il ne me semble pas pertinent de mettre une majuscule à n et pas au tableau. Peut-être vaudrait-il mieux enlever la majuscule dans l'énoncé aussi (la modification est récente).

L'autre raison, c'est OCaml. Dans ce langage, il est interdit de définir un identifiant commençant par une majuscule (la majuscule est réservée pour les modules et les constructeurs). Il faut dire qu'en OCaml tout est constant par défaut et que la différence de casse n'apporterait presque rien. Par souci de cohérence, nous avons préféré utiliser la même convention dans tous les langages.

L'underscore n'aurait pas dû être là, je pense qu'il s'agit d'une erreur lors de la mise à jour.

Pas vraiment. Certains exercices utilisent des noms de variables qui entraient en conflit avec les variables internes utilisée par le générateur. Pour ne pas avoir à modifier l'énoncé, j'ai pour l'instant modifié les noms de variables propres aux boucles.

Ce problème sera corrigé dans les versions futures du générateur. ;-)

Justement, le 7.1.3 que tu as cité signifie que les identificateurs du type :
_MaVariable
__var
sont interdits. En revanche, l'identificateur "_i" est autorisé..

  • En revanche, l'identificateur "_i" est autorisé..
  • Dans les circonstances du code que je citais, tu as effectivement raison et j'ai parlé un peu vite. Mes excuses donc.

Toutefois, l'identificateur _i n'est autorisé qu'en tant que variable locale. Pour une variable globale (ou pour une définition de fonction par exemple) c'est interdit, cf. le § qui suit celui que j'avais cité:

  • All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.
    *

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.