Hola,
Bueno, esta es una de las preguntas más interesantes.
Parece simple pero ¿verdad?
Bueno, por todas las conjeturas hechas … déjame decirte que la respuesta correcta es 44.
Ahora,
¿Por qué pasó esto?
Bueno, es algo que hace el compilador.
Nunca es seguro qué expresión se va a evaluar primero.
por tu ejemplo,
++ p + ++ p,
prefijo, usa el valor actual después de la actualización, es decir, usa el último valor. Cualquier operador, pre-arreglo o post-arreglo requeriría un punto de secuencia para reiniciar su valor para una evaluación adicional.
- ¿Cuál es la respuesta a 2 ^ 2 ^ 2 ^ 2 ^ 0?
- La velocidad orbital de un cuerpo pequeño es aproximadamente [matemática] \ frac {1} {\ sqrt {2}} [/ matemática] de la velocidad de escape. ¿Por qué es esto? ¿Hay una razón intuitiva?
- Cómo demostrar que [math] \ sqrt {a \ cdot b} \ le \ frac {a + b} {2} [/ math]
- Si [matemática] 0.5 ^ n = 0.125 ^ 2 [/ matemática], ¿cuál es el valor de [matemática] n ^ {0.5} [/ matemática]?
- ¿Alguien podría resolver esto [matemáticas] 2 ^ {2x} = 2 ^ x + 12 [/ matemáticas]?
Por ejemplo, considere esto:
val1 = ++ p + p ++;
val2 = p ++ + ++ p;
para p = 10;
el valor de val1 = 23 y el de val2 = 22;
Vamos a resolverlo con la definición normal de operador pre y post-arreglo.
val1 = ++ p + p ++ => ++ p haría el valor de p = 11 (y usaría este valor), ahora p = 11, p ++ usaría el valor 11, luego lo actualizaría a 12. Pero el valor evaluado de val1 = 11 + 11 = 22;
Pero la respuesta real que da gcc es 23.
Entonces, ¿tenemos el conocimiento incorrecto sobre los operadores? ¿Fue todo un engaño que leímos en las escuelas / colegios?
Bueno, es algo llamado almacenamiento en búfer de expresiones.
Siempre que se evalúa una expresión con múltiples operadores (unarios), la corrección previa tiene una sobrecarga de usar el último valor que tiene la variable. es decir, después del final de la expresión, la variable ++ contendría el último o el valor más actualizado posible de esa variable.
por lo tanto con el ejemplo
Tuya –
++ p + ++ p,
Aquí, p = 10 … ahora, mientras que la evaluación primero ++ p haría que el valor de p = 11, luego ++ p haría que el valor sea p = 12;
Ahora, lo que sucede es que cuando el valor real se evalúa con el operador binario ‘+’, el valor que ++ p usa es el valor más actualizado … es decir, p = 12. Ambos operadores de pre-arreglo usarían este valor. De ahí la respuesta = 44.
Lo mismo sucede con mi ejemplo.
p = 10
val = ++ p + p ++;
++ p haría p = 11, luego p ++ usaría 11, pero luego cambiaría el valor a 12. ahora, al evaluar el operador binario ‘+’, ++ p (pre-arreglo) usa el valor más actualizado, es decir, 12,
por lo tanto…. val1 = 12 + 11 = 23;
Esto seguramente es una violación de lo que encontramos en las descripciones de estos operadores. Pero es básicamente la arquitectura y el compilador lo que daría como resultado diferentes salidas.
Lo que sucede en caso de CCG, bueno, eso acabo de explicar.
Espero que esto aclare.
Gracias