Logo journal du hacker middle
  1. 5
  1.  

  2. 1

    Les exemples avancés comme justificatifs sont quelque peu douteux.

    printf("%d", (5,3) );
    

    On fournit deux nombres entiers pour finalement n’en afficher qu’un seul : ce qui est insensé.

    if( argc > 2 && argv[2][0] == '0' )
        action = 4, color = false;
    

    Le guide complet du langage C (Claude Delannoy) > 11. L’opérateur séquentiel

    Certes, un tel opérateur pourrait théoriquement être utilisé pour réunir plusieurs instructions en une seule. Dans la pratique, ce n’est pas là le principal usage que l’on fera de cet opérateur séquentiel. En revanche, il interviendra fréquemment dans les instructions de choix ou dans les boucles : là où la syntaxe n’a prévu qu’une seule expression, l’opérateur séquentiel permet d’en placer plusieurs, et partant, d’y réaliser plusieurs calculs ou plusieurs actions.

    if (argc > 2 && argv[2][0] == '0') 
      {
        action = 4; color = false;
      }
    

    Clairement, cette portion de code peut être écrite de façon usuelle. L’opérateur séquentiel n’a pas vraiment de sens dans le contexte.

    printf("%d", a<b ? a : b);
    
    if (a < b)
        printf("%d", a);
    else
        printf("%d", b);
    

    On a une écriture plus compacte sauf que initialement le sens du code est inapparent. Ce morceau de code aurait-il une pertinence ? Quelle pertinence aurait-il pu avoir ?

    printf("%d", *(tab+2));
    printf("%d", 2[tab]);
    

    En programmation, les tableaux sont conventionnellement indexés en utilisant la syntaxe tab[i]. L’équivalence est admise car elle a un sens intrinsèque dans la conception du langage C. L’identificateur de tableau tab est converti en un pointeur constant sur le premier élément du tableau : on accède à une structure de donnée.

    printf("%c", "!=~"[is_good]);
    
    // Ou comme on l'a vu :
    printf("%c", is_good["!=~"] ); // Affiche '!' si is_good vaut 0
                                   //         '=' si is_good vaut 1
                                   //         '~' si is_good vaut 2
    

    Pour moi, ce code est totalement incompréhensible (ou vraiment incroyable, avec mes rudiments du C).

    int tab[10] = {[2] = 5};
    

    Au cours de ma lecture du livre « Le guide complet du langage C » de Claude Delannoy, je ne me souviens pas de ce genre de notation (?).

    Édition : Ce genre de notation est apparue à partir de C99. La norme C appelle cela « designated initializer ».

    L’explication paraît fautive puisque c’est peu probable que cela soit toujours identique à int tab[10] = {0, 0, 5}; en termes d’initialisation de tableau. Cela n’est vrai que pour les tableaux d’entiers de classe statique (les tableaux définis dans une fonction sont de classe automatique et ne sont pas initialisés, les valeurs qui n’ont pas été initialisées explicitement sont, de fait, imprévisibles).

    int tab[10]; tab[2] = 5;
    

    Mon niveau n’est pas suffisant pour me faire une idée de ce qui est valide ou pas dans le reste de l’article. Je reste sceptique.

    1. 1

      Bonjour salim.

      Tu omets effectivement pas mal de passages de l’article juste pour critiquer.

      Avant l’exemple :

      printf("%d", (5,3) );
      

      Il est également précisé :

      L’instruction suivante, bien qu’inutile est tout à fait valide :

      En fait, j’ai gardé cette ligne car pour quelqu’un qui vient d’un langage de haut niveau, elle afficherait un tuple ! Elle est ici pour introduire une syntaxe pas un exemple d’utilisation réel.

      Le if est effectivement un peu maladroit mais entre temps, il y a un exemple très courant d’utilisation dans une boucle for que tu as habilement ignoré. De même pour la boucle while suivante.

      Je ne commenterais pas l’utilisation de la ternaire.

      En programmation, les tableaux sont conventionnellement indexés en utilisant la syntaxe tab[i]. L’équivalence est admise car elle a un sens intrinsèque dans la conception du langage C. L’identificateur de tableau tab est converti en un pointeur constant sur le premier élément du tableau : on accède à une structure de donnée.

      Je cite l’article.

      Cet opérateur n’a pas grand-chose à voir avec les tableaux en fait.

      Son nom est subscript operator et s’applique à des pointeurs (car il ne peut s’appliquer à des tableaux directement à cause de la conversion vers un pointeur). C’est un problème lié au langage mais voilà le fait est là. Et sa définition est (*((E1)+(E2))) avec ce que cela implique, je pense que l’article est claire à ce niveau là.

      Pour moi, ce code est totalement incompréhensible (ou vraiment incroyable, avec mes rudiments du C).

      Oui c’est assez incroyable. L’instruction en elle même est peu utilise mais l’obscurcissement final est tel que je me devait de le notifier au lecteur.

      Au cours de ma lecture du livre « Le guide complet du langage C » de Claude Delannoy, je ne me souviens pas de ce genre de notation (?).

      Ce n’est pas tout à fait une référence … Sa première édition était très souvent imprécise (à la limite du faux) sur certains points. Je ne l’avais pas apprécié du tout. Encore une fois, le but de l’article est de présenter des syntaxes absentes des cours conventionnels.

      Mon niveau n’est pas suffisant pour me faire une idée de ce qui est valide ou pas dans le reste de l’article. Je reste sceptique.

      Je t’invite à vérifier par toi même. Comme tu as vérifié pour l’équivalence qui te semblait fautive mais qui en fait est tout à fait exacte.

      Le but de l’article est présenter des syntaxes du langage méconnues. Forcément, ça fait un peu bizarre, incongrue mais je pense avoir bien vérifié tous les points avant de l’avoir publié et que mis à part les exemples qui sont parfois tordus et pas très utilise (mais là encore, c’est pour présenter une syntaxe !). Je pense qu’il va être difficile de s’attaquer au fondement de l’article même.

      1. 1

        Le problème est qu’on passe à côté de l’essentiel en montrant (également) ce pour quoi le langage n’a pas été conçu. Ce n’est pas juste pour critiquer que j’ai relevé tel ou tel point. Bref, ce n’est que mon opinion.

        1. 1

          Mais c’est justement le but de l’article de présenter ces syntaxes obscures du langage C. Même si leur utilité est faible, ce sont des cas que l’on peut rencontrer. Par exemple dans le noyaux Linux ou dans les soumissions de l’IOCCC.

          J’insiste sur présenter la syntaxe et pas des cas d’utilisation de ces syntaxes. Car je pense qu’en contexte, c’est plus compliqué à comprendre que dans un exemple simple qui n’a que peu de sens.

          Je trouve que toute la beauté de la chose est de trouver quand utiliser ces syntaxes lorsqu’elles se révèlent intéressantes. Certaines comme “le tableau flexible” ou “les caractères trop spéciaux” ne sont pas intéressantes de nos jours mais on peut les retrouver dans d’anciens codes sources.