
mslomp
(usa Slackware)
Enviado em 04/09/2008 - 16:14h
você está usando um ponteiro como argumento para a função fun
desse modo, a variável passada como argumento retornará com seu valor alterado, por fun ter realizado *k+=4 e isso refletirá na função que a está utilizando (nesse caso, main).
desse modo, quando você faz:
fun(&j) + (j/2), ao calcular o j/2, j já terá sido alterado por fun(&j) e não será mais 10 e sim 14 (*k + 4)
para (i/2) + fun(&i), primeiramente i será realmente 10, porém após fun(&i) passará a ser 14, pelo mesmo motivo citado no caso anterior.
por isso a diferença nos resultados é 2. [(14-10)/2]
é apenas uma questão de ordem nos fatores.
dois modos para contornar:
1 - manter ambas as somas sob a forma (var/2) + fun(&var) para evitar a alteração "antes da hora";
2 - evitar o uso de argumento por referência, já que nesse caso não há essa necessidade:
#include <stdio.h>
int main() {
int i=10, j=10, soma1, soma2;
soma1 = fun(i) +(i/2);
soma2 = fun(j) + (j/2);
printf(" soma1 = %d \n soma2 = %d \n", soma1, soma2);
}
int fun(int k) {
k += 4;
return(3 * k - 1);
}