unidades tag tabla sistema sintomas simbolo significa que poner metros metro medidas medida letra jessie internacional fundamentales ejemplos derivadas cursiva cubico cuanto como cancer c

tag - ¿Qué significa y-= m<3?



unidades derivadas (7)

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é.


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 programació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 ejecuta en una plataforma más antigua, 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.


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 tiene 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 un código así, a menos que realmente te guste su aspecto. La mayoría de la gente no lo hace.


No puedo decir que lo deseas, 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 declaración se evalúa como: y -= 1 o y = y - 1 ;

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


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 .


< 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


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


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.