1 00:00:00,000 --> 00:00:00,320 2 00:00:00,320 --> 00:00:02,700 >> DAVID J. MALAN: Vamos escrever um programa em que tentamos trocar os valores de 3 00:00:02,700 --> 00:00:04,970 duas variáveis, x e y. 4 00:00:04,970 --> 00:00:07,490 De antemão, eu escrevi muito deste programa já. 5 00:00:07,490 --> 00:00:11,130 Primeiro, eu declarar uma variável, x, e armazenar nele o valor, 1. 6 00:00:11,130 --> 00:00:14,120 Então eu declarar variável y e armazenar nele o valor, 2. 7 00:00:14,120 --> 00:00:17,700 >> Então eu continuar com printf para exibir os valores dessas duas variáveis. 8 00:00:17,700 --> 00:00:21,090 Então eu afirmo com outro printf para ser trocar essas variáveis. 9 00:00:21,090 --> 00:00:23,690 Então eu chamo uma função chamada swap. 10 00:00:23,690 --> 00:00:26,100 E então eu afirmo que as variáveis foram trocados. 11 00:00:26,100 --> 00:00:30,610 E então eu imprimir que o que eu reivindico são os novos valores de x e y. 12 00:00:30,610 --> 00:00:32,030 >> Agora o que é essa troca de função? 13 00:00:32,030 --> 00:00:34,970 Não é algo que vem com o C. De fato, se olharmos para o topo da minha 14 00:00:34,970 --> 00:00:38,850 arquivo, você verá que eu tenho declarado um protótipo para esta troca de função 15 00:00:38,850 --> 00:00:42,750 especificando que leva dois inteiros, arbitrariamente denominada a e b, e esta 16 00:00:42,750 --> 00:00:44,300 função não retorna nada. 17 00:00:44,300 --> 00:00:48,370 Assim, presumivelmente, ele faz o que diz em swaps de um e os valores de b. 18 00:00:48,370 --> 00:00:50,170 Vamos agora implementar swap. 19 00:00:50,170 --> 00:00:53,820 >> Em primeiro lugar, eu vou declarar uma temporária variável e atribuir-lhe 20 00:00:53,820 --> 00:00:57,260 o valor de um, embora eu pudesse tão facilmente armazenada nele b. 21 00:00:57,260 --> 00:01:00,925 Eu estou indo em seguida para alterar o valor de um seja igual ao que em b. 22 00:01:00,925 --> 00:01:04,849 E então, finalmente, eu vou mudar o valor de b para ser o que era, mas é uma 23 00:01:04,849 --> 00:01:06,340 agora na temperatura. 24 00:01:06,340 --> 00:01:08,910 >> Agora eu afirmo o que eu acabei de fazer é logicamente correta. 25 00:01:08,910 --> 00:01:12,780 Eu tenho guardado um em uma variável temporária, mudou o valor de um ser de b, e, em seguida, 26 00:01:12,780 --> 00:01:15,580 mudou o valor de b de ser o de uma era. 27 00:01:15,580 --> 00:01:18,620 Mas quando eu compilar e executar esse programa, eu me preocupo que não é 28 00:01:18,620 --> 00:01:20,140 vai o que eu vejo. 29 00:01:20,140 --> 00:01:21,625 >> Faça, sem swap. 30 00:01:21,625 --> 00:01:24,350 dot slash, sem swap. 31 00:01:24,350 --> 00:01:27,560 E, infelizmente, de acordo com printf, o valor de x e y, inclusive 32 00:01:27,560 --> 00:01:31,560 depois que afirmam estar trocando los, é ainda 1 e 2. 33 00:01:31,560 --> 00:01:32,630 >> Agora, por que é isso? 34 00:01:32,630 --> 00:01:36,160 Bem, acontece que no principal, quando chamar essa troca de função, passando em 35 00:01:36,160 --> 00:01:39,960 x e y como argumentos, é realmente cópias de x e y que 36 00:01:39,960 --> 00:01:41,310 são passados ​​para swap. 37 00:01:41,310 --> 00:01:45,430 Nomeadamente, os valores 1 e 2 são passou para troca como a e b. 38 00:01:45,430 --> 00:01:48,590 E é A e B que estamos, em última análise trocando em principal. 39 00:01:48,590 --> 00:01:50,810 >> Isto é, torna-se 1 2, 2 torna-se 1. 40 00:01:50,810 --> 00:01:54,630 Mas por causa de swap não tem valor de retorno e porque ele recebeu cópias de x 41 00:01:54,630 --> 00:01:58,220 e y, é comportamento tem nenhum efeito em x e y. 42 00:01:58,220 --> 00:02:02,610 De fato, a e b são escopo, por assim dizer, para trocar, enquanto x e y permanecer 43 00:02:02,610 --> 00:02:03,990 como escopo principal. 44 00:02:03,990 --> 00:02:05,070 >> Então, nós temos um problema. 45 00:02:05,070 --> 00:02:06,320 Mas como corrigi-lo? 46 00:02:06,320 --> 00:02:08,312