¿Cuál es la diferencia entre (y & x == 0) y ((y & x) == 0) en C ++?

Estas expresiones son condiciones de prueba para una declaración condicional o un bucle. C ++ prefiere ‘==’ sobre ‘ & ‘ de acuerdo con las reglas de precedencia del operador. Ambas son las declaraciones condicionales. Veamos cómo funcionan estos.

(y & x == 0)

Esta declaración es básicamente una versión corta de ” y & (x == 0) “. Esta condición puede tener los siguientes casos:

  1. x = 0, y = 0 : x == 0 está marcado, x es igual a cero, por lo tanto, esta expresión da 1 ( Verdadero ) valor. Luego, y & (x == 0) se verifica (observe que x == 0 en sí mismo es un resultado, por lo que se verifica con y, y es 0 ( Falso ) yx == 0 es 1 ( Verdadero ), esto resulta en 0 ( Falso ). Por lo tanto, esta condición falla y su bloqueo no se ejecuta.
  2. x = + ve (suponga 1), y = 0 : x == 0 está marcado, x no es igual a cero, se evalúa como valor 0 (F). Luego, y & (x == 0) se verifica, y es 0 y ‘x == 0’ es 0, esto resulta en 0 ( Falso ). Por lo tanto, esta condición también falla y su bloqueo permanece sin ejecutar.
  3. x = 0, y = + ve (suponga 1) : x == 0 está marcado, x es igual a cero, se evalúa como valor 1 (T). Luego, se marca y & (x == 0), y es 1 yx == 0 es 1, esto resulta en 1 ( Verdadero ). Por lo tanto, finalmente se pasa esta condición y el código se ejecuta en este caso.
  4. x = + ve (suponga 1), y = + ve (suponga 1) : x == 0 está marcado, x no es igual a cero, se evalúa a 0 (F). Luego, se marca y & (x == 0), y es 1 yx == 0 es 0, esto resulta en 0 ( Falso ). Por lo tanto, nuevamente esta condición falla.

((y & x) == 0)

Esta declaración es un poco diferente de la otra. Veamos estas declaraciones casos de trabajo:

  1. x = 0, y = 0 : en primer lugar, se evalúan y & x, tanto x como y son cero, por lo tanto, esto se evalúa como 0 ( F ). Luego se verifica si es igual a cero, esto es igual a cero, por lo que la expresión final se evalúa como 1 ( Verdadero ). Por lo tanto, esta condición ha pasado y su bloque se ejecuta.
  2. x = + ve (suponga 1), y = 0 : en primer lugar, y & x se evalúa, y es 0 yx es 1, por lo tanto, esto se evalúa como 0 ( F ). Luego, se verifica si es igual a cero, esto es igual a cero, por lo que la expresión final se evalúa como 1 ( Verdadero ). Por lo tanto, esta condición se pasa nuevamente y el código se ejecuta nuevamente.
  3. x = 0, y = + ve (suponga 1) : en primer lugar, y & x se evalúa, y es 1 yx es 0, por lo tanto, esto se evalúa como 0 ( F ). Luego, se verifica si es igual a cero, esto es igual a cero, por lo que la expresión final se evalúa como 1 ( Verdadero ). Por lo tanto, esta condición se pasa nuevamente y el código se ejecuta nuevamente.
  4. x = + ve (suponga 1), y = + ve (suponga 1) : en primer lugar, y & x está marcado, y es 1 yx es 1, esto se evalúa como 1 ( T ). Luego, se verifica si es igual a cero, esto no es igual a cero, por lo que la expresión final se evalúa a 0 ( Falso ). Por lo tanto, esta condición falla en este caso y el código permanece desde la ejecución.

Estas dos líneas de códigos se ven casi iguales pero son completamente diferentes. Uno es válido en 1 de cada 4 casos y otro en 3 de cada 4 casos. ¡Moraleja de la historia, los paréntesis importan en C ++!

Según la precedencia del operador, ‘ == ‘ se prefiere sobre ‘ & ‘.

(y & x == 0)

Al principio, debido a la precedencia del operador, x == 0 está marcado. Si es cierto (es decir, 1), se produce la operación bit a bit y & 1 . Si es falso, se produce la operación bit a bit y & 0 . El resultado final (distinto de cero o cero) dicta si la condición general es verdadera o no (1 o 0).

((y & x) == 0)

Debido a los paréntesis, al principio, la operación bit a bit y & x tiene lugar y luego ese resultado se compara con 0 por == operador. El resultado final (distinto de cero o cero) dicta si la condición general es verdadera o no (1 o 0).