Que signifie y – = m <3?

En parcourant un exemple de code C, je suis tombé sur ceci:

y -= m < 3; 

Qu’est-ce que cela fait? Est-ce une sorte de condensé pour la boucle ou quelque chose? C’est impossible à google pour autant que je sache.

m < 3 est soit 1 soit 0 , selon la valeur de vérité.

Donc y=y-1 quand m<3 est true , ou y=y-0 quand m>=3

Si vous le décomposez par ordre de priorité pour chaque opération, vous obtenez:

 y = (y - (m < 3)); 

m < 3 est évalué et retourne un résultat booléen 1 ou 0 , donc l'expression peut être simplifiée comme

 y = y - 1; // if m < 3 is true 

ou

 y = y - 0; // if m < 3 is false 

Le but pour cela est d'éviter une clause if .

Je veux dire if (m < 3) { y -=1; } if (m < 3) { y -=1; } , puisque (m < 3) vaut 1 si m est inférieur à 3, 0 sinon.

Le code apparaît dans une ancienne implémentation de référence de quelque chose à voir avec les années bissextiles ou Pâques, ou peut-être les deux: les deux premiers mois de janvier et février sont spéciaux car ils se produisent avant le jour bissextile. Il n'y a pas vraiment d'excuse pour écrire un code comme celui-ci, à moins que vous n'aimiez son apparence. La plupart des gens ne le font pas.

m < 3 évalue à 1 si m est inférieur à 3. Donc, y est diminué de un dans ce cas. Ainsi, une déclaration if évitée.

Je ne peux pas vous dire que c’est pour , mais je peux vous dire ce que ça fait:

m < 3 renvoie un int de 0 ou 1 représentant une valeur booléenne.

si m est inférieur à 3, l'instruction est évaluée comme suit: y -= 1 ou y = y - 1 ;

si m est supérieur ou égal à 3, l'instruction est évaluée comme y -= 0 ou y = y - 0 . Dans l'ensemble, dans ce cas, la déclaration ne fait rien.

< a une priorité supérieure au signe égal = so m<3 renvoie 1 si m est inférieur à 3, sinon 0

alors y = y - 1 ou y = y - 0

Je suis d’accord que le code est équivalent à if(m<3) y=y-1;

Cependant, le code est dangereux car FALSE est toujours 0, TRUE a quelques définitions. De nos jours, TRUE est égal à 1 dans la plupart des systèmes de programmation, mais dans les systèmes plus anciens, il était égal à -1 (où tous les bits étaient activés, pas seulement le dernier). Donc, si ce code est exécuté sur une plate-forme plus ancienne, cela pourrait se traduire par if(m<3) y=y-(-1); ou if(m<3) y=y+1; La compatibilité croisée des systèmes est une raison majeure d'éviter le code "intelligent" comme celui-ci.