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.