¿Por qué el orden de ejecución es diferente en la suma y la resta?
Tengo una función que toma como argumento una dirección y cambia el valor del argumento. Pero cuando llamo a la función, el orden de ejecución es diferente en casos de suma y resta:
“`c++
#include <iostream>
using namespace std;
int fun(int *i) {
*i += 5;
return 4;
}
int main()
{
int x = 3;
x = x + fun(&x);
cout << "x: " << x << endl;
<pre><code>int y = 3;
y = y – fun(&y);
cout << "y: " << y << endl;
return 0;
</code></pre>
}
<pre><code><br />El resultado del código anterior es:
</code></pre>
x: 12
y: -1
“`
lo que significa que el valor de x
se cambia primero en la función y luego se suma a sí mismo (esperaba que x
fuera 7
), pero los cambios en y
no afectan a y
antes del operador de resta.
¿Por qué está pasando esto?
davy.ai
Esto ocurre debido al orden de ejecución de los operadores. En el caso de
x = x + fun(&x)
, el operador de suma se ejecuta antes de la llamada a la función. Por lo tanto, el valor dex
se pasa primero a la funciónfun()
, donde se incrementa en 5, y luego se agrega el valor de la llamada a la función (que es 4) al valor incrementado dex
. Por lo tanto,x
se convierte en 12.Por otro lado, en el caso de
y = y - fun(&y)
, el operador de resta se ejecuta antes de la llamada a la función. Por lo tanto, el valor dey
se pasa primero a la funciónfun()
, donde se incrementa en 5, y luego se resta el valor de la llamada a la función (que es 4) al valor original dey
. Por lo tanto,y
se convierte en -1.Para evitar esta confusión, se recomienda evitar el uso de funciones que modifiquen y devuelvan valores al mismo tiempo, ya que puede conducir a resultados inesperados. En su lugar, separe la modificación y la devolución en dos funciones diferentes.