entendimento do programa abaixo. [RESOLVIDO]

1. entendimento do programa abaixo. [RESOLVIDO]

ale
aoshi001

(usa Kurumin)

Enviado em 04/09/2008 - 15:25h

Por que os valores do soma1 e soma2, foram diferentes.


#include <stdio.h>
int main() {
int i=10, j=10, soma1, soma2;
soma1 = (i/2) + fun(&i);
soma2 = fun(&j) + (j/2);
printf(" soma1 = %d \n soma2 = %d \n", soma1, soma2);
}
int fun(int *k) {
*k += 4;
return(3 * (*k) - 1);
}
RESULTAO DA SAIDA

soma1 = 46
soma2 = 48



  


2. MELHOR RESPOSTA

Eduardo Pelizzari de Andrade
edupersoft

(usa Manjaro Linux)

Enviado em 04/09/2008 - 16:17h

Você chamada as funções fun(&i) e fun(&j). O operador & faz com que seja passado o endereço de memória da variável e não o seu valor, com isso a função pode manipular diretamente a variável. Quando é executado *K=+4, você está somando 4 no próprio i e j e não em uma variável local da função. Como na primeira chamada a expressão é i/2 + fun(&i), ele divide i por 2 que dá 5, depois soma com o retorna da função que no caso é 41. Quando você faz fun(&j) + j /2, fun(&j) retorna o mesmo 41, mas j, depois da chamada da função não vale 10, vale 14, então no momento da operação j/2. você estará dividindo 14 por 2 e não 10.

3. Re: entendimento do programa abaixo. [RESOLVIDO]

Marcelo A. B. Slomp
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);
}


4. &var

Pedro
javamizer

(usa Suse)

Enviado em 04/09/2008 - 16:59h

Os colegas acima falaram tudo, estão exatos, é a famosa aritmética de ponteiros que C e C++ tem.

*k não é uma variável local e sim uma referência para a variável que tu passar como argumento para fun().
Ao fazer qq atribuição nela tu faz direto na variável referenciada e não numa variável local de fun().
Por isso ao fazer:

soma1 = (i/2) + fun(&i);
E
soma2 = fun(&j) + (j/2);

quando fun() retorna a variável que tu deu como parametro através do endereço está valendo o que tu atribuiu pra ela em fun().
Você não percebe em soma1 porque não usa "i" depois da atribuição que ele leva em *k += 4;
Mas em soma2 na verdade tu tá fazendo o mesmo que: soma2 = 41+(14/2);






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts