¿Qué significa y – = m <3?

Mientras miraba un ejemplo de código C, encontré esto:

y -= m < 3; 

¿Qué hace esto? ¿Es algún tipo de bucle condensado o algo así? Es imposible buscar en google por lo que sé.

m < 3 es 1 o 0 , dependiendo del valor de verdad.

Entonces y=y-1 cuando m<3 es true , o y=y-0 cuando m>=3

Si lo desglosa por orden de prioridad para cada operación, obtendrá:

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

m < 3 se evalúa y devuelve un resultado booleano 1 o 0 , por lo que la expresión se puede simplificar como

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

o

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

El propósito de hacer esto es evitar una cláusula if .

I significa if (m < 3) { y -=1; } if (m < 3) { y -=1; } , ya que (m < 3) es 1 si m es menor que 3, 0 en caso contrario.

El código aparece en una implementación de referencia bastante antigua de algo que ver con los años bisiestos o la Pascua, o posiblemente con ambos: los primeros dos meses de enero y febrero son especiales porque ocurren antes del día del salto. Realmente no hay ninguna excusa para escribir código así, a menos que realmente te guste su aspecto. La mayoría de la gente no lo hace.

m < 3 evalúa como 1 si m es menor que 3. Por lo tanto, y se reduce en uno en este caso. Por lo tanto, una sentencia if evitada.

No puedo decir que quieras, pero puedo decirte lo que hace:

m < 3 devuelve un int de 0 o 1 que representa un valor booleano.

si m es menor que 3, la statement se evalúa como: y -= 1 o y = y - 1 ;

si m es mayor o igual a 3, la statement se evalúa como y -= 0 o y = y - 0 . En general, en este caso, la statement no hace nada.

< tiene una prioridad más alta para el signo de igual = entonces m<3 devuelve 1 si m es menor que 3, y si no es 0

entonces y = y - 1 o y = y - 0

Estoy de acuerdo en que el código es equivalente a if(m<3) y=y-1;

Sin embargo, es un código inseguro porque aunque FALSE siempre es 0, TRUE ha tenido un par de definiciones. Hoy en día, TRUE es igual a 1 en la mayoría de los sistemas de progtwigción, pero en los sistemas más antiguos era igual a -1 (donde todos los bits se activaron, no solo el último). Entonces, si este código se está ejecutando en una plataforma anterior, podría traducirse a if(m<3) y=y-(-1); o if(m<3) y=y+1; La compatibilidad entre sistemas es una gran razón para evitar un código 'inteligente' como este.