52 votes

Que signifie y -= m < 3 ?

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.

11 votes

Il est important de noter que < a une plus grande préséance (se lie plus étroitement) que -= donc y -= m < 3 signifie y -= (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.

75voto

Wei Shi Points 1836

m < 3 est soit 1 o 0 en fonction de la valeur de vérité.

Alors y=y-1 cuando m<3 es true ou y=y-0 cuando m>=3

1 votes

Ok merci, je n'avais pas réalisé que l'on pouvait utiliser les déclarations booléennes comme valeur comme ça.

0 votes

@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".

0 votes

Java s'est énervé contre moi quand j'ai essayé, mais j'ai pu utiliser une instruction if.

25voto

Jasarien Points 35353

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.

3 votes

Non, le but est de faire de l'esbroufe et d'embrouiller les futurs programmeurs de maintenance.

0 votes

^hehehe ! J'aime cette réponse :)

14voto

Steve Jessop Points 166970

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.

10voto

AttishOculus Points 840

m < 3 vaut 1 si m est inférieur à 3. Par conséquent, y est diminué de 1 dans ce cas. Ainsi, une instruction if a été évitée.

0 votes

Si vous souhaitez que le texte reste lisible et que vous évitiez l'utilisation de l'option if , utiliser y -= (m < 3 ? 1 : 0) ; Les parenthèses sont facultatives, mais elles améliorent un peu la lisibilité.

2voto

James Webster Points 16663

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.

6 votes

En C, m < 3 ne donne pas un booléen (c'est-à-dire une valeur de type bool o _Bool ). Elle donne une valeur de type int avec la valeur 0 ou 1. Cette valeur peut être utilisée comme une condition ou, comme dans ce cas, comme une valeur arithmétique.

Prograide.com

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.

Powered by:

X