#  > Desenvolvimento >  > Linguagens de Programação >  >  Troca de variaves em C
Ola,

Uma vez eu vi um site que mostrava várias formas trocar o valor de duas variaveis em C, sem usar uma variavel auxiliar! Alguem ja viu alguma coisa desse tipo?

não lembro direito como era, mas acho que sempre tinha uma atribuicao dentro de uma expressao, alguma coisa desse tipo: a=a+(b-(b=a)), mas isso nao funciona...

Se alguem sabe como fazer ou ja viu isso em algum lugar por favor poste o link aqui! 


valeu!

----------


## 1c3m4n

explica melhor oq vc ta querendo, q ficou meio confuso

----------

Ok! vou explicar melhor!

pra trocar o valor de duas variaveis em C usa-se uma variavel auxiliar, por exemplo:



```
int a, b, aux;
 
a=2;
b=4;
 
printf("a=%d b=%d\n", a, b);
 
/*troca*/
aux=a;
a=b;
b=aux;
 
printf("a=%d b=%d\n");
```

 
a saida desse programa vai ser:



```
2 4
4 2
```

 
mas como fazer isso sem usar a variavel aux?

----------


## _ivy_

Ois, 

Deve ter algum comando que faca isso atraves de um registrador, mas acho que nao e' pra todas as plataformas. 
(porque, se tu pensar bem, e' so' trocar os enderecos correspondentes as variaveis: largar o endereco de uma em um registrador, move o endereco de uma pra outra e move o endereco do registrador pra uma, confuso neh.. rss.. ). 

Eu acho que cheguei a ver um comando que fazia exatamente isso, mas nao era portavel...

Mas eu realmente nao vejo utilidade pra isso.. uma variavel auxiliar eh tao inofenciva  :Smile: 

ainda mais se vc usar ponteiros... ou se a sua variavel for menor que um long...  :Smile: 

[]'s

----------


## Jim

soma os dois valores, e diminui dele mesmo...

a=((a+b)-a)
b=((a+b)-b)

----------


## _ivy_

hehe.. assim nao funciona nao  :Smile:

----------


## Jim

e porque não? testei e aprovei...

----------


## _ivy_

hahahah.. puts.. vc deve ter testado com variaveis iguais entao  :Smile: 

a = 1; 
b = 2; 

//a=((a+b)-a)
//b=((a+b)-b)

a = (1 + 2) - 1; // a = 2
b = (2 + 2 ) - 2 // b =2

Se isso funciona entao vo pedi demissao!

----------


## Jim

você tem razão... testei no delphi (jogando o valor nos campos) coisa que vc nao pode fazer no C

----------


## _ivy_

> Postado originalmente por _ivy_
> 
> hahahah.. puts.. vc deve ter testado com variaveis iguais entao 
> 
> a = 1; 
> b = 2; 
> 
> //a=((a+b)-a)
> //b=((a+b)-b)
> ...



Hahahahahahahahahahh... amigo, agora vou baixar o nivel e nao estou falando em programar em ASM  :Smile: 

Vc ja programou alguma vez na vida? Entende o conceito de sequencia? 

Veja bem.. depois que vc faz:

a = (1 + 2) - 1; // a = 2

O valor de "a" deixa de ser "1" e passa a ser "2".. é isso que acontece quando se faz uma atribuição.. logo.. quando for executar a segunda expressao.. o valor de "a" vai ser "2" e não "1". 

Bom, se ainda assim acredita que isso funciona, abre o vim.. faz um programinha, teste com "n" valores.. compile.. e poste aqui os resultados.. Se funcionar.. viro sua fã 
 :Big Grin:

----------


## Jim

cara... eu admiti que errei, mas que bom saber da sua ignorância
(estava apenas tentando ajudar)

----------


## _ivy_

Foi mal, eu respondi aquilo antes de ler o seu ultimo post.. desculpe a alteracao de animo..

----------


## Jim

tudo bem, eu tb te amo

----------


## Jim

tudo bem, eu tb te amo  :Big Grin:

----------


## Arkanoid

Eu lembro de ter visto isso em um site; era assim:


```
a ^= b ^= a ^= b
```

 São três XORs entre as variáveis. "Traduzindo", fica assim:


```
a = a ^ b
b = b ^ a
a = a ^ b
```

 Testei aqui no C e funcionou.

----------


## smvda

:Big Grin:   :Big Grin:   :Big Grin:  a miguinha ivy ta estressada .... nas não liga não Jim é Mulher :lol: :lol: :lol: :lol: :lol: :lol: :lol: Só não vai se stressa comigo ivy ....é brincadeira .....

abraços

----------


## smvda

> Eu lembro de ter visto isso em um site; era assim:
> 
> 
> ```
> a ^= b ^= a ^= b
> ```
> 
>  São três XORs entre as variáveis. "Traduzindo", fica assim:
> 
> ...



Isso funciona ... legal vo adota na minha programação .... o smilebyte achou a solução ....hehehe 

Valeu

----------


## _ivy_

Pensando aqui na minha ardua tarde de trabalho.. cheguei as seguintes linhas:

a += b; 
b = a-b;
a -= b; 

Parece que funciona  :Smile:

----------


## _ivy_

> Eu lembro de ter visto isso em um site; era assim:
> 
> 
> ```
> a ^= b ^= a ^= b
> ```
> 
>  São três XORs entre as variáveis. "Traduzindo", fica assim:
> 
> ...


Heheh.. praticamente igual ao que eu mandei.. só que ao invés de usar + e - vc usa xor  :Smile: . O que é melhor pois evita overflow  :Smile:

----------


## _ivy_

> a miguinha ivy ta estressada .... nas não liga não Jim é Mulher :lol: :lol: :lol: :lol: :lol: :lol: :lol: Só não vai se stressa comigo ivy ....é brincadeira .....
> 
> abraços


É.. eheheh.. viu gente.. tomem cuidado com os posts.. nunca se sabe quando vai ter uma mulher com tpm no forúm.. eheheheh...

----------


## Arkanoid

> Isso funciona ... legal vo adota na minha programação .... o smilebyte achou a solução ....hehehe 
> 
> Valeu


E ainda serve pra tirar onda, se vc for mostrar o código pros seus amigos :wink: coisa de programador C profissa...

----------


## mistymst

Voces gostam de reinventar a roda... nao eh tao mais facil de usar uma variavel auxiliar? Bom entao cria uma funcao, voces complicam o que eh simples.

Vou fazer meu TCC sobre: "1001 Maneiras de Reinventar a Roda."

----------


## smvda

> Postado originalmente por smvda
> 
> Isso funciona ... legal vo adota na minha programação .... o smilebyte achou a solução ....hehehe 
> 
> Valeu
> 
> 
> E ainda serve pra tirar onda, se vc for mostrar o código pros seus amigos :wink: coisa de programador C profissa...



ha sim programação para mim se resume em C/C++ o resto é resto .... mas não utilizava isso tinha visto em livros mas sabe estes detalhes vc acaba deixando de lado ... mas é muito legal ....

Valeu

----------


## _ivy_

> Voces gostam de reinventar a roda... nao eh tao mais facil de usar uma variavel auxiliar? Bom entao cria uma funcao, voces complicam o que eh simples.
> 
> Vou fazer meu TCC sobre: "1001 Maneiras de Reinventar a Roda."


Calma cara.. isso aqui e' so' uma troca de ideias.. curiosidades... nada tem a ver com reinventar a roda...

----------


## smvda

Ja iventaram a roda ? :?: :?: :?: :?: :lol: :lol: :lol: :lol:

----------


## a2gs

isso eh BEM interessante, mas ainda nao eh mais rapido q swap(xxx *a, xxx *b){xxx c; c=*a;*a=*b;*b=c} (bitwise e atribuicao consomem uma instrucao de assembly ambas e os enderecos sao resolvidos em compilacao), nem estamos programando pra memorias menores q 128bytes (problemas com stack) e a complexidade do codigo aumentou (quem programa bastante (ou melhor, de forma descente) sabe q complexidade no codigo eh um serio problema, tanto de compreensao como de depuracao).

Vcs acham q isso deve ser usado??

(eu, particularmente quebro os dedos do fdp q escrever isso aqui no trampo! mas demito antes pra nao ter processo trabalhista! Ou mato, enterro e jogo sal!) hehehehehehehehe

----------


## SDM

meu...olha soh:



```
a=4;
b=8;
 
a=b+a; // 12
b=a-b; //  4
a=a-b; // 8
```

 
ateh ai tudo bem...simples rapido e facil...maaas...como o mistymst falo, isso eh reinventar a roda.....eu acho q vc tem q escolher....se vc vai sacrificar memoria ( no maaaximo 8bytes com a long (eh isso neh???)) ou se vc vai sacrificar processamento pra fazer essas contas....eh logico q "sacrificar" eh uma palavra q significa mto mais do que precisa....mas enfim...eu soh recomendo o uso desse metodo se vc estiver trabalhando em maquinas onde tenham pouquissimos KB de memoria ou em maquinas q trabalhem com 100% da memoria em uso....

----------


## gmlinux

a propósito, quantas pontas possue uma roda?  :Smile:

----------


## _ivy_

> meu...olha soh:
> 
> 
> 
> ```
> a=4;
> b=8;
>  
> a=b+a; // 12
> ...


Assino em baixo... Acho que essas coisas são mais a titulo de curiosidade..

----------


## SDM

> a propósito, quantas pontas possue uma roda?


soh respondendo uma curisidade....uma roda tem infinitas pontas, ja que eh poligono de infinitos vertices....eh como se vc pegasse um quadrado(triangulo ou seja la qual for o seu poligo favorito) e juntar varios(vaaaaarios msm) em angulos diferentes, mas mantendo o mesmo eixo, e assim vc teria uma roda....

:lol: desculpem pelo off-topic...mas eu queria fala isso... :lol: 

brigado pelo apoio ivy... =*

----------


## gmlinux

Para este post não ficar off-topic demais, vai minha contribuição (ou não  :Smile:  ):
IMHO, e já que estamos apenas trocando idéias e a titulo de curiosidade.

Muitas vezes procuramos obter performance na aplicação em cima da codificação, ou uso de certa linguagem, em certas condições até conseguimos algum sucesso, mais um algoritmo O(n) nunca será um O(1) ( no entanto pode ser mais rápido para n pequeno quando este O é relativo a tempo ou ocupar menos espaço de memória quando o O é relativo a armazenamento ).
Vez ou outra me pego esquecendo disto...




> Postado originalmente por gmlinux
> 
> a propósito, quantas pontas possue uma roda? 
> 
> 
> soh respondendo uma curisidade....uma roda tem infinitas pontas, ja que eh poligono de infinitos vertices....eh como se vc pegasse um quadrado(triangulo ou seja la qual for o seu poligo favorito) e juntar varios(vaaaaarios msm) em angulos diferentes, mas mantendo o mesmo eixo, e assim vc teria uma roda....
> 
> :lol: desculpem pelo off-topic...mas eu queria fala isso... :lol: 
> 
> brigado pelo apoio ivy... =*


hehehe
Interessante, mais este é parte do processo de cálculo do pi, olha a definição geométrica do circulo tirada de alguns sites:

"... é o lugar geométrico dos pontos que são equidistantes a um outro ponto dado, o centro da circunferência."
http://www.educ.fc.ul.pt/icm/icm99/icm43/plano.htm
http://www.educ.fc.ul.pt/docentes/op...s/traducao.htm

se transpormos para a roda esta propriedade garantimos colocar o eixo neste ponto central, se não imagina nosso carro andando com o eixo fora do centro da roda (circulo)  :Smile:

----------

Legal, apareceram varias ideias... mas alguem sabe como fazer isso em 1 linha sem usar xor, soh usando + e - e colocando atribuições no meio da expressão?

uma vez eu vi isso em um site, o cara dava varios exemplos... esses dias eu tava falando pra um colega meu e ele naum acreditou... dai to pesquisando no google pra tentar achar esse site... mas ta dificil... se alguem souber alguma coisa parecido por favor posta aqui!

valew!!!

----------


## veiga

> Legal, apareceram varias ideias... mas alguem sabe como fazer isso em 1 linha sem usar xor, soh usando + e - e colocando atribuições no meio da expressão?
> 
> uma vez eu vi isso em um site, o cara dava varios exemplos... esses dias eu tava falando pra um colega meu e ele naum acreditou... dai to pesquisando no google pra tentar achar esse site... mas ta dificil... se alguem souber alguma coisa parecido por favor posta aqui!
> 
> valew!!!


eh soh colocar tudo na mesma linha!  :Smile: 



```
a -=(b=(a+=b)-b);
```

 


feito!

--
Marcelo Veiga Neves
http://www.inf.ufsm.br/~veiga

----------

