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.