En regardant quelques exemples de code C, je suis tombé sur ceci :
y -= m < 3;
Qu'est-ce que ça fait ? C'est une sorte de boucle for condensée ou quelque chose comme ça ? Pour autant que je sache, c'est impossible à trouver sur Google.
En regardant quelques exemples de code C, je suis tombé sur ceci :
y -= m < 3;
Qu'est-ce que ça fait ? C'est une sorte de boucle for condensée ou quelque chose comme ça ? Pour autant que je sache, c'est impossible à trouver sur Google.
Ok merci, je n'avais pas réalisé que l'on pouvait utiliser les déclarations booléennes comme valeur comme ça.
@TheTedinator : C'est possible dans n'importe quel langage qui convertit le booléen "false" en entier "0" et le booléen "true" en entier "1".
Si vous le décomposez par ordre de préséance pour chaque opération, vous obtenez :
y = (y - (m < 3));
m < 3
est évalué et renvoie un résultat booléen 1
o 0
L'expression peut donc être simplifiée comme suit
y = y - 1; // if m < 3 is true
o
y = y - 0; // if m < 3 is false
Le but est d'éviter une if
clause.
Je veux dire if (m < 3) { y -=1; }
puisque (m < 3)
est 1 si m est inférieur à 3, 0 sinon.
Le code apparaît dans une vieille implémentation de référence de quelque chose en rapport 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 parce qu'ils se produisent avant le jour bissextile. Il n'y a pas vraiment d'excuse pour écrire du code comme ça, à moins que vous n'aimiez vraiment son aspect. Ce n'est pas le cas de la plupart des gens.
Je ne peux pas te dire si tu veux que ce soit pour mais je peux vous dire ce qu'il 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
o y = y - 1
;
si m est supérieur ou égal à 3, l'instruction est évaluée comme suit y -= 0
o y = y - 0
. Globalement, dans ce cas, la déclaration ne fait rien.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
11 votes
Il est important de noter que
<
a une plus grande préséance (se lie plus étroitement) que-=
doncy -= m < 3
signifiey -= (m < 3)
.20 votes
C'est en gros l'équivalent de
if(m<3) y=y-1;
0 votes
Avez-vous posé cette question pour prouver que votre collègue n'aurait pas dû écrire ce texte parce qu'il est trop confus ? Les réponses concurrentes sont révélatrices.
2 votes
@TheTedinator Lorsque vous avez une question sur les expressions C, ne la cherchez pas sur Google. Au lieu de cela, ouvrez simplement le standard C open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf et lire la section correspondante. C'est plus rapide et plus instructif.
2 votes
@Chris : Ce code est probablement la meilleure façon de gérer cela si vous avez un compilateur merdique (par exemple, beaucoup de microcontrôleurs ou vous avez besoin que le code soit rapide même à -O0) et vous avez besoin de garder les branches et la taille du code au plus bas (par exemple, beaucoup de microcontrôleurs ou vous avez besoin que le code soit rapide même à -O0).
0 votes
Je vois. Ce n'est pas une réponse, mais s'il s'agissait d'une base de code sur laquelle je travaillais, j'aimerais voir un commentaire qui explique la manière conventionnelle de procéder (if (m < 3) etc).
0 votes
C'est une partie de l'algorithme de Tomohiko Sakamoto pour calculer le jour de la semaine.