Opérateur de séquencement (,)

Bonjour à tous,
Je viens de découvrir un nouvel opérateur en langage c (nouveau pour moi) : l'opérateur de séquencement qui permet d'évaluer plusieurs expressions en une seule.
(x,y) où x et y sont des sous-expressions quelconques, l'opérateur : , réalise l'exécution séquentielle de x et de y, dans cet ordre.
Du moins c'est ce que moi je comprends. Du coup, voici un petit programme qui le met en évidence, il s'agit de la gestion d'un simple chronomètre :

unsigned long t_chrono; 
const int PROGMEM tempsSeconde = 1000; 
int heures = 0, minutes = 0, secondes = 0;

void setup() {
  Serial.begin(115200);
  t_chrono = millis(); // point de depart chrono
}
void affiche() {
  secondes = (secondes >= 59) ? (minutes++, 0) : secondes + 1;
  if (minutes == 60)  {
    ++heures ;
    minutes = 0;
    secondes = 0;
  } ;
  Serial.print(heures) ; Serial.print(":"); Serial.print(minutes); Serial.print(":"); Serial.println(secondes);
  t_chrono = millis(); // on repart à zero
}

void loop() {
  if ((millis() - t_chrono) == tempsSeconde)  affiche();
  }

Si secondes est supérieur ou égal à 59, on exécute :

secondes = (minute++,0);

soit :

minute = minute +1;
secondes = 0;

Le résultat final est celui de seconde tandis que le résultat de minute est simplement ignoré même s'il est effectif.

Bonne journée.

1 Like

vous avez compris l'usage - en pratique ce n'est pas à utiliser car ça date du temps ou les compilateurs n'étaient pas super smarts...

au lieu de

  secondes = (secondes >= 59) ? (minutes++, 0) : secondes + 1;
  ...

on préfèrera l'écriture qui se comprend sans souci

if (++secondes > 59) {
  secondes = 0;
  if (++minutes > 59) {
    minutes = 0;
    if (++heures > 23) {
      heures = 0;
      // jour suivant
    }
  }
} 

on l'utilise plutôt dans une boucle for par exemple avec deux éléments qui doivent avancer de concert

Merci @J-M-L,
Je prends note de vos remarques.

Bonne soirée

Je trouve ça plutôt cool...

oui mais c'est découragé pour des soucis de facilité de lecture du code

une erreur fréquente que l'on voit c'est ce genre d'appel de fonction

uneFonction((1,2),3);  // idem que uneFonction(2,3);  

l'utilisateur pense passer 3 valeurs mais il n'en passe réellement que deux.

j'ai eu le cas récemment sur le forum (ici) ou il avait écrit

Serial.print((temp,HEX)); 

et ne comprenait pas pourquoi ça n'affichait pas sa température en hexadécimal mais tout le temps 16 :slight_smile:

OK, à manipuler avec modération donc. :beer:

La seule utilité de ce truc est d'écrire du code illisible. On dirait que c'est la nature profonde du langage C.

Bonjour @biggil,

Pour le fait que cet opérateur rende le code illisible, je comprends. Par contre le langage C m'a permis de mieux appréhender le fonctionnement des microcontrôleurs et des ordinateurs. Je le trouve au contraire très clair, il est devenu pour moi une évidence, une référence incontournable ! Même si J'ai encore beaucoup à apprendre.

Je le trouve simple et puissant. Je le conseille à tous les apprentis programmeurs.
image

@biggil je pense qu'il est trop facile de tout mettre sur l'outil, alors que bien souvent le problème vient de la main qu'il le porte :slight_smile:

Si le développeur ne connait pas la signification des parenthèses cela est-il vraiment la faute du langage?

Sinon je suis assez d'accord que les développeurs ont tendance à utiliser la flexibilité du C pour produire du code illisible par simple paresse :slight_smile:

Illisible est toujours relatif. Un habitué du C généralement peut lire le code

Le langage C est un mélange de deux paradigmes de programmation : la programmation par instructions et la programmation par expressions.

L'opérateur virgule en C représente le concept de séquençage dans la programmation par expressions.

C’est assez historique.

"le développeur est parfait et ne doit pas faire d'erreurs" est un adage qui ne tient pas la route.
J'ai écrit du code C pour un système d'ouverture de porte d'un métro (et personne ne veut que la porte s'ouvre pendant la marche, ou du mauvais côté), et crois moi, le client (l'exploitant du métro) ne se satisfait pas du tout de la promesse d'excellence des développeurs. A tel point qu'on s'interdisait (relecture du code par un 2nd développeur) d'utiliser pas mal de figures ambigües du C.

oui le langage est proche du matériel et ça peut conduire à des erreurs, c'est pour cela que des règles de bonne conduites / normes de programmation sont édictées

En C++ il y a C++ Core Guidelines qui vaut le coup d'être regardé par exemple

@biggil je te crois assez facilement, nos clients ne nous cois pas sur parole, mais uniquement après avoir vu la qualité des produits de l'on édite :slight_smile:

Mais tu ne notera que tu dis exactement la même chose que moi au final, ce n'est pas l'outil qui produit l'erreur, mais bien la main qui le tien!!!

Si le C ne te conviens pas, pourquoi ne pas alors choisir des langage moins permissif ?

Mais quelque soit le langage si tu n'a pas un minimum de convention et de procédure stricte, tu produira plus de déchet.

j'espère pour vos clients que votre maîtrise de la syntaxe et de la grammaire en C ou C++ est bien meilleure que votre expression en français ...

:rofl: :innocent:

Unknown

Bonsoir @biggil,
Pour vous avoir lu de nombreuses fois, sachez que j'ai beaucoup de respect pour vous et
vos compétences.
Bonne soirée.

Vu le nombre d'année que j'exerce, soit la grammaire du C n'est pas exigence, la syntaxe étant géré par le compilateur.
soit je suis plus douer pour la langue C que la langue française :rofl:

c'est clair maintenant

:scream: :smile:

BRAVO Sherlock ! :rofl: :joy:
Tiens, tiens... Ca me fait penser au pointeurs...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.