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.