1 00:00:07,420 --> 00:00:08,160 [Powered by Google Translate] DAVID J. MALAN: Tudo bem. 2 00:00:08,160 --> 00:00:11,170 Este é CS50, e este é o fim da segunda semana. 3 00:00:11,170 --> 00:00:14,650 Se você esperar para estar com fome volta a esta hora amanhã, saiba que nós estamos indo 4 00:00:14,650 --> 00:00:18,920 a convocação de amanhã como um pequeno grupo, quinta-feira, 1:15 PM. 5 00:00:18,920 --> 00:00:21,460 Há essa URL aqui se você gostaria de RSVP. 6 00:00:21,460 --> 00:00:25,270 O espaço é limitado, portanto, por favor, perdoe se o formulário foi preenchido pelo tempo que você 7 00:00:25,270 --> 00:00:26,680 preencher isso. 8 00:00:26,680 --> 00:00:29,400 Outra URL no entanto, que pode ser de interesse é esse. 9 00:00:29,400 --> 00:00:32,409 >> Assim, em apenas cerca de um mês, o curso vai ser disponibilizado 10 00:00:32,409 --> 00:00:36,090 tudo o mais amplamente através de EDX, através do qual as pessoas na Internet será 11 00:00:36,090 --> 00:00:39,580 capaz de acompanhar, participar no curso bastante activa, na verdade. 12 00:00:39,580 --> 00:00:43,070 Eles vão estar usando o aparelho CS50 e CS50 Discutir e na maioria das 13 00:00:43,070 --> 00:00:45,840 diversas ferramentas de software que já foram usando este semestre. 14 00:00:45,840 --> 00:00:49,030 E uma das iniciativas que gostaria de assumir como uma experiência este ano 15 00:00:49,030 --> 00:00:53,120 é para ver o quanto de conteúdo que pode se traduzir em outras línguas faladas e 16 00:00:53,120 --> 00:00:54,110 línguas escritas. 17 00:00:54,110 --> 00:00:58,000 Então, se você pode ter interesse em participar neste projecto, em que 18 00:00:58,000 --> 00:01:02,090 vamos fornecer transcrições em inglês e legendas para o seu curso 19 00:01:02,090 --> 00:01:05,190 palestras e shorts e seminários e seções e similares - 20 00:01:05,190 --> 00:01:08,700 se você falar fluentemente ou escrever fluentemente outra língua, teríamos 21 00:01:08,700 --> 00:01:12,240 amo para acoplá-lo neste projeto, em que você toma em um ou mais dos 22 00:01:12,240 --> 00:01:15,340 vídeos, traduzindo-os em uma língua que você conhece muito bem. 23 00:01:15,340 --> 00:01:19,050 Para dar-lhe um sentido de interface, não há essa interface de usuário baseada na web 24 00:01:19,050 --> 00:01:22,330 que nós vamos usar que irá criar, essencialmente, uma interface de usuário como este. 25 00:01:22,330 --> 00:01:24,520 Isso foi me ensinando alguns Halloween atrás. 26 00:01:24,520 --> 00:01:27,710 E no lado direito, em preto ao lado destes carimbos de tempo, 27 00:01:27,710 --> 00:01:31,300 você vai ver as várias coisas que saíram da minha boca naquele dia. 28 00:01:31,300 --> 00:01:34,660 E então abaixo, você será capaz de traduzir para outra língua. 29 00:01:34,660 --> 00:01:37,840 Exactamente o que é o mapeamento entre, neste caso, Inglês 30 00:01:37,840 --> 00:01:38,660 e, digamos, espanhol. 31 00:01:38,660 --> 00:01:40,480 Então, é realmente uma ferramenta muito amigável. 32 00:01:40,480 --> 00:01:43,690 Você pode retroceder e avançar muito rapidamente com atalhos de teclado. 33 00:01:43,690 --> 00:01:46,710 Então, se você gostaria de participar nesta experiência e ter suas palavras 34 00:01:46,710 --> 00:01:50,730 visto e lido por potencialmente milhares de pessoas lá fora, por favor, me sinto 35 00:01:50,730 --> 00:01:51,960 livre para participar. 36 00:01:51,960 --> 00:01:56,940 >> Agora uma palavra sobre o gatinho de segunda-feira, para que não nos enviou um excedente 37 00:01:56,940 --> 00:01:58,120 mensagem assustadora. 38 00:01:58,120 --> 00:02:02,130 Fazer perceber que, como o horário de expediente sugerir e como seções sugerem, o 39 00:02:02,130 --> 00:02:05,110 projeto do curso é muito de ter alunos a colaborar e 40 00:02:05,110 --> 00:02:09,250 falando para trabalhar com conjuntos de problemas e os problemas juntos. 41 00:02:09,250 --> 00:02:13,630 E realmente a linha se resume a, mais uma vez, o trabalho que, em última análise 42 00:02:13,630 --> 00:02:16,420 deverá apresentar deve ser o seu próprio. 43 00:02:16,420 --> 00:02:19,080 E por isso é, muito sinceramente - em horário de expediente, é totalmente normal - 44 00:02:19,080 --> 00:02:21,560 É totalmente de se esperar, mesmo - para estar conversando com algumas 45 00:02:21,560 --> 00:02:22,370 amigos ao seu lado. 46 00:02:22,370 --> 00:02:25,240 Se ele ou ela está lutando com algum tema, e você é como, oh, bem vamos 47 00:02:25,240 --> 00:02:27,750 me dar-lhe um vislumbre de alguma linha de código que eu escrevi. 48 00:02:27,750 --> 00:02:28,290 Isso é bom. 49 00:02:28,290 --> 00:02:28,700 Isso acontece. 50 00:02:28,700 --> 00:02:31,580 E isso é muito favorável, eu acho que, com o processo de aprendizagem. 51 00:02:31,580 --> 00:02:35,270 Onde a linha, mais uma vez, fica cruzada é quando a cabeça é inclinada por cima da espécie 52 00:02:35,270 --> 00:02:38,800 aqui para segundo longe demais ou minutos para que realmente a ter apenas 53 00:02:38,800 --> 00:02:41,250 foi uma oportunidade de desbloqueio para o seu amigo. 54 00:02:41,250 --> 00:02:43,870 E, certamente, quando as coisas ficam trocadas via e-mail e Dropbox e 55 00:02:43,870 --> 00:02:45,350 semelhante, há também o é a linha. 56 00:02:45,350 --> 00:02:48,940 Então, por todos os meios, se sentir confortável e se sentir encorajados a conversar com amigos 57 00:02:48,940 --> 00:02:51,270 e colegas sobre Série de Exercícios e muito mais. 58 00:02:51,270 --> 00:02:54,680 E só percebe que o que em última análise, apresentar deve ser realmente a 59 00:02:54,680 --> 00:02:57,780 produto de sua criação e não outra pessoa. 60 00:02:57,780 --> 00:03:01,010 >> Assim, na mesma linha de criaturas peluches, você pode 61 00:03:01,010 --> 00:03:02,820 conheço esse cara aqui. 62 00:03:02,820 --> 00:03:06,180 Portanto, este é um filme terrivelmente brega de anos atrás. 63 00:03:06,180 --> 00:03:08,680 Alguém aqui viu Spaceballs? 64 00:03:08,680 --> 00:03:09,120 Tudo bem. 65 00:03:09,120 --> 00:03:10,220 Assim, um bom número aqui. 66 00:03:10,220 --> 00:03:13,840 Então esta é a nossa maneira maravilhosamente acadêmica de introduzir finalmente hoje 67 00:03:13,840 --> 00:03:15,130 a noção de criptografia. 68 00:03:15,130 --> 00:03:19,010 E assim um dos problemas de domínio específico para pset 2, que virá 69 00:03:19,010 --> 00:03:22,770 amanhã à noite tarde, é mergulhar no mundo da criptografia, o que 70 00:03:22,770 --> 00:03:26,380 é a arte de criptografia ou codificação da informação. 71 00:03:26,380 --> 00:03:30,160 E esta última instância, para o mundo da segurança. 72 00:03:30,160 --> 00:03:34,440 >> Agora mais segurança para nós vem na forma de mecanismos muito mundanas. 73 00:03:34,440 --> 00:03:36,920 Todos nós temos nomes de usuário e senhas. 74 00:03:36,920 --> 00:03:41,350 E todos nós temos nomes de usuários e senhas muito ruins, mais provável. 75 00:03:41,350 --> 00:03:45,250 Se sua senha é a mesma em vários sites, que provavelmente não é 76 00:03:45,250 --> 00:03:47,920 a melhor idéia, como discutiremos em direção ao fim do semestre. 77 00:03:47,920 --> 00:03:51,680 Se sua senha é escrito em uma nota - não é brincadeira - em seu 78 00:03:51,680 --> 00:03:55,130 monitor, que também não é necessariamente o melhor projeto, mas bastante comum 79 00:03:55,130 --> 00:03:56,140 fenômeno. 80 00:03:56,140 --> 00:04:00,420 E se você não está usando criptografia para criptografar suas senhas, elas são 81 00:04:00,420 --> 00:04:01,610 particularmente vulneráveis. 82 00:04:01,610 --> 00:04:04,670 Então, se você acha que está sendo super inteligente por ter uma palavra oculta 83 00:04:04,670 --> 00:04:07,740 documento em algum lugar no seu disco rígido que tem todas as suas senhas, mas 84 00:04:07,740 --> 00:04:10,550 ele está em uma pasta que ninguém vai procurar, isso também não é muito 85 00:04:10,550 --> 00:04:11,540 mecanismo seguro. 86 00:04:11,540 --> 00:04:15,100 E então o que pset 2 irá introduzir é esta arte de criptografia e 87 00:04:15,100 --> 00:04:18,300 lutando informações para que coisas como senhas são 88 00:04:18,300 --> 00:04:19,500 tudo o mais seguro. 89 00:04:19,500 --> 00:04:24,500 De forma a motivar este problema muito no mundo real com um muito não do mundo real 90 00:04:24,500 --> 00:04:28,740 cenário, deixe-me apresentá-lo a um dos nossos clipes favoritos aqui deste 91 00:04:28,740 --> 00:04:29,895 filme, Spaceballs. 92 00:04:29,895 --> 00:04:30,565 >> [REPRODUÇÃO] 93 00:04:30,565 --> 00:04:32,995 -Helmet, você demônio, o que está acontecendo? 94 00:04:32,995 --> 00:04:34,730 O que você está fazendo com a minha filha? 95 00:04:34,730 --> 00:04:38,960 -Permita-me apresentar o cirurgião plástico brilhante jovem, o Dr. Philip 96 00:04:38,960 --> 00:04:43,290 Schlotkin, o homem maior nariz em todo o 97 00:04:43,290 --> 00:04:45,526 universo e Beverly Hills. 98 00:04:45,526 --> 00:04:46,450 -Sua Alteza. 99 00:04:46,450 --> 00:04:47,380 -Nariz trabalho? 100 00:04:47,380 --> 00:04:48,035 Não estou entendendo. 101 00:04:48,035 --> 00:04:49,480 Ela já tinha um trabalho nariz. 102 00:04:49,480 --> 00:04:51,490 Foi um presente de 16 doce. 103 00:04:51,490 --> 00:04:53,090 -Não, não é o que você pensa. 104 00:04:53,090 --> 00:04:55,150 É muito, muito pior. 105 00:04:55,150 --> 00:04:59,860 Se você não me dá a combinação do escudo de ar, o Dr. Schlotkin vontade 106 00:04:59,860 --> 00:05:04,135 dar a sua filha de volta seu velho nariz. 107 00:05:04,135 --> 00:05:05,385 -Não! 108 00:05:08,202 --> 00:05:10,186 De onde você tirou isso? 109 00:05:10,186 --> 00:05:11,178 -Tudo bem. 110 00:05:11,178 --> 00:05:11,674 Eu vou dizer. 111 00:05:11,674 --> 00:05:12,666 Eu vou dizer. 112 00:05:12,666 --> 00:05:14,154 -Não, papai, não. 113 00:05:14,154 --> 00:05:15,150 Você não deve. 114 00:05:15,150 --> 00:05:16,460 -Está bem, minha querida. 115 00:05:16,460 --> 00:05:18,450 Eu vou sentir falta do seu nariz novo. 116 00:05:18,450 --> 00:05:21,550 Mas eu não vou dizer-lhes a combinação, não importa o quê. 117 00:05:21,550 --> 00:05:23,100 -Muito bem. 118 00:05:23,100 --> 00:05:25,510 Dr. Schlotkin, faça o seu pior. 119 00:05:25,510 --> 00:05:26,760 -O prazer é meu. 120 00:05:30,560 --> 00:05:31,180 -Não! 121 00:05:31,180 --> 00:05:33,450 Espere, espere. 122 00:05:33,450 --> 00:05:34,770 Eu vou dizer. 123 00:05:34,770 --> 00:05:36,400 Eu vou dizer. 124 00:05:36,400 --> 00:05:38,630 -Eu sabia que ele iria trabalhar. 125 00:05:38,630 --> 00:05:42,040 Tudo bem, dê para mim. 126 00:05:42,040 --> 00:05:46,890 -A combinação é um. 127 00:05:46,890 --> 00:05:47,290 -One. 128 00:05:47,290 --> 00:05:48,183 -One. 129 00:05:48,183 --> 00:05:48,950 -Two. 130 00:05:48,950 --> 00:05:49,370 -Two. 131 00:05:49,370 --> 00:05:50,450 -Two. 132 00:05:50,450 --> 00:05:50,715 -Três 133 00:05:50,715 --> 00:05:51,380 -Três. 134 00:05:51,380 --> 00:05:52,390 -Três. 135 00:05:52,390 --> 00:05:53,200 -Quatro. 136 00:05:53,200 --> 00:05:53,720 -Quatro. 137 00:05:53,720 --> 00:05:55,830 -Quatro. 138 00:05:55,830 --> 00:05:56,580 Cinco 139 00:05:56,580 --> 00:05:57,120 -Cinco. 140 00:05:57,120 --> 00:05:58,560 -Cinco. 141 00:05:58,560 --> 00:06:03,770 -Assim, a combinação é um, dois, três, quatro, cinco. 142 00:06:03,770 --> 00:06:06,745 Essa é a combinação mais estúpida que eu já ouvi na minha vida. 143 00:06:06,745 --> 00:06:09,290 Esse é o tipo de coisa que um idiota teria em sua bagagem. 144 00:06:09,290 --> 00:06:11,540 -Obrigado, sua Alteza. 145 00:06:11,540 --> 00:06:12,940 -O que você fez? 146 00:06:12,940 --> 00:06:14,230 -Eu desliguei a parede. 147 00:06:14,230 --> 00:06:14,630 -Não, você não fez. 148 00:06:14,630 --> 00:06:15,430 Você desligou o filme todo. 149 00:06:15,430 --> 00:06:16,722 -Eu devo ter pressionado o botão errado. 150 00:06:16,722 --> 00:06:18,078 -Bem, colocá-lo de volta. 151 00:06:18,078 --> 00:06:18,805 Coloque o filme novamente. 152 00:06:18,805 --> 00:06:19,080 -Sim, senhor. 153 00:06:19,080 --> 00:06:19,270 Sim, senhor. 154 00:06:19,270 --> 00:06:19,830 -Vamos, Erna. 155 00:06:19,830 --> 00:06:20,270 Venha, Gretchen. 156 00:06:20,270 --> 00:06:22,850 É claro que você sabe que eu ainda vou ter de cobrá-lo por isso. 157 00:06:27,400 --> 00:06:28,325 -Bem, isso funcionou? 158 00:06:28,325 --> 00:06:29,550 Onde está o portão? 159 00:06:29,550 --> 00:06:29,910 -Funcionou, senhor. 160 00:06:29,910 --> 00:06:30,770 Nós temos a combinação. 161 00:06:30,770 --> 00:06:31,390 -Grande. 162 00:06:31,390 --> 00:06:35,630 Agora podemos tomar todas último suspiro de ar fresco do planeta Druidia. 163 00:06:35,630 --> 00:06:36,550 Qual é a combinação? 164 00:06:36,550 --> 00:06:38,805 -Um, dois, três, quatro, cinco. 165 00:06:38,805 --> 00:06:40,610 -Um, dois, três, quatro, cinco? 166 00:06:40,610 --> 00:06:41,070 -Sim. 167 00:06:41,070 --> 00:06:41,760 -Isso é incrível. 168 00:06:41,760 --> 00:06:45,200 Eu tenho a mesma combinação na minha bagagem. 169 00:06:45,200 --> 00:06:47,800 Prepare Spaceball 1 para partida imediata. 170 00:06:47,800 --> 00:06:48,536 -Sim, senhor. 171 00:06:48,536 --> 00:06:52,350 -E mudar a combinação na minha bagagem. 172 00:06:52,350 --> 00:06:53,250 -Ai! 173 00:06:53,250 --> 00:06:55,020 [REPRODUÇÃO FIM] 174 00:06:55,020 --> 00:06:57,470 >> DAVID J. MALAN: Um filme surpreendente que você deve ver agora tudo. 175 00:07:00,600 --> 00:07:06,540 Assim, no contexto aqui é que, com dados inseguras vem uma oportunidade para 176 00:07:06,540 --> 00:07:07,790 criptografá-lo e para embaralhar-lo. 177 00:07:07,790 --> 00:07:11,060 E de modo que este, por exemplo, é um exemplo de uma mensagem encriptada. 178 00:07:11,060 --> 00:07:12,980 Isso realmente diz algo em Inglês. 179 00:07:12,980 --> 00:07:14,750 Mas não é claramente totalmente óbvio. 180 00:07:14,750 --> 00:07:17,360 E vamos fechar o círculo hoje a separar o que este segredo 181 00:07:17,360 --> 00:07:18,380 mensagem aqui é. 182 00:07:18,380 --> 00:07:22,370 Mas no mundo real dos computadores, as coisas nem sequer olhar como eles pudessem 183 00:07:22,370 --> 00:07:23,440 ser frases em inglês. 184 00:07:23,440 --> 00:07:27,500 Por exemplo, este é o que você pode encontrar em um padrão do Linux ou Mac ou 185 00:07:27,500 --> 00:07:32,080 Unix computador em um arquivo que foi uma vez chamado de arquivo de senha. 186 00:07:32,080 --> 00:07:34,170 Hoje em dia, ele foi transferido para outros lugares. 187 00:07:34,170 --> 00:07:38,660 Mas se você olhar no lugar certo em um sistema, você vai ver não só o seu 188 00:07:38,660 --> 00:07:41,430 nome de usuário ou a de outras pessoas sobre o sistema, mas você vai ver um 189 00:07:41,430 --> 00:07:43,410 versão criptografada de sua senha. 190 00:07:43,410 --> 00:07:47,800 De fato, a cripta palavra ali sugere que as seguintes coisas são criptografados. 191 00:07:47,800 --> 00:07:52,030 E esta série de letras aparentemente aleatórias e personagens e números e 192 00:07:52,030 --> 00:07:56,370 assim por diante pode ser decifrada apenas por geralmente sabendo algum segredo - 193 00:07:56,370 --> 00:07:58,600 uma palavra secreta, um número secreto. 194 00:07:58,600 --> 00:08:02,760 E assim, de fato, a arte de criptografia, em última análise resume-se a confiança de alguns 195 00:08:02,760 --> 00:08:05,700 tipo e saber algo que alguém não faz. 196 00:08:05,700 --> 00:08:10,010 Vamos explorar isso em detalhes um pouco mais hoje e no pset para vir. 197 00:08:10,010 --> 00:08:11,860 >> E agora uma palavra sobre passa / falha. 198 00:08:11,860 --> 00:08:15,250 Assim, principalmente, como alguns de vocês já mergulhou pset 1, o aparelho, e 199 00:08:15,250 --> 00:08:18,390 um mundo muito novo para si, percebeu que as frustrações e 200 00:08:18,390 --> 00:08:21,340 dificuldades confusão e apenas técnica são de se esperar. 201 00:08:21,340 --> 00:08:24,410 Especialmente com o pset primeiro, onde há tanta coisa nova, apenas começando 202 00:08:24,410 --> 00:08:28,830 familiarizado com ls e cd e todos estes comandos arcanos em um novo ambiente. 203 00:08:28,830 --> 00:08:32,679 E isso é separado do material real e própria programação. 204 00:08:32,679 --> 00:08:35,960 Assim, perceber, também, que há certamente expediente que existem como 205 00:08:35,960 --> 00:08:36,770 a estrutura de suporte. 206 00:08:36,770 --> 00:08:38,620 Seções começam no próximo domingo. 207 00:08:38,620 --> 00:08:41,990 Mas o mais importante, se você está se sentindo só que este não é o 208 00:08:41,990 --> 00:08:44,420 mundo para você, perceba que ele realmente é apenas levar tempo. 209 00:08:44,420 --> 00:08:47,520 E se não fosse por essa oportunidade há anos para me de tomar uma classe 210 00:08:47,520 --> 00:08:50,840 aprovação / reprovação, honestamente, eu nunca teria sequer pôs os pés na sala de aula. 211 00:08:50,840 --> 00:08:53,520 E você pode mudar isso até, digamos, a segunda-feira quinta do curso. 212 00:08:53,520 --> 00:08:57,110 Então, se você está na borda agora, perceber que, em vez de cabeça em algum outro 213 00:08:57,110 --> 00:09:01,000 águas completamente, que certamente considerar apenas mudando de aprovação / reprovação. 214 00:09:01,000 --> 00:09:03,750 Novamente, não há realmente esta cultura aqui em Harvard de levar as coisas 215 00:09:03,750 --> 00:09:08,080 passa / falha uma vez que todos realmente quer alcançar ou overachieve. 216 00:09:08,080 --> 00:09:11,470 Mas, francamente, esta é uma ótima maneira de tentar algo que talvez não 217 00:09:11,470 --> 00:09:13,110 ser familiar para você. 218 00:09:13,110 --> 00:09:17,090 E você vai acabar fazendo, na maioria dos casos, bastante finos, talvez 219 00:09:17,090 --> 00:09:18,040 para sua grande surpresa. 220 00:09:18,040 --> 00:09:20,850 E, em termos mais concretos, o que eu acho que passa / falha geralmente faz, 221 00:09:20,850 --> 00:09:23,350 especialmente no que você pode ter experimentado com pset 0, se você colocar 222 00:09:23,350 --> 00:09:27,200 em 10 horas, 15 horas, 25 horas em alguns pset - e você está apenas batendo 223 00:09:27,200 --> 00:09:28,180 sua cabeça contra a parede, 224 00:09:28,180 --> 00:09:29,850 e está ficando super tarde, à noite, 225 00:09:29,850 --> 00:09:31,880 mas você tomou o pset como 90% do caminho, 226 00:09:31,880 --> 00:09:33,780 você sabe que você simplesmente não consegue descobrir uma coisa - 227 00:09:33,780 --> 00:09:36,830 passa / falha realmente leva a borda fora de uma classe como este, onde você pode classificar 228 00:09:36,830 --> 00:09:39,150 de dizer felizmente tudo bem, eu sei que não é perfeito. 229 00:09:39,150 --> 00:09:40,470 Mas eu trabalhei pra caramba sobre isso. 230 00:09:40,470 --> 00:09:42,410 Estou muito feliz com o local onde ele foi parar. 231 00:09:42,410 --> 00:09:44,780 E que vão atender as expectativas de aprovação / reprovação. 232 00:09:44,780 --> 00:09:46,850 Assim que manter isso em mente. 233 00:09:46,850 --> 00:09:47,140 >> Tudo bem. 234 00:09:47,140 --> 00:09:50,980 Então, aqueles de vocês que têm se esforçado para usar a Universidade de Harvard Wi-Fi saber 235 00:09:50,980 --> 00:09:54,780 que há um SSID CS50, uma conexão Wi-Fi por aí que você 236 00:09:54,780 --> 00:09:56,520 poderia ter melhor sorte para. 237 00:09:56,520 --> 00:09:59,430 É um pouco irônico que a senha para isso - se você gostaria de experimentar 238 00:09:59,430 --> 00:10:03,080 ligação a este para melhores velocidades e deixe-nos saber se não é melhor - 239 00:10:03,080 --> 00:10:09,240 é um, dois, três, quatro, cinco, todo o caminho até oito por oito é 240 00:10:09,240 --> 00:10:10,270 mais seguro do que cinco. 241 00:10:10,270 --> 00:10:15,520 Então, se você precisa da senha de acesso Wi-Fi, conecte-se sem fio CS50 aqui. 242 00:10:15,520 --> 00:10:16,950 Um, dois, três, quatro, cinco, seis, sete, oito. 243 00:10:16,950 --> 00:10:20,440 E pós em CS50 Discutir se você ainda tiver problemas intermitentes de conectividade, 244 00:10:20,440 --> 00:10:24,880 e vamos deixar que os poderes que conhece para este espaço. 245 00:10:24,880 --> 00:10:25,180 >> Tudo bem. 246 00:10:25,180 --> 00:10:30,350 Então, um teaser rápido, especialmente para aqueles de vocês que são meninos ou meninas de fãs 247 00:10:30,350 --> 00:10:31,900 de todas as coisas da Apple. 248 00:10:31,900 --> 00:10:37,566 O que eu retirado de alguns anos atrás era este arquivo aqui, ilock.c, apenas para 249 00:10:37,566 --> 00:10:40,930 tipo de tornar mais concreto e mais complexa alguns dos mais básicos C 250 00:10:40,930 --> 00:10:42,350 programas que tenho escrito. 251 00:10:42,350 --> 00:10:44,360 Então eu abri o arquivo, ilock.c. 252 00:10:44,360 --> 00:10:46,830 Ele está disponível na página de palestras para hoje. 253 00:10:46,830 --> 00:10:49,470 No lado esquerdo, você verá uma longa lista de funções. 254 00:10:49,470 --> 00:10:51,860 Assim, o sujeito que escreveu este escreveu um monte de funções, 255 00:10:51,860 --> 00:10:53,290 mais do que apenas principal. 256 00:10:53,290 --> 00:10:55,490 Ele usou um monte de bibliotecas aqui. 257 00:10:55,490 --> 00:11:00,450 E se começarmos a percorrer, o que isto realmente é é o próprio 258 00:11:00,450 --> 00:11:04,670 primeiro, eu acredito, crack para o iPhone original. 259 00:11:04,670 --> 00:11:08,000 Quando você queria fazer o jailbreak do iPhone original, o que significa untether 260 00:11:08,000 --> 00:11:11,800 -os da AT & T e, na verdade, instalar um software especial sobre ele e fazer as coisas 261 00:11:11,800 --> 00:11:13,510 que a Apple não quer que as pessoas fazem - 262 00:11:13,510 --> 00:11:17,020 Bem, alguém teve tempo para descobrir exatamente como eles poderiam explorar 263 00:11:17,020 --> 00:11:20,880 falhas de software, erros, bugs, no software da Apple. 264 00:11:20,880 --> 00:11:22,650 E assim nasceu ilock.c. 265 00:11:22,650 --> 00:11:26,670 Que se você compilou em um computador e instalá-lo em um iPhone que 266 00:11:26,670 --> 00:11:29,810 foi conectado ao computador através de, por exemplo, um cabo USB, este lhe daria 267 00:11:29,810 --> 00:11:33,360 privilégios administrativos ou de raiz no seu iPhone e deixá-lo fazer muito bem 268 00:11:33,360 --> 00:11:34,170 o que quiser. 269 00:11:34,170 --> 00:11:36,740 >> E assim houve este gato fascinante e rato entre a Apple e 270 00:11:36,740 --> 00:11:39,920 o resto do mundo, em particular no que se, como muitas empresas, tentar bloquear 271 00:11:39,920 --> 00:11:43,220 suas coisas para baixo assim que você só pode fazer com ele o que eles pretendem. 272 00:11:43,220 --> 00:11:46,620 Mas, graças a pessoas como esta e sua compreensão de baixo nível 273 00:11:46,620 --> 00:11:50,580 detalhes e, neste caso, de programação C e um monte de as construções familiares 274 00:11:50,580 --> 00:11:54,630 que já começou a jogar com, você é realmente capaz de alavancar o 275 00:11:54,630 --> 00:11:59,050 hardware de uma maneira que achar melhor e não necessariamente uma entidade corporativa. 276 00:11:59,050 --> 00:12:01,360 Assim, por exemplo, eu não tenho idéia do que tudo isso está fazendo. 277 00:12:01,360 --> 00:12:03,220 Mas GetVersion soa bastante simples. 278 00:12:03,220 --> 00:12:05,480 E parece que essa é uma função que a pessoa escreveu. 279 00:12:05,480 --> 00:12:09,240 Tomar algum tipo de número inteiro como argumento, não retorna nada, mas 280 00:12:09,240 --> 00:12:13,080 parece loop com um laço e um aqui se a condição, se a condição, 281 00:12:13,080 --> 00:12:15,620 quebrar, e de alguma forma se relaciona com números de versão. 282 00:12:15,620 --> 00:12:16,700 Se rolar - 283 00:12:16,700 --> 00:12:19,570 mesmo que muitas destas palavras-chave vai ser novo, e há uma 284 00:12:19,570 --> 00:12:22,590 série de funções no aqui nunca vimos e talvez nunca mais ver 285 00:12:22,590 --> 00:12:23,830 o curso do semestre - 286 00:12:23,830 --> 00:12:27,150 no final do dia, ele segue as mesmas regras e lógica que temos sido 287 00:12:27,150 --> 00:12:28,760 jogando com até agora. 288 00:12:28,760 --> 00:12:34,220 Portanto, este é velho demais para quebrar seu iPhone ou 3s 4s ou 5s em breve, estes dias, 289 00:12:34,220 --> 00:12:37,320 mas sei que está tudo muito derivado deste mundo que temos 290 00:12:37,320 --> 00:12:38,430 mergulhou. 291 00:12:38,430 --> 00:12:41,900 >> Então, vamos dar uma olhada em um exemplo um pouco mais simples. 292 00:12:41,900 --> 00:12:46,100 Este, apenas para se aquecer com uma sintaxe e também alguns outros dados 293 00:12:46,100 --> 00:12:49,240 tipo que temos falado, mas realmente não tenho visto em C. Portanto, este é um 294 00:12:49,240 --> 00:12:51,680 arquivo chamado positive1.c. 295 00:12:51,680 --> 00:12:55,120 E por os comentários no topo, isso só exige que o usuário fornecer um 296 00:12:55,120 --> 00:12:55,960 número positivo. 297 00:12:55,960 --> 00:12:59,530 Então, é um exemplo de um loop do-tempo, o que é bom para o usuário interativo 298 00:12:59,530 --> 00:13:01,980 programas em que você precisa dizer ao usuário para fazer alguma coisa. 299 00:13:01,980 --> 00:13:05,190 E se eles não cooperarem, você gritar com eles ou rejeitar a sua entrada. 300 00:13:05,190 --> 00:13:11,610 O caso em questão, eu vou fazer linhas 19 a 24, desde que o usuário tem 301 00:13:11,610 --> 00:13:14,310 Não me dado um número positivo. 302 00:13:14,310 --> 00:13:20,400 Agora esse detalhe aqui na linha 18, por que eu declarar n acima de toda essa 303 00:13:20,400 --> 00:13:24,490 construção de loop em vez de ao lado da linha 22, onde eu 304 00:13:24,490 --> 00:13:26,880 realmente importa para obter n? 305 00:13:26,880 --> 00:13:27,330 Sim? 306 00:13:27,330 --> 00:13:27,780 [Inaudível] 307 00:13:27,780 --> 00:13:29,040 >> DAVID J. MALAN: Sim, então essa questão do escopo. 308 00:13:29,040 --> 00:13:30,850 E em termos de leigo, o que âmbito se refere? 309 00:13:34,690 --> 00:13:36,610 Sim? 310 00:13:36,610 --> 00:13:37,860 [Inaudível] 311 00:13:40,040 --> 00:13:41,105 DAVID J. MALAN: Você pode falar um pouco mais alto? 312 00:13:41,105 --> 00:13:43,450 COLUNA 1: Onde você pode acessar uma variável particular. 313 00:13:43,450 --> 00:13:45,170 DAVID J. MALAN: Perfect. 314 00:13:45,170 --> 00:13:47,360 Onde você pode acessar uma determinada variável. 315 00:13:47,360 --> 00:13:50,400 E, geralmente, a regra de ouro até agora tem sido a de que o alcance de algumas 316 00:13:50,400 --> 00:13:55,860 variável é definida pelos aparelhos mais recentes encaracolados que você já viu. 317 00:13:55,860 --> 00:14:02,010 E por isso, neste caso, se eu cometi o erro de declarar n na linha 22, 318 00:14:02,010 --> 00:14:03,010 que a linha iria trabalhar. 319 00:14:03,010 --> 00:14:10,990 Gostaria de obter um int, e gostaria de colocá-lo em que n variável na linha 22. 320 00:14:10,990 --> 00:14:16,900 Mas qual linha de código que agora não tem idéia do que eu estou falando? 321 00:14:16,900 --> 00:14:22,650 Assim, 25, e verifica-se 24, bem como, porque, neste caso, ele está fora 322 00:14:22,650 --> 00:14:23,610 das chaves. 323 00:14:23,610 --> 00:14:27,280 Então, um pouco de incômodo, mas muito fácil de resolver, simplesmente declarando 324 00:14:27,280 --> 00:14:30,140 a variável fora da própria função. 325 00:14:30,140 --> 00:14:32,600 >> Agora vamos ver mais tarde hoje, você pode ir um passo além. 326 00:14:32,600 --> 00:14:34,860 E você pode até ficar um pouco preguiçoso - 327 00:14:34,860 --> 00:14:37,320 e isso não está a ser recomendado, em geral - 328 00:14:37,320 --> 00:14:42,260 mas você pode até ficar com preguiça e colocar uma variável globalmente, por assim dizer, não 329 00:14:42,260 --> 00:14:46,670 dentro de uma função, e não dentro de um laço, mas o arquivo em si, fora 330 00:14:46,670 --> 00:14:49,600 de todas as funções que você escreveu, como eu fiz aqui na linha 15. 331 00:14:49,600 --> 00:14:51,160 Mas este é geralmente desaprovado. 332 00:14:51,160 --> 00:14:55,680 Mas que esta é uma solução, por vezes, a outros problemas, como veremos 333 00:14:55,680 --> 00:14:56,620 eventualmente ver. 334 00:14:56,620 --> 00:14:58,130 Então, por agora, vamos deixá-lo assim. 335 00:14:58,130 --> 00:15:01,030 Mas vamos ver se podemos reescrever isso só para começar a expressar-nos um 336 00:15:01,030 --> 00:15:01,990 pouco diferente. 337 00:15:01,990 --> 00:15:05,330 >> Portanto, este programa, só para ficar claro, é positive1. 338 00:15:05,330 --> 00:15:11,810 Deixe-me ir à frente e aqui na minha janela de terminal fazer positive1, Enter. 339 00:15:11,810 --> 00:15:12,740 Compila, tudo bem. 340 00:15:12,740 --> 00:15:14,910 Eu vou correr positive1, pressione Enter. 341 00:15:14,910 --> 00:15:16,820 Eu exijo que você me dê um número inteiro positivo. 342 00:15:16,820 --> 00:15:18,260 Eu vou dizer -1. 343 00:15:18,260 --> 00:15:18,910 Isso não funcionou. 344 00:15:18,910 --> 00:15:22,150 0, 99, que parece funcionar. 345 00:15:22,150 --> 00:15:23,570 Talvez não o teste mais rigoroso. 346 00:15:23,570 --> 00:15:26,480 Mas pelo menos é um teste de sanidade bom que estamos no caminho certo. 347 00:15:26,480 --> 00:15:29,240 Então, agora deixe-me ir em frente e abra a versão dois deste. 348 00:15:29,240 --> 00:15:32,500 E o que é diferente já? 349 00:15:32,500 --> 00:15:35,140 Ele implementa a mesma coisa. 350 00:15:35,140 --> 00:15:40,660 Mas o que está pulando fora tão claramente diferente desta vez? 351 00:15:40,660 --> 00:15:42,560 Sim, assim que este bool em verde. 352 00:15:42,560 --> 00:15:45,980 Gedit tem destaque na palavra-chave deste verde conhecida como bool, 353 00:15:45,980 --> 00:15:47,000 que é um tipo de dados. 354 00:15:47,000 --> 00:15:51,080 Ele não vem construído em a todas as versões de C. Você precisa incluir um 355 00:15:51,080 --> 00:15:52,010 biblioteca específica. 356 00:15:52,010 --> 00:15:54,770 No nosso caso, incluí a biblioteca para que CS50 357 00:15:54,770 --> 00:15:56,460 ter acesso a bool. 358 00:15:56,460 --> 00:15:59,810 Mas, na linha 18, parece que temos um valor booleano aqui chamado agradecido. 359 00:15:59,810 --> 00:16:01,040 Então, eu poderia ter chamado este nada. 360 00:16:01,040 --> 00:16:04,500 Mas eu liguei para ele grato apenas para transmitir algum tipo de significado semântico. 361 00:16:04,500 --> 00:16:07,930 Portanto, inicialmente na linha 18, eu não sou aparentemente grato porque o 362 00:16:07,930 --> 00:16:12,150 Valor booleano grato é inicializado como false na linha 18. 363 00:16:12,150 --> 00:16:16,890 E então parece que eu fiz aqui em linhas de 21 a 23 é que eu acabei de 364 00:16:16,890 --> 00:16:18,610 tipo de reescrita minha lógica. 365 00:16:18,610 --> 00:16:21,020 Portanto, não funcionalmente diferente. 366 00:16:21,020 --> 00:16:26,940 Mas, na linha 22, agora, posso verificar se o int o usuário tenha fornecido é maior do que 367 00:16:26,940 --> 00:16:31,120 0, então eu simplesmente alterar o valor de grato a verdade. 368 00:16:31,120 --> 00:16:32,290 E por que eu faria isso? 369 00:16:32,290 --> 00:16:35,600 Porque, na linha 25, aparentemente, eu estou indo para verificar uma condição. 370 00:16:35,600 --> 00:16:39,380 Faça isso loop while grato é falsa. 371 00:16:39,380 --> 00:16:43,610 >> Então eu proponho isso como uma alternativa para uma versão porque é pelo menos um 372 00:16:43,610 --> 00:16:45,130 pouco mais intuitivo, talvez. 373 00:16:45,130 --> 00:16:46,900 É um pouco mais fundamentada em Inglês. 374 00:16:46,900 --> 00:16:51,710 Então faça o seguinte enquanto você não está grato ou agradecido enquanto é falso. 375 00:16:51,710 --> 00:16:55,890 E desta vez, também, eu aparentemente não se importa lembrar que o usuário digitou 376 00:16:55,890 --> 00:16:57,730 no aviso, porque não há nenhuma variável n. 377 00:16:57,730 --> 00:16:58,650 Então, na verdade, eu - 378 00:16:58,650 --> 00:17:00,080 uma pequena mentira lá. 379 00:17:00,080 --> 00:17:02,770 Funcionalmente, o programa é um pouco diferente, uma vez que chegar ao fundo da 380 00:17:02,770 --> 00:17:04,819 porque eu não estou lembrando o que n é. 381 00:17:04,819 --> 00:17:09,579 Mas eu queria demonstrar aqui também que mesmo que temos visto e GetInt 382 00:17:09,579 --> 00:17:13,920 GetString ser utilizado no lado da mão direita de um sinal de igual modo que, até agora, 383 00:17:13,920 --> 00:17:17,160 lembrarmos o valor, tecnicamente, isso não é estritamente necessário. 384 00:17:17,160 --> 00:17:20,950 Se por qualquer motivo você simplesmente não se importam para salvar o valor, você só quer 385 00:17:20,950 --> 00:17:25,710 para verificar o valor, observe que podemos simplesmente escrever isso como GetInt aberto 386 00:17:25,710 --> 00:17:27,000 paren, paren perto. 387 00:17:27,000 --> 00:17:30,460 Essa função vai retornar um valor, como temos vindo a dizer. 388 00:17:30,460 --> 00:17:32,010 Vai lhe dar de volta um int. 389 00:17:32,010 --> 00:17:36,450 E se você acha que mentalmente de isso acontecer, quando eu digitar 99, GetInt 390 00:17:36,450 --> 00:17:38,160 devolve o número 99. 391 00:17:38,160 --> 00:17:41,330 E assim, conceitualmente, é como se o meu código eram, na verdade isso. 392 00:17:41,330 --> 00:17:45,880 Então, se 99 é de fato maior que 0, então grato se torna verdade. 393 00:17:45,880 --> 00:17:50,420 Então percebe ooh linha 25, estamos a fazer porque eu sou grato agora. 394 00:17:50,420 --> 00:17:54,590 E na linha 26, nós simplesmente dizer, obrigado pela inteiro positivo, o que quer que 395 00:17:54,590 --> 00:17:55,710 passou a ser. 396 00:17:55,710 --> 00:17:58,900 >> Agora vamos fazer açúcar sintático ligeiro aqui, por assim dizer. 397 00:17:58,900 --> 00:18:02,990 Vamos ver se conseguimos limpar essa linha 25 com essa variação terceira e última 398 00:18:02,990 --> 00:18:04,640 em positive3. 399 00:18:04,640 --> 00:18:08,250 Então, observe a única diferença agora é que linha de código? 400 00:18:11,930 --> 00:18:13,260 Sim, então 25. 401 00:18:13,260 --> 00:18:15,520 E nós não temos realmente visto esse truque ainda. 402 00:18:15,520 --> 00:18:19,510 Mas fez ver o ponto de exclamação na segunda-feira, o que denota o quê? 403 00:18:19,510 --> 00:18:20,970 Então, não, negação ou. 404 00:18:20,970 --> 00:18:23,460 Então, ter um valor booleano e virar o seu valor. 405 00:18:23,460 --> 00:18:24,390 Verdade torna-se falsa. 406 00:18:24,390 --> 00:18:25,500 Falso se torna verdadeiro. 407 00:18:25,500 --> 00:18:28,910 Então isso, eu gostaria de propor, é até um pouco mais intuitiva de um modo de 408 00:18:28,910 --> 00:18:32,200 escrever o código, porque eu ainda inicializar grato a falso. 409 00:18:32,200 --> 00:18:33,530 Eu continuo a fazer o seguinte. 410 00:18:33,530 --> 00:18:35,700 Eu defini grato a verdade quando chegar a hora. 411 00:18:35,700 --> 00:18:40,690 Mas agora você pode realmente apenas traduzir este código verbalmente esquerda para a direita, 412 00:18:40,690 --> 00:18:42,550 enquanto não agradecido. 413 00:18:42,550 --> 00:18:46,170 Porque bang, ou ponto de exclamação, denota a noção de não, então enquanto 414 00:18:46,170 --> 00:18:47,010 Não agradecido. 415 00:18:47,010 --> 00:18:49,740 >> Então, novamente, não introduziram novos conceitos em si. 416 00:18:49,740 --> 00:18:53,230 Nós conversamos sobre Booleanos para trás quando nós tocamos com o Scratch. 417 00:18:53,230 --> 00:18:55,690 Mas percebo agora podemos apenas começar a escrever o nosso código em 418 00:18:55,690 --> 00:18:56,550 muitas maneiras diferentes. 419 00:18:56,550 --> 00:19:00,010 Assim, especialmente no pset1, se você é uma espécie de luta para descobrir a maneira de 420 00:19:00,010 --> 00:19:03,400 escrever um programa, a probabilidade de que você está com sorte porque não vai ser qualquer 421 00:19:03,400 --> 00:19:05,780 número de soluções que você pode acontecer em cima. 422 00:19:05,780 --> 00:19:09,850 Por exemplo, este é apenas três, mesmo para o mais simples dos programas. 423 00:19:09,850 --> 00:19:10,180 Tudo bem. 424 00:19:10,180 --> 00:19:13,860 E agora recordar na segunda-feira, que deixou esta nota com valores de retorno. 425 00:19:13,860 --> 00:19:18,280 Assim, para a primeira vez, nós escrevemos um programa que não tem apenas principal, 426 00:19:18,280 --> 00:19:22,240 também tem sua própria função personalizada que eu escrevi aqui. 427 00:19:22,240 --> 00:19:26,640 Assim, na linha 31 a 34, eu implementei uma função cubo. 428 00:19:26,640 --> 00:19:27,800 Não é complexo. 429 00:19:27,800 --> 00:19:29,830 É apenas uma vezes vezes um, neste caso. 430 00:19:29,830 --> 00:19:34,920 Mas o que é importante sobre o que é que eu estou tendo de entrada na forma de um e 431 00:19:34,920 --> 00:19:38,910 Estou retornando a produção na forma de vezes vezes um. 432 00:19:38,910 --> 00:19:43,940 >> Então agora eu tenho a capacidade, tanto como eu costumava fazer com printf sozinho, para chamar 433 00:19:43,940 --> 00:19:47,120 esta função chamando a função cubo. 434 00:19:47,120 --> 00:19:49,470 E a função cubo leva algum entrada. 435 00:19:49,470 --> 00:19:52,030 E a função cubo retorna alguma saída. 436 00:19:52,030 --> 00:19:56,660 E assim por contraste, printf apenas fiz algo. 437 00:19:56,660 --> 00:19:59,490 Ele não retornou qualquer coisa que importava - mesmo que, como um 438 00:19:59,490 --> 00:20:00,820 de lado, ele faz retornar um valor. 439 00:20:00,820 --> 00:20:02,650 Você geralmente só ignorá-lo. 440 00:20:02,650 --> 00:20:04,000 Printf apenas fiz algo. 441 00:20:04,000 --> 00:20:06,220 Ele tinha um efeito colateral de impressão à tela. 442 00:20:06,220 --> 00:20:09,480 Em contraste aqui, temos a função de cubo, que 443 00:20:09,480 --> 00:20:11,400 na verdade, retorna algo. 444 00:20:11,400 --> 00:20:12,960 >> Portanto, esta é geralmente - 445 00:20:12,960 --> 00:20:15,260 para aqueles familiarizados com isso, é uma idéia bastante simples. 446 00:20:15,260 --> 00:20:18,460 Mas, para os menos familiarizados com esta idéia de passar em insumos e obter 447 00:20:18,460 --> 00:20:21,700 saídas de volta, vamos tentar apenas algo simples super. 448 00:20:21,700 --> 00:20:25,180 Alguém está confortável chegando no palco brevemente? 449 00:20:25,180 --> 00:20:27,460 Você tem que estar confortável com uma câmera em você, também. 450 00:20:27,460 --> 00:20:27,640 Sim. 451 00:20:27,640 --> 00:20:28,610 Ok, qual é o seu nome? 452 00:20:28,610 --> 00:20:29,020 KEN: Ken. 453 00:20:29,020 --> 00:20:29,420 DAVID J. MALAN: Ken. 454 00:20:29,420 --> 00:20:29,810 Tudo bem, Ken. 455 00:20:29,810 --> 00:20:31,060 Vamos para cima. 456 00:20:31,060 --> 00:20:34,660 Então Ken vai ser uma função do tipo aqui. 457 00:20:34,660 --> 00:20:35,760 E vamos em frente e fazer isso. 458 00:20:35,760 --> 00:20:38,790 Vamos pegar um pouco de fantasia. 459 00:20:38,790 --> 00:20:39,770 Prazer em conhecê lo. 460 00:20:39,770 --> 00:20:41,010 Bem-vindo ao centro do palco. 461 00:20:41,010 --> 00:20:41,980 Tudo bem. 462 00:20:41,980 --> 00:20:45,590 Vamos bater este botão aqui. 463 00:20:45,590 --> 00:20:46,420 Tudo bem. 464 00:20:46,420 --> 00:20:49,490 Então aqui você tem um quadro moderno. 465 00:20:49,490 --> 00:20:53,050 E o que eu sou é a função principal, por exemplo. 466 00:20:53,050 --> 00:20:55,990 E eu não tenho um iPad na mão. 467 00:20:55,990 --> 00:20:59,000 Eu realmente não me lembro como - bem, na verdade, não posso dizer isso. 468 00:20:59,000 --> 00:21:02,200 Eu realmente não tenho boa caligrafia. 469 00:21:02,200 --> 00:21:05,260 E assim, portanto, eu quero que você imprimir algo na tela para mim. 470 00:21:05,260 --> 00:21:07,470 >> Então, eu estou sendo o programa principal. 471 00:21:07,470 --> 00:21:15,060 E eu vou ter que dizer isso por escrito na minha zero frango e 472 00:21:15,060 --> 00:21:16,600 em seguida, passando-lhe uma entrada. 473 00:21:16,600 --> 00:21:20,000 Assim como boba que este exercício é, a noção de funções e chamar um 474 00:21:20,000 --> 00:21:22,260 função e retornar uma função na verdade se resume a isso. 475 00:21:22,260 --> 00:21:23,120 Estou principal. 476 00:21:23,120 --> 00:21:26,270 Acabo de escrever printf ("algo") na tela. 477 00:21:26,270 --> 00:21:27,470 Estou executar esse programa. 478 00:21:27,470 --> 00:21:30,900 E logo que printf é chamado, ele tem um argumento - ou um parâmetro, 479 00:21:30,900 --> 00:21:31,660 às vezes - 480 00:21:31,660 --> 00:21:32,780 entre aspas duplas. 481 00:21:32,780 --> 00:21:33,960 Aqui é que o argumento. 482 00:21:33,960 --> 00:21:35,740 Estou passando-a para Ken. 483 00:21:35,740 --> 00:21:39,390 Agora ele é uma caixa preta escrito algum número de anos que, aparentemente, 484 00:21:39,390 --> 00:21:41,070 só sabe como imprimir coisas na tela. 485 00:21:41,070 --> 00:21:42,320 >> Então, execute. 486 00:21:48,842 --> 00:21:49,900 Isso não é ruim. 487 00:21:49,900 --> 00:21:50,890 Então, muito bom. 488 00:21:50,890 --> 00:21:52,900 Então, agora é feito Ken execução. 489 00:21:52,900 --> 00:21:55,810 Será que ele precisa me dar nada em troca? 490 00:21:55,810 --> 00:21:57,240 Portanto, não que temos visto até agora. 491 00:21:57,240 --> 00:21:59,230 Mais uma vez, printf faz realmente retornar um número. 492 00:21:59,230 --> 00:22:01,640 Mas vamos ignorar que, por agora, porque nunca usei. 493 00:22:01,640 --> 00:22:03,400 Então é isso para Ken. 494 00:22:03,400 --> 00:22:06,650 E agora principal volta a executar - 495 00:22:06,650 --> 00:22:09,630 principal assume o controle do programa novamente, porque essa linha de código, 496 00:22:09,630 --> 00:22:11,010 printf, é feita a execução. 497 00:22:11,010 --> 00:22:13,890 E nós vamos sobre nosso modo de executar o que quer que as outras linhas estão lá. 498 00:22:13,890 --> 00:22:14,130 >> Tudo bem. 499 00:22:14,130 --> 00:22:17,080 Então, agora vamos tentar um exemplo um pouco diferente. 500 00:22:17,080 --> 00:22:22,430 E este tempo aqui, vamos primeiro limpar a tela aqui. 501 00:22:22,430 --> 00:22:24,670 E desta vez, vamos fazer a função de cubagem. 502 00:22:24,670 --> 00:22:27,350 Mas, desta vez, espero um valor de saída. 503 00:22:27,350 --> 00:22:28,630 Então, vamos em frente e fazer isso. 504 00:22:28,630 --> 00:22:35,680 Então agora eu tenho uma linha de código que diz que x = cubo (x). 505 00:22:35,680 --> 00:22:36,930 Então, na verdade vamos - 506 00:22:41,450 --> 00:22:43,940 a linha de código, recall, se parece com isso. 507 00:22:43,940 --> 00:22:45,960 x = cubo (x). 508 00:22:45,960 --> 00:22:48,100 Então, como é que isto vai funcionar? 509 00:22:48,100 --> 00:22:50,820 Então, vamos em frente e dar-lhe uma tela branca novamente. 510 00:22:50,820 --> 00:22:55,000 E eu vou escrever agora para baixo o valor de x, que neste momento 511 00:22:55,000 --> 00:23:01,080 tempo passa a ser, digamos, 2, para mantê-lo simples. 512 00:23:01,080 --> 00:23:04,890 Então, eu tenho escrito em um pedaço de papel o valor de 2, 513 00:23:04,890 --> 00:23:06,100 qual é o meu valor x. 514 00:23:06,100 --> 00:23:08,250 Eu entregá-lo a Ken. 515 00:23:08,250 --> 00:23:09,200 KEN: E eu só escrever a resposta? 516 00:23:09,200 --> 00:23:12,660 DAVID J. MALAN: Sim, vamos apenas escrever a resposta. 517 00:23:12,660 --> 00:23:13,030 Okay. 518 00:23:13,030 --> 00:23:16,280 E agora ele tem de voltar-me algo. 519 00:23:16,280 --> 00:23:17,560 Então - 520 00:23:17,560 --> 00:23:18,170 perfeito. 521 00:23:18,170 --> 00:23:18,840 Segue agradável. 522 00:23:18,840 --> 00:23:21,970 >> Então, agora ele me dá de volta o valor de 8, neste caso. 523 00:23:21,970 --> 00:23:23,220 E o que eu faço com ele? 524 00:23:23,220 --> 00:23:26,130 Bem, na verdade, vamos ver. 525 00:23:26,130 --> 00:23:26,640 Obter este direito. 526 00:23:26,640 --> 00:23:27,880 O que eu vou fazer com ele? 527 00:23:27,880 --> 00:23:31,900 Agora eu vou levar esse valor e, na verdade, armazená-lo naqueles 528 00:23:31,900 --> 00:23:33,400 mesmos bits na memória. 529 00:23:33,400 --> 00:23:35,030 Mas aviso, eu sou o tipo de luta aqui. 530 00:23:35,030 --> 00:23:38,280 Eu estou um pouco confuso, porque onde eu realmente escrever o valor de x? 531 00:23:38,280 --> 00:23:41,840 Porque o que eu acabei de fazer é fisicamente mão Ken um pedaço de papel 532 00:23:41,840 --> 00:23:44,400 que tinha o valor 2, que foi x. 533 00:23:44,400 --> 00:23:46,300 E, de fato, isso é precisamente o que acontece. 534 00:23:46,300 --> 00:23:50,100 Assim, verifica-se que quando você chamar uma função, e você passa um argumento 535 00:23:50,100 --> 00:23:54,130 como "Olá mundo" ou você passa um argumento como 2, geralmente, você está 536 00:23:54,130 --> 00:23:56,720 passando uma cópia do argumento. 537 00:23:56,720 --> 00:24:01,020 E assim como eu escrevi o número 2 aqui e entregou-a a Ken, o que deve 538 00:24:01,020 --> 00:24:04,760 significa que eu ainda tenho uma cópia do 2 valor em algum lugar. 539 00:24:04,760 --> 00:24:08,140 Porque na verdade, agora que eu comecei de volta o valor 8, eu preciso voltar no 540 00:24:08,140 --> 00:24:12,010 RAM e realmente escrever 8, onde uma vez eu tive o número 2. 541 00:24:12,010 --> 00:24:15,720 >> Então lembre-se visualmente essa noção de passagem em literalmente 542 00:24:15,720 --> 00:24:16,730 uma cópia do valor. 543 00:24:16,730 --> 00:24:19,570 Ken faz sua coisa, me dá de volta algo - neste caso, 544 00:24:19,570 --> 00:24:20,820 um valor como 8. 545 00:24:20,820 --> 00:24:22,660 E então eu tenho que fazer alguma coisa com esse valor, se eu 546 00:24:22,660 --> 00:24:24,880 quer mantê-lo por perto. 547 00:24:24,880 --> 00:24:29,470 Então, tudo isso será muito familiar antes do tempo. 548 00:24:29,470 --> 00:24:33,082 Muito obrigado por esta demo aqui, Ken. 549 00:24:33,082 --> 00:24:34,820 Tudo bem. 550 00:24:34,820 --> 00:24:36,720 Muito bem feito. 551 00:24:36,720 --> 00:24:40,610 Então, vamos ver como é que, em última análise relaciona-se com algumas das funções 552 00:24:40,610 --> 00:24:42,270 chamada que estamos fazendo aqui. 553 00:24:42,270 --> 00:24:47,610 Então deixe-me ir em frente e nos trazer de volta ao exemplo cubagem aqui. 554 00:24:47,610 --> 00:24:53,080 E perceber que, se queremos realmente começar a tomar isso ainda mais, vamos 555 00:24:53,080 --> 00:24:57,050 ter que estar atentos ao fato de que o número x que está sendo passado 556 00:24:57,050 --> 00:25:01,390 aqui é diferente do que realmente está sendo passado para a função. 557 00:25:01,390 --> 00:25:03,940 Então, novamente, este passou por cópia vai tornar-se bastante 558 00:25:03,940 --> 00:25:05,620 Germano em apenas um momento. 559 00:25:05,620 --> 00:25:09,320 >> Então, vamos dar uma olhada em algo que não funciona muito bem certo ainda. 560 00:25:09,320 --> 00:25:11,790 Eu estou indo para ir em frente e abrir um exemplo de buggy terceiro, que 561 00:25:11,790 --> 00:25:13,560 é falho por natureza. 562 00:25:13,560 --> 00:25:18,070 E ele é chamado buggy3, e implementa uma função de troca. 563 00:25:18,070 --> 00:25:23,500 Portanto, temos aqui uma função principal que x e y arbitrariamente inicializado para 564 00:25:23,500 --> 00:25:24,720 1 e 2, respectivamente. 565 00:25:24,720 --> 00:25:27,590 Nós poderíamos usar GetInt, mas só precisamos de um exercício simples. 566 00:25:27,590 --> 00:25:29,680 Então é codificado como 1 e 2. 567 00:25:29,680 --> 00:25:35,330 Em linhas 21 e 22, que, aparentemente, imprimir x e y, um por linha. 568 00:25:35,330 --> 00:25:39,620 Em seguida, na linha 23, eu afirmo que estou trocando estes valores, ponto, ponto, ponto. 569 00:25:39,620 --> 00:25:43,030 Eu aparentemente chamar uma função na linha 24 chamado de swap 570 00:25:43,030 --> 00:25:44,000 que leva dois argumentos. 571 00:25:44,000 --> 00:25:46,430 É totalmente legítimo para as funções de tomar dois argumentos. 572 00:25:46,430 --> 00:25:48,220 Temos visto printf fazê-lo já. 573 00:25:48,220 --> 00:25:50,370 Assim, aparentemente, tem de permuta x e y. 574 00:25:50,370 --> 00:25:53,010 E, como o próprio nome sugere, eu espero que ele vai 575 00:25:53,010 --> 00:25:54,320 trocar esses dois valores. 576 00:25:54,320 --> 00:25:57,560 Então eu reclamar na linha 25, trocados. 577 00:25:57,560 --> 00:26:01,570 E I reimprimir x e y com base no pressuposto de que 578 00:26:01,570 --> 00:26:02,830 eles de fato foram trocados. 579 00:26:02,830 --> 00:26:04,370 Mas se eu realmente executar este programa - 580 00:26:04,370 --> 00:26:06,060 deixe-me abrir uma janela de terminal. 581 00:26:06,060 --> 00:26:07,750 Deixe-me fazer buggy3. 582 00:26:07,750 --> 00:26:09,970 Como o nome sugere, este não vai acabar bem. 583 00:26:09,970 --> 00:26:14,690 Porque quando eu pressione Enter, observe que x é 1. 584 00:26:14,690 --> 00:26:15,720 y é 2. 585 00:26:15,720 --> 00:26:19,160 E ainda, ao final do programa, eles ainda são, na verdade, a mesma coisa. 586 00:26:19,160 --> 00:26:22,760 >> Assim, com base na demonstração apenas agora com Ken, o que está realmente acontecendo? 587 00:26:22,760 --> 00:26:24,660 Bem, vamos mergulhar nesta função swap. 588 00:26:24,660 --> 00:26:25,800 É super curto. 589 00:26:25,800 --> 00:26:28,020 É apenas algumas linhas de código longo. 590 00:26:28,020 --> 00:26:32,810 Mas qual é o problema fundamental, baseado na história simples contada 591 00:26:32,810 --> 00:26:34,270 aqui com Ken? 592 00:26:34,270 --> 00:26:36,115 Por que a troca de partido? 593 00:26:36,115 --> 00:26:37,365 [Inaudível] 594 00:26:39,840 --> 00:26:40,460 Exatamente. 595 00:26:40,460 --> 00:26:43,610 Então, nós estamos armazenando a uma cópia, e não a própria variável. 596 00:26:43,610 --> 00:26:46,810 Em outras palavras, troca aparentemente tem dois argumentos, um int. 597 00:26:46,810 --> 00:26:49,370 E é arbitrariamente chamado a e b. 598 00:26:49,370 --> 00:26:54,430 E aqui em cima, eu passei em X e Y, que são, respectivamente, 1 e 2. 599 00:26:54,430 --> 00:26:56,580 Mas eu não estou literalmente passando x. 600 00:26:56,580 --> 00:26:58,410 Eu não estou literalmente passando y. 601 00:26:58,410 --> 00:27:01,230 Estou passando uma cópia de x e uma cópia do y. 602 00:27:01,230 --> 00:27:05,180 É como se quase como se você copiado e colado em trocar os valores que 603 00:27:05,180 --> 00:27:07,440 você quer que ele realmente manipular. 604 00:27:07,440 --> 00:27:11,970 Então, se esse é o caso, quando eu, o programa, iniciar a execução 605 00:27:11,970 --> 00:27:14,140 linha 35, depois 36 - 606 00:27:14,140 --> 00:27:17,740 quando eu chegar à linha 37, neste ponto da história, o que é o valor de uma? 607 00:27:20,740 --> 00:27:24,850 Neste ponto da história, linha 37, que é o valor de um, neste ponto? 608 00:27:24,850 --> 00:27:25,980 Por isso, deve ser apenas uma. 609 00:27:25,980 --> 00:27:26,170 Certo? 610 00:27:26,170 --> 00:27:29,100 Como x foi passado como o primeiro argumento. 611 00:27:29,100 --> 00:27:33,150 E essa função apenas arbitrariamente está chamando seu primeiro argumento, a. 612 00:27:33,150 --> 00:27:35,130 Da mesma forma é y, o segundo argumento. 613 00:27:35,130 --> 00:27:37,930 E está apenas arbitrariamente chamar a b segundo argumento. 614 00:27:37,930 --> 00:27:40,510 >> Agora essa dicotomia é, na verdade, bastante simples explicou. 615 00:27:40,510 --> 00:27:40,880 Pense sobre isso. 616 00:27:40,880 --> 00:27:42,980 Nenhum de nós conheceu a pessoa que escreveu printf. 617 00:27:42,980 --> 00:27:49,880 Assim, certamente, ele ou ela não tem idéia do que nossas variáveis ​​30 anos mais tarde vão 618 00:27:49,880 --> 00:27:50,710 a ser chamado. 619 00:27:50,710 --> 00:27:55,110 Então, tem que haver uma distinção entre o que você chama de variáveis ​​em 620 00:27:55,110 --> 00:27:59,960 funções que você está escrevendo e que vocês chamam de variáveis ​​em funções que você está 621 00:27:59,960 --> 00:28:01,770 chamada ou usando. 622 00:28:01,770 --> 00:28:05,120 Portanto, em outras palavras, eu escrevi minhas variáveis ​​como x e y. 623 00:28:05,120 --> 00:28:08,060 Mas, se alguém tinha escrito a função swap, ele ou ela certamente 624 00:28:08,060 --> 00:28:10,480 não sei o que meus variáveis ​​vão ser chamados. 625 00:28:10,480 --> 00:28:13,850 Então percebe que é por isso que você tem essa dualidade de nomes. 626 00:28:13,850 --> 00:28:16,800 Tecnicamente, eu poderia fazer isso por coincidência. 627 00:28:16,800 --> 00:28:19,750 Mas eles ainda ser passado como cópias. 628 00:28:19,750 --> 00:28:22,940 Seria apenas pura coincidência esteticamente se essa pessoa que escreveu 629 00:28:22,940 --> 00:28:25,590 troca tinha usado os mesmos nomes. 630 00:28:25,590 --> 00:28:25,930 >> Tudo bem. 631 00:28:25,930 --> 00:28:29,010 Portanto, neste ponto da história, linha 37, um é um. 632 00:28:29,010 --> 00:28:30,410 b é 2. 633 00:28:30,410 --> 00:28:32,040 E agora devo proceder para trocá-los. 634 00:28:32,040 --> 00:28:34,730 Bem, primeiro de tudo, deixe-me realmente fazer isso muito mais simples. 635 00:28:34,730 --> 00:28:36,500 Eu não sei o que essas três linhas de código foram fazendo. 636 00:28:36,500 --> 00:28:37,370 Deixe-me fazer isso. 637 00:28:37,370 --> 00:28:38,850 b recebe um. 638 00:28:38,850 --> 00:28:40,170 obtém um b. 639 00:28:40,170 --> 00:28:41,450 Concluído. 640 00:28:41,450 --> 00:28:43,540 Por que isso é quebrado, logicamente? 641 00:28:46,980 --> 00:28:48,590 É o tipo da coisa intuitiva, certo? 642 00:28:48,590 --> 00:28:50,640 Assim, torna-se um b. 643 00:28:50,640 --> 00:28:52,450 E torna-se um b. 644 00:28:52,450 --> 00:28:55,410 Mas o problema é que, assim como a linha 37 é executada, o que é o 645 00:28:55,410 --> 00:28:58,170 valor de a e b? 646 00:28:58,170 --> 00:28:59,070 O mesmo, 1. 647 00:28:59,070 --> 00:29:03,460 Porque você já derrotado, por assim dizer, você mudou b para igualar um. 648 00:29:03,460 --> 00:29:06,000 Portanto, uma vez linha 37 é executado, isso é ótimo. 649 00:29:06,000 --> 00:29:09,940 Você agora tem duas cópias do número 1 dentro desta função. 650 00:29:09,940 --> 00:29:14,720 Então quando você diz na linha 38, um fica b, bem, você é do tipo de rosca. 651 00:29:14,720 --> 00:29:17,370 Porque você está apenas a atribuição de 1 a 1. 652 00:29:17,370 --> 00:29:20,400 Você meio que perdi o valor que você se preocupava. 653 00:29:20,400 --> 00:29:22,910 >> Assim, na versão original do presente, observe o que eu fiz. 654 00:29:22,910 --> 00:29:26,620 Eu em vez teve uma terceira linha de código que era assim. 655 00:29:26,620 --> 00:29:29,910 Eu declaro uma variável temporária - tmp é um nome muito comum 656 00:29:29,910 --> 00:29:31,240 para uma variável temporária. 657 00:29:31,240 --> 00:29:34,280 É um int porque tem que coincidir com o que eu quero fazer uma cópia. 658 00:29:34,280 --> 00:29:39,720 Eu armazenar uma cópia de um dentro de tmp. Portanto, uma vez linha 37 foi executado, 659 00:29:39,720 --> 00:29:41,390 o valor de a é - 660 00:29:41,390 --> 00:29:42,970 sanidade rápido check - 661 00:29:42,970 --> 00:29:43,460 1. 662 00:29:43,460 --> 00:29:45,780 O valor de b é 2. 663 00:29:45,780 --> 00:29:48,470 E o valor do tmp também é 1. 664 00:29:48,470 --> 00:29:51,470 Então agora eu executar a linha 38. 665 00:29:51,470 --> 00:29:57,180 Assim, uma vez linha 38 é executado, uma toma o valor de b. 666 00:29:57,180 --> 00:29:58,510 E b foi 2. 667 00:29:58,510 --> 00:30:00,500 Assim, é agora um 2. 668 00:30:00,500 --> 00:30:03,110 Então, neste ponto da história, um é de 2, b é 2, 669 00:30:03,110 --> 00:30:05,130 tmp e é 1. 670 00:30:05,130 --> 00:30:09,330 Então, agora, logicamente, nós podemos apenas valor tmp plop de em b. 671 00:30:09,330 --> 00:30:10,690 E estamos a fazer. 672 00:30:10,690 --> 00:30:12,170 >> Então nós resolvemos esse problema. 673 00:30:12,170 --> 00:30:16,040 Infelizmente, quando eu executar este programa sob esta forma, que na verdade não trocar 674 00:30:16,040 --> 00:30:17,700 quaisquer valores. 675 00:30:17,700 --> 00:30:18,950 Mas, para ser claro, por quê? 676 00:30:23,420 --> 00:30:26,310 Corrigi o problema lógico de um momento atrás. 677 00:30:26,310 --> 00:30:31,150 Mas, novamente, se eu executar este programa, X e Y permanecem inalteradas até o final de 678 00:30:31,150 --> 00:30:33,834 execução do programa. 679 00:30:33,834 --> 00:30:34,760 [Inaudível] 680 00:30:34,760 --> 00:30:36,030 DAVID J. MALAN: Então nós não retornaram nada. 681 00:30:36,030 --> 00:30:36,960 Então, isso é verdade. 682 00:30:36,960 --> 00:30:39,880 Mas acontece que há um pouco de um problema aqui, porque, até agora, o 683 00:30:39,880 --> 00:30:42,460 única coisa que tenho sido capaz de voltar é uma coisa. 684 00:30:42,460 --> 00:30:46,540 E esta é uma restrição de C. Você só pode retornar um valor realmente, 685 00:30:46,540 --> 00:30:48,970 caso em que, eu sou o tipo de preso aqui 686 00:30:48,970 --> 00:30:51,805 porque eu poderia retornar o novo valor de x ou que eu poderia voltar a 687 00:30:51,805 --> 00:30:53,160 novo valor de y. 688 00:30:53,160 --> 00:30:54,330 Mas eu quero os dois de volta. 689 00:30:54,330 --> 00:30:58,010 Então, retornando não é a solução simples aqui. 690 00:30:58,010 --> 00:30:59,770 Mas o problema fundamental é por quê? 691 00:30:59,770 --> 00:31:03,270 O que nós realmente trocados? 692 00:31:03,270 --> 00:31:04,010 a e b. 693 00:31:04,010 --> 00:31:07,670 Mas a e b são cópias de x e y, o que significa que apenas fez tudo isso 694 00:31:07,670 --> 00:31:10,080 trabalhar - só passou uns três minutos falando sobre a troca 695 00:31:10,080 --> 00:31:11,680 função e todas estas três variáveis. 696 00:31:11,680 --> 00:31:15,090 E isso é ótimo, perfeitamente correto em isolamento. 697 00:31:15,090 --> 00:31:20,230 Mas e âmbito de b é só nestas linhas aqui. 698 00:31:20,230 --> 00:31:24,130 Então, tal como um loop, se você declarar um inteiro i para dentro da 699 00:31:24,130 --> 00:31:27,400 loop - da mesma forma, se você está dentro de declarar a e b de uma função que 700 00:31:27,400 --> 00:31:30,550 você escreveu, eles são apenas válido dentro dessa função. 701 00:31:30,550 --> 00:31:35,020 O que significa que, logo que swap é feito execução e nós vamos de linha de 24 a 702 00:31:35,020 --> 00:31:38,380 linha 25, x e y não foram alteradas de forma alguma. 703 00:31:38,380 --> 00:31:42,580 Você desperdiçou apenas um monte de tempo a troca de cópias de variáveis. 704 00:31:42,580 --> 00:31:46,490 >> Assim, verifica-se que a solução para isso é, na verdade, não óbvia. 705 00:31:46,490 --> 00:31:49,210 Não é bem suficiente para retornar valores porque nós podemos 706 00:31:49,210 --> 00:31:50,320 retornar apenas um valor. 707 00:31:50,320 --> 00:31:53,370 E eu realmente quero trocar x e y ao mesmo tempo. 708 00:31:53,370 --> 00:31:55,020 Então, vamos voltar a isso. 709 00:31:55,020 --> 00:31:58,770 Mas, por agora, perceber que a questão fundamental deriva do fato de 710 00:31:58,770 --> 00:32:00,660 que a e b são cópias. 711 00:32:00,660 --> 00:32:03,450 E eles estão em seu próprio escopo. 712 00:32:03,450 --> 00:32:04,980 Bem, vamos tentar resolver isso de alguma forma. 713 00:32:04,980 --> 00:32:09,200 Deixe-me realmente rolar de volta aqui e abrir-se, digamos, uma quarta variante 714 00:32:09,200 --> 00:32:11,170 disso, buggy4. 715 00:32:11,170 --> 00:32:13,230 E o que sobre isso? 716 00:32:13,230 --> 00:32:16,690 Este é um problema semelhante, mas mais simples de olhar antes de tomar uma facada 717 00:32:16,690 --> 00:32:17,530 resolvê-lo. 718 00:32:17,530 --> 00:32:19,440 Este programa é chamado de incremento. 719 00:32:19,440 --> 00:32:24,320 E aparentemente inicializa um inteiro x 1 em linha 18. 720 00:32:24,320 --> 00:32:25,950 Eu, então, afirmar que x é 1. 721 00:32:25,950 --> 00:32:28,020 Eu, então, afirmam incrementando, ponto, ponto, ponto. 722 00:32:28,020 --> 00:32:29,460 Eu, então, chamar incremento. 723 00:32:29,460 --> 00:32:33,480 Mas, então, em linhas 22 e 23, eu afirmo que tem sido incrementado. 724 00:32:33,480 --> 00:32:37,780 Eu reivindico x é agora o que quer que seja, 2 presumivelmente. 725 00:32:37,780 --> 00:32:39,770 >> Mas este programa é buggy. 726 00:32:39,770 --> 00:32:41,020 Qual é o problema? 727 00:32:43,450 --> 00:32:44,418 Sim? 728 00:32:44,418 --> 00:32:45,668 [Inaudível] 729 00:32:49,260 --> 00:32:49,850 DAVID J. MALAN: Exatamente. 730 00:32:49,850 --> 00:32:52,430 Então x foi declarada, obviamente, na linha 18. 731 00:32:52,430 --> 00:32:54,410 Que está dentro de chaves principais de. 732 00:32:54,410 --> 00:32:58,470 Portanto, a resposta simples é que, bem, x existe aqui. 733 00:32:58,470 --> 00:33:01,510 Ela não existe na linha 32. 734 00:33:01,510 --> 00:33:03,710 Portanto, este programa realmente não vai nem compilar. 735 00:33:03,710 --> 00:33:07,910 O compilador, quando eu tentar compilar esse código, vai gritar comigo 736 00:33:07,910 --> 00:33:13,190 sobre alguns identificador não declarado ou alguma coisa nesse sentido. 737 00:33:13,190 --> 00:33:13,870 Na verdade, vamos tentar. 738 00:33:13,870 --> 00:33:15,235 Esta é fazer buggy4. 739 00:33:17,780 --> 00:33:18,190 Não é. 740 00:33:18,190 --> 00:33:22,030 Use de x identificador não declarado na linha 32. 741 00:33:22,030 --> 00:33:25,700 E, na verdade, vamos ser mais explícito aqui hoje para que esta seja útil em 742 00:33:25,700 --> 00:33:27,140 horário de expediente e em casa. 743 00:33:27,140 --> 00:33:29,000 Observe que é um pouco enigmática escrita. 744 00:33:29,000 --> 00:33:31,560 Mas o fato de que Clang tem gritado, dizendo 745 00:33:31,560 --> 00:33:36,970 buggy4.c: 32:5, é realmente útil. 746 00:33:36,970 --> 00:33:41,970 Isso significa que o erro está na linha 32 na posição de cinco caracteres. 747 00:33:41,970 --> 00:33:44,670 Então, um, dois, três, quatro, cinco. 748 00:33:44,670 --> 00:33:46,640 Isso é, de fato, onde está o problema. 749 00:33:46,640 --> 00:33:49,710 E também para manter em mente na hora de escritório e em casa, tenho sorte aqui. 750 00:33:49,710 --> 00:33:50,740 Eu tenho um erro. 751 00:33:50,740 --> 00:33:52,660 Vai ser relativamente fácil de corrigir. 752 00:33:52,660 --> 00:33:56,220 Mas se você receber uma tela cheia de mensagens de erro esmagadora, mais uma vez, 753 00:33:56,220 --> 00:33:59,240 perceber que o mais inferior pode ser apenas sintomático da 754 00:33:59,240 --> 00:34:00,320 os de nível superior. 755 00:34:00,320 --> 00:34:03,560 Então, sempre perseguir seus erros a partir de cima para baixo. 756 00:34:03,560 --> 00:34:06,720 Porque não pode ser apenas um efeito em cadeia que está sugerindo que você 757 00:34:06,720 --> 00:34:09,030 tem problemas de maneira mais do que você realmente faz. 758 00:34:09,030 --> 00:34:14,989 >> Então, como poderíamos corrigir isso se meu objetivo é incrementar x? 759 00:34:14,989 --> 00:34:15,370 O que é isso? 760 00:34:15,370 --> 00:34:15,620 Okay. 761 00:34:15,620 --> 00:34:16,679 Assim, podemos fazer x global. 762 00:34:16,679 --> 00:34:18,860 Vamos pegar o atalho que eu avisei sobre a anterior. 763 00:34:18,860 --> 00:34:20,550 Mas que diabo, só precisamos de uma solução rápida. 764 00:34:20,550 --> 00:34:23,949 Então vamos apenas dizer int x aqui. 765 00:34:23,949 --> 00:34:25,600 Isso faz x global. 766 00:34:25,600 --> 00:34:28,460 Então, agora principal tem acesso a ele. 767 00:34:28,460 --> 00:34:31,780 E incremento tem acesso a ele. 768 00:34:31,780 --> 00:34:33,860 E então deixe-me ir em frente e compile isso agora. 769 00:34:33,860 --> 00:34:36,330 Faça buggy4, Enter. 770 00:34:36,330 --> 00:34:37,440 Parece compilar. 771 00:34:37,440 --> 00:34:40,949 Vamos correr buggy4, e parece realmente funcionar. 772 00:34:40,949 --> 00:34:42,780 Agora, esta é uma dessas coisas - 773 00:34:42,780 --> 00:34:45,870 faça o que eu digo, não o que eu faço, como eu acabei de fazer aqui. 774 00:34:45,870 --> 00:34:49,239 Porque, em geral, os nossos programas vão ficar muito mais interessante e 775 00:34:49,239 --> 00:34:50,440 muito mais do que isso. 776 00:34:50,440 --> 00:34:53,199 E se a sua solução para os problemas da vida é apenas ah, colocar todo o 777 00:34:53,199 --> 00:34:57,550 variáveis ​​no topo do seu arquivo, muito rapidamente fazer programas de obter 778 00:34:57,550 --> 00:34:59,700 terrivelmente difícil de gerir. 779 00:34:59,700 --> 00:35:02,050 Fica mais difícil de pensar em novos nomes de variáveis. 780 00:35:02,050 --> 00:35:05,240 Fica mais difícil de entender o que está fazendo o que variável. 781 00:35:05,240 --> 00:35:08,250 >> E assim, em geral, isto não é uma boa solução. 782 00:35:08,250 --> 00:35:09,780 Então, vamos fazer isso melhor. 783 00:35:09,780 --> 00:35:11,920 Nós não queremos usar uma variável global aqui. 784 00:35:11,920 --> 00:35:14,050 Eu quero incrementar x. 785 00:35:14,050 --> 00:35:16,050 Então, eu poderia, obviamente - 786 00:35:16,050 --> 00:35:18,450 no final do dia, é uma espécie de uma história boba, porque acabamos de fazer isso. 787 00:35:18,450 --> 00:35:22,050 Mas se eu não sabia sobre esse operador, ou eu não tinha permissão para 788 00:35:22,050 --> 00:35:27,700 mudá-lo em principal em si, de que outra forma eu poderia implementar Ken aqui, este 789 00:35:27,700 --> 00:35:31,450 tempo de cubo, mas não para incrementar? 790 00:35:31,450 --> 00:35:32,700 Como faço para mudar esta coisa aqui? 791 00:35:32,700 --> 00:35:33,025 Sim. 792 00:35:33,025 --> 00:35:34,275 [Inaudível] 793 00:35:37,430 --> 00:35:38,000 DAVID J. MALAN: Ok, muito bom. 794 00:35:38,000 --> 00:35:40,490 Então, por que não eu passar em x? 795 00:35:40,490 --> 00:35:44,390 E então, em vez de devolvê-lo, por que não eu só faço retorno x + 1? 796 00:35:44,390 --> 00:35:46,370 Agora, mais algumas coisas têm que mudar aqui. 797 00:35:46,370 --> 00:35:47,530 Eu estou no caminho certo. 798 00:35:47,530 --> 00:35:48,910 O que mais eu preciso para ajustar? 799 00:35:48,910 --> 00:35:49,470 Alguém. 800 00:35:49,470 --> 00:35:49,882 Sim? 801 00:35:49,882 --> 00:35:51,530 [Inaudível] 802 00:35:51,530 --> 00:35:53,520 DAVID J. MALAN: Eu preciso alterar o tipo de retorno de incremento 803 00:35:53,520 --> 00:35:54,590 porque não está vazio. 804 00:35:54,590 --> 00:35:56,650 Vazio não significa nada está sendo devolvido. 805 00:35:56,650 --> 00:35:57,600 Mas, claramente, agora é. 806 00:35:57,600 --> 00:36:01,280 Então, isso precisa mudar para int para ser coerente com o que 807 00:36:01,280 --> 00:36:02,580 Na verdade, estou voltando. 808 00:36:02,580 --> 00:36:04,580 >> Agora outra coisa ainda é de buggy aqui. 809 00:36:04,580 --> 00:36:04,982 Sim? 810 00:36:04,982 --> 00:36:06,590 [Inaudível] 811 00:36:06,590 --> 00:36:07,630 DAVID J. MALAN: Então eu preciso incrementar x? 812 00:36:07,630 --> 00:36:10,336 [Inaudível] 813 00:36:10,336 --> 00:36:11,880 DAVID J. MALAN: Ah, então eu preciso passar x. 814 00:36:11,880 --> 00:36:13,300 Então eu preciso fazer isso aqui. 815 00:36:17,590 --> 00:36:19,690 Assim, o protótipo, eu tenho que mudar isso aqui. 816 00:36:19,690 --> 00:36:21,290 Portanto, este tem de se tornar um int. 817 00:36:21,290 --> 00:36:22,820 Isso tem de se tornar - 818 00:36:22,820 --> 00:36:23,670 hmm. 819 00:36:23,670 --> 00:36:24,710 Na verdade, tenho um bug aqui. 820 00:36:24,710 --> 00:36:25,780 Vamos corrigir isso primeiro. 821 00:36:25,780 --> 00:36:27,990 O que isso realmente deve ser? 822 00:36:27,990 --> 00:36:29,330 Então, ele tem que ser uma coisa int. 823 00:36:29,330 --> 00:36:30,340 Poderia ser x. 824 00:36:30,340 --> 00:36:33,120 Mas, francamente, se você começar a chamar toda a sua x variáveis, que vai começar 825 00:36:33,120 --> 00:36:35,250 menos e menos claro qual é qual. 826 00:36:35,250 --> 00:36:38,210 Então vamos escolher arbitrariamente uma convenção de nomenclatura diferente para o meu 827 00:36:38,210 --> 00:36:40,220 funções auxiliares, as funções que estou escrevendo. 828 00:36:40,220 --> 00:36:41,100 Vamos chamar-lhe um. 829 00:36:41,100 --> 00:36:44,500 Ou poderíamos chamá-lo - vamos chamá-lo even_number ser ainda mais explícito. 830 00:36:44,500 --> 00:36:47,610 Então eu tenho que devolver qualquer que seja o número é acrescido de 1. 831 00:36:47,610 --> 00:36:49,720 E agora eu tenho que mudar uma coisa aqui e um 832 00:36:49,720 --> 00:36:50,700 outra coisa aqui. 833 00:36:50,700 --> 00:36:54,150 O que eu tenho que mudar na linha 21 em primeiro lugar? 834 00:36:54,150 --> 00:36:55,390 Eu tenho que atribuir a x. 835 00:36:55,390 --> 00:36:57,480 Então eu não posso apenas chamar x incremento. 836 00:36:57,480 --> 00:37:01,000 Preciso lembrar a resposta, alterando o valor de x em 837 00:37:01,000 --> 00:37:02,020 o lado esquerdo. 838 00:37:02,020 --> 00:37:04,930 E mesmo que x é agora à esquerda e à direita, que é totalmente bom porque 839 00:37:04,930 --> 00:37:08,370 o lado direito é executado primeiro, então, é se jogou na esquerda 840 00:37:08,370 --> 00:37:10,240 coisa mão, x, neste caso. 841 00:37:10,240 --> 00:37:11,900 E então, finalmente, este é um reparo fácil agora. 842 00:37:11,900 --> 00:37:15,080 Este deve apenas combinar o que há lá embaixo. 843 00:37:15,080 --> 00:37:17,120 Número int. 844 00:37:17,120 --> 00:37:17,320 >> Tudo bem. 845 00:37:17,320 --> 00:37:20,290 Então, um monte de mudanças para uma função muito estúpido. 846 00:37:20,290 --> 00:37:24,250 Mas representante das coisas que nós vamos cada vez mais quer fazer. 847 00:37:24,250 --> 00:37:25,490 Então faça buggy4. 848 00:37:25,490 --> 00:37:26,485 Eu estraguei tudo em algum lugar. 849 00:37:26,485 --> 00:37:27,520 Oh, meu Deus. 850 00:37:27,520 --> 00:37:29,660 Cinco erros em, tipo, um programa de seis linha. 851 00:37:29,660 --> 00:37:36,500 Então, o que há de errado na linha 18, o personagem de 5? 852 00:37:36,500 --> 00:37:36,970 Tudo bem. 853 00:37:36,970 --> 00:37:39,330 Então eu tenho que declarar este int. 854 00:37:39,330 --> 00:37:39,630 Tudo bem. 855 00:37:39,630 --> 00:37:41,790 Então vamos ver, um monte de outros erros. 856 00:37:41,790 --> 00:37:42,230 Oh meu deus. 857 00:37:42,230 --> 00:37:43,880 19, 18, 21. 858 00:37:43,880 --> 00:37:46,020 Mas, novamente, vamos limpar a tela - 859 00:37:46,020 --> 00:37:48,660 L controle aqui - e re-run Clang. 860 00:37:48,660 --> 00:37:51,340 Então, cinco problemas que na verdade é apenas uma. 861 00:37:51,340 --> 00:37:53,500 Então, agora vamos executar buggy4, Enter. 862 00:37:53,500 --> 00:37:54,150 Ufa. 863 00:37:54,150 --> 00:37:57,434 x foi incrementado corretamente. 864 00:37:57,434 --> 00:37:58,420 >> Tudo bem. 865 00:37:58,420 --> 00:38:01,700 Qualquer dúvida sobre como incrementar números? 866 00:38:01,700 --> 00:38:02,896 Sim? 867 00:38:02,896 --> 00:38:06,864 SPEAKER 2: Por que é que você pode simplesmente mudar para o número x na variável 868 00:38:06,864 --> 00:38:08,860 nomear e ele vai saber o que você quer dizer? 869 00:38:08,860 --> 00:38:09,600 DAVID J. MALAN: Boa pergunta. 870 00:38:09,600 --> 00:38:13,130 Como é que eu posso simplesmente mudar para o número x eo programa vai saber 871 00:38:13,130 --> 00:38:13,990 imediatamente? 872 00:38:13,990 --> 00:38:16,120 Então, novamente, pensar nele como essa abstração. 873 00:38:16,120 --> 00:38:20,110 Então, se eu sou principal e Ken é incremental, francamente, eu não me importo 874 00:38:20,110 --> 00:38:21,540 o que Ken chama seu iPad. 875 00:38:21,540 --> 00:38:25,350 Eu não ligo para o que ele chama de nada que tenha a ver com a sua implementação 876 00:38:25,350 --> 00:38:26,550 essa funcionalidade. 877 00:38:26,550 --> 00:38:32,130 Portanto, este é um detalhe de implementação que eu, principal, não 878 00:38:32,130 --> 00:38:33,010 tem que se preocupar. 879 00:38:33,010 --> 00:38:37,440 E assim simplesmente mudar consistentemente dentro da função, número aqui 880 00:38:37,440 --> 00:38:41,340 e número aqui, é tudo o que preciso tanto tempo como eu recompilar. 881 00:38:41,340 --> 00:38:43,820 É uma espécie de gosto, se você pensar - muitos de nós, aqueles de vocês com motorista 882 00:38:43,820 --> 00:38:46,590 licenças que já percorridos, ou se você mesmo conduzido em um carro - 883 00:38:46,590 --> 00:38:50,710 a maioria de nós não tem idéia de como um carro funciona debaixo do capô. 884 00:38:50,710 --> 00:38:54,710 E, literalmente, se você abrir o capô, a maioria de nós - eu incluído - 885 00:38:54,710 --> 00:38:56,580 não estão indo para realmente saber o que estamos olhando. 886 00:38:56,580 --> 00:38:58,850 Tipo de como você pode se sentir com coisas como esta agora. 887 00:38:58,850 --> 00:39:01,380 Mas nós realmente não precisa se preocupar como o carro funciona. 888 00:39:01,380 --> 00:39:05,000 Nós não temos de cuidar o que todos os bastões e pistões e cabos dentro de 889 00:39:05,000 --> 00:39:07,700 o carro está realmente fazendo. 890 00:39:07,700 --> 00:39:11,360 >> Portanto, algo como o que vocês chamam o pistão não importa 891 00:39:11,360 --> 00:39:11,920 aqui neste caso. 892 00:39:11,920 --> 00:39:12,490 Mesma idéia. 893 00:39:12,490 --> 00:39:12,670 Sim? 894 00:39:12,670 --> 00:39:13,920 [Inaudível] 895 00:39:25,250 --> 00:39:29,530 DAVID J. MALAN: Se houvesse mais usos do momento xa variável atrás, 896 00:39:29,530 --> 00:39:32,220 você, programador, teria que mudar todos os lugares. 897 00:39:32,220 --> 00:39:35,230 Ou você pode literalmente fazer menu Arquivo, e, em seguida, localizar / substituir, 898 00:39:35,230 --> 00:39:36,270 algo assim. 899 00:39:36,270 --> 00:39:40,110 Mas você vai ter que fazer essas mudanças mesmo. 900 00:39:40,110 --> 00:39:41,200 Você tem que ser consistente. 901 00:39:41,200 --> 00:39:42,450 [Inaudível] 902 00:39:47,200 --> 00:39:48,960 DAVID J. MALAN: Uma ordem particular, como aqui? 903 00:39:48,960 --> 00:39:52,660 Se este era int outro número? 904 00:39:52,660 --> 00:39:52,940 Sim. 905 00:39:52,940 --> 00:39:56,430 Assim ordem importa quando você está chamando a função. 906 00:39:56,430 --> 00:40:00,350 Então, se eu estivesse chamando incremento aqui com algo vírgula alguma coisa, 907 00:40:00,350 --> 00:40:01,400 há um mapeamento direto. 908 00:40:01,400 --> 00:40:04,490 A primeira variável, o que é chamado, é feita uma cópia do primeiro 909 00:40:04,490 --> 00:40:05,480 argumento aqui. 910 00:40:05,480 --> 00:40:07,280 Desculpe, isso não deve ser um parêntese. 911 00:40:07,280 --> 00:40:09,300 O segundo argumento linhas acima com o segundo. 912 00:40:09,300 --> 00:40:11,220 >> Assim, a ordem, sim, importa. 913 00:40:11,220 --> 00:40:11,490 Tudo bem. 914 00:40:11,490 --> 00:40:13,360 Desculpe eu levei um longo caminho para chegar lá. 915 00:40:13,360 --> 00:40:14,610 Outras perguntas? 916 00:40:16,460 --> 00:40:16,850 Tudo bem. 917 00:40:16,850 --> 00:40:20,300 Então vamos ver se não podemos pintar uma imagem do que está realmente acontecendo 918 00:40:20,300 --> 00:40:22,160 aqui debaixo do capô, por assim dizer. 919 00:40:22,160 --> 00:40:26,310 Portanto, este é um retângulo que pode representar a memória do seu computador. 920 00:40:26,310 --> 00:40:31,240 Assim, mesmo se você não tem idéia de como funciona a memória ou como funciona a memória RAM, pelo menos 921 00:40:31,240 --> 00:40:33,590 assumir que você tem cachos de que estes dias. 922 00:40:33,590 --> 00:40:34,740 Você tem megabytes dele. 923 00:40:34,740 --> 00:40:35,760 Você tem gigabytes de-lo. 924 00:40:35,760 --> 00:40:40,690 E sabemos de zero semana que um byte é exatamente o que? 925 00:40:40,690 --> 00:40:41,280 8 bits. 926 00:40:41,280 --> 00:40:42,730 Certo, então oito zeros e uns. 927 00:40:42,730 --> 00:40:46,300 Então, se o seu computador tem um giga de RAM, dois GB de RAM estes dias, você tem um 928 00:40:46,300 --> 00:40:54,450 bilhão ou 2 bilhões de bytes de memória, ou cerca de 8 bilhões ou 16000000000 929 00:40:54,450 --> 00:40:56,560 bits, dentro do seu computador. 930 00:40:56,560 --> 00:40:59,710 Agora, ao contrário do exemplo Willy pouco Woolly, não é partículas magnéticas 931 00:40:59,710 --> 00:41:00,560 tipicamente mais. 932 00:41:00,560 --> 00:41:04,470 Cada vez mais, em laptops, pelo menos, é drives de estado sólido, os SSDs, que 933 00:41:04,470 --> 00:41:05,560 apenas não têm partes móveis. 934 00:41:05,560 --> 00:41:06,710 É tudo eletrônico. 935 00:41:06,710 --> 00:41:08,070 É tudo de eletricidade baseada. 936 00:41:08,070 --> 00:41:12,360 Então, acho que, no entanto, deste retângulo como apenas representando um ou dois 937 00:41:12,360 --> 00:41:13,930 gigabytes de memória que você tem. 938 00:41:13,930 --> 00:41:15,500 >> Portanto, é um pedaço da memória. 939 00:41:15,500 --> 00:41:20,460 Agora, o mundo da informática tem a sorte de pedaços particionadas fora de 940 00:41:20,460 --> 00:41:22,570 memória para fazer coisas diferentes. 941 00:41:22,570 --> 00:41:25,930 Assim, por exemplo, se esta é a RAM do computador - como sugerido pela 942 00:41:25,930 --> 00:41:30,400 retângulo lá - Acontece que, por convenção, no topo de sua memória RAM, de modo 943 00:41:30,400 --> 00:41:33,170 para falar, é geralmente o que é chamado de um segmento de texto. 944 00:41:33,170 --> 00:41:35,910 Esses são os zeros e uns que você compilados. 945 00:41:35,910 --> 00:41:39,040 Então, quando nós olhamos debaixo do capô o que a.out é, tudo 946 00:41:39,040 --> 00:41:40,360 os zeros e uns - 947 00:41:40,360 --> 00:41:44,000 quando você executar um programa, esses zeros e uns são carregados a partir do seu disco rígido 948 00:41:44,000 --> 00:41:46,290 unidade em algo chamado memória RAM. 949 00:41:46,290 --> 00:41:48,950 E na RAM, são colocadas no topo. 950 00:41:48,950 --> 00:41:50,330 Agora, entretanto, você tem outras coisas. 951 00:41:50,330 --> 00:41:53,060 Dados inicializados, dados não inicializados. 952 00:41:53,060 --> 00:41:56,440 Esses dois trechos de memória referem-se a variáveis ​​globais, que 953 00:41:56,440 --> 00:41:57,530 você não costuma usar. 954 00:41:57,530 --> 00:42:00,630 Mas, às vezes, se você fizer isso, eles acabam se lá também. 955 00:42:00,630 --> 00:42:01,620 Depois, há algumas outras coisas. 956 00:42:01,620 --> 00:42:04,130 Variáveis ​​de ambiente, que não vai passar muito tempo. 957 00:42:04,130 --> 00:42:06,120 Mas, então, duas coisas importantes que voltará ao longo deste 958 00:42:06,120 --> 00:42:08,130 pilha semestre, e heap. 959 00:42:08,130 --> 00:42:12,280 >> Assim, a maioria da memória do seu computador é reservado ao executar um programa para 960 00:42:12,280 --> 00:42:14,880 algo chamado de pilha e algo chamado de pilha. 961 00:42:14,880 --> 00:42:16,940 E nós não vamos falar sobre a pilha de hoje, mas vamos 962 00:42:16,940 --> 00:42:18,180 falar sobre a pilha. 963 00:42:18,180 --> 00:42:22,910 E a pilha é destinado a conjurar o visual de como a sala de jantar 964 00:42:22,910 --> 00:42:26,120 bandejas de refeição em Mather casa, ou onde quer que você esteja, onde o 965 00:42:26,120 --> 00:42:27,810 refeitório equipe limpá-los todos os dias. 966 00:42:27,810 --> 00:42:30,180 Eles empilhá-los do chão para cima. 967 00:42:30,180 --> 00:42:33,800 E da mesma forma na memória, não é essa idéia de colocar algo em um 968 00:42:33,800 --> 00:42:36,740 empilhar, colocar algo em uma pilha, colocar algo em uma pilha. 969 00:42:36,740 --> 00:42:38,000 E o que queremos dizer com isso? 970 00:42:38,000 --> 00:42:41,430 Bem, vamos zoom e apenas a metade inferior da imagem, do seu computador 971 00:42:41,430 --> 00:42:43,990 RAM, a propor o seguinte. 972 00:42:43,990 --> 00:42:48,300 Acontece que quando você executar um programa como a.out ou Olá, seja qual for 973 00:42:48,300 --> 00:42:49,920 do programa é que você escreveu, 974 00:42:49,920 --> 00:42:53,030 novamente, os zeros e uns são carregados a partir do disco rígido - o que é 975 00:42:53,030 --> 00:42:56,190 armazenamento a longo prazo, permanece lá mesmo quando você puxar a ficha - 976 00:42:56,190 --> 00:42:57,220 carregado na memória RAM. 977 00:42:57,220 --> 00:42:59,020 RAM é mais rápida do que os discos rígidos. 978 00:42:59,020 --> 00:43:00,700 É menor do que os discos rígidos. 979 00:43:00,700 --> 00:43:03,490 Mas é onde os programas ao vivo, enquanto você está executando-os. 980 00:43:03,490 --> 00:43:06,380 >> Então você clicar duas vezes um programa em um Mac ou um PC - é carregado de 981 00:43:06,380 --> 00:43:07,750 disco rígido para a RAM. 982 00:43:07,750 --> 00:43:11,760 Assim como é carregado na memória RAM, os zeros e uns ir no topo forma, o 983 00:43:11,760 --> 00:43:13,130 o chamado segmento de texto. 984 00:43:13,130 --> 00:43:17,040 Mas então, logo que o programa realmente começa a correr, o principal 985 00:43:17,040 --> 00:43:18,140 função é chamada. 986 00:43:18,140 --> 00:43:21,070 E principal, como vimos, muitas vezes tem variáveis ​​locais. 987 00:43:21,070 --> 00:43:24,560 E tem ints e cordas e caractere e semelhantes. 988 00:43:24,560 --> 00:43:28,300 Portanto, se seu programa que você escreveu ou o programa que você tem 989 00:43:28,300 --> 00:43:33,680 clicado duas vezes usou algumas variáveis ​​dentro do principal, eles acabam no 990 00:43:33,680 --> 00:43:37,020 fundo de sua pilha de memória, por assim dizer. 991 00:43:37,020 --> 00:43:39,160 Agora, mais concretamente, o que isso realmente significa? 992 00:43:39,160 --> 00:43:44,080 Isto apenas significa que se fôssemos a contar as coisas - 993 00:43:44,080 --> 00:43:49,380 se estivéssemos indo para o número de bytes de RAM no computador, observe que 994 00:43:49,380 --> 00:43:51,650 este pode ser o número zero byte. 995 00:43:51,650 --> 00:43:56,130 Este pode ser o número de bytes de um, dois, três, quatro, cinco, seis, todos 996 00:43:56,130 --> 00:43:57,290 o caminho até gosta - 997 00:43:57,290 --> 00:44:01,520 2000000000 seria todo o caminho até lá em cima. 998 00:44:01,520 --> 00:44:05,960 Portanto, em outras palavras, quando falamos de memória RAM ou em termos de bytes, 999 00:44:05,960 --> 00:44:09,680 Significa apenas que alguém decidiu o que cada número de 1000 00:44:09,680 --> 00:44:11,110 os pedaços de memória. 1001 00:44:11,110 --> 00:44:16,950 >> Assim, quando você precisar de 32 bits para um inteiro, ou você precisa de 8 bits para um char, quando 1002 00:44:16,950 --> 00:44:18,320 eles acabam na memória? 1003 00:44:18,320 --> 00:44:20,650 Bem conceitualmente, eles só acabam no fim desta 1004 00:44:20,650 --> 00:44:21,780 coisa chamada a pilha. 1005 00:44:21,780 --> 00:44:25,670 Mas o que é interessante agora é quando chama uma função principal. 1006 00:44:25,670 --> 00:44:28,830 Suponha que uma função chamada foo, apenas o nome de uma arbitrária. 1007 00:44:28,830 --> 00:44:32,480 O que acontece é principal está na parte inferior desta pilha de memória. 1008 00:44:32,480 --> 00:44:35,630 Foo agora é colocar em cima do principal na memória. 1009 00:44:35,630 --> 00:44:40,020 Assim, todas as variáveis ​​locais que foo tenha acabar tipo de conceitualmente acima 1010 00:44:40,020 --> 00:44:40,770 aqueles em principal. 1011 00:44:40,770 --> 00:44:46,920 Se foo chama outra função chamada bar, essas variáveis ​​acabam aqui. 1012 00:44:46,920 --> 00:44:49,790 Se a barra de chama outra coisa, aqui, aqui, aqui. 1013 00:44:49,790 --> 00:44:53,900 Então, o que é interessante sobre a execução de um programa é que, como você chamar funções, 1014 00:44:53,900 --> 00:44:57,720 e como essas funções chamar funções, e como essas funções chamar funções, 1015 00:44:57,720 --> 00:45:00,980 você construir esta pilha de funções na memória. 1016 00:45:00,980 --> 00:45:06,740 E apenas uma vez a função retorna você começar a que a memória de volta. 1017 00:45:06,740 --> 00:45:11,190 Portanto, uma das maneiras mais fáceis de ficar sem memória em um programa de computador é 1018 00:45:11,190 --> 00:45:14,170 escrever funções que nunca retornam. 1019 00:45:14,170 --> 00:45:16,650 >> Assim, por exemplo, vamos demonstrar tanto com uma 1020 00:45:16,650 --> 00:45:18,460 programa intencionalmente buggy. 1021 00:45:18,460 --> 00:45:24,690 Deixe-me ir em frente e fazer # include, int main (void). 1022 00:45:24,690 --> 00:45:31,270 E eu vou fazer enquanto (2> 1), o que provavelmente não irá nunca 1023 00:45:31,270 --> 00:45:33,370 mudar em nós. 1024 00:45:33,370 --> 00:45:37,720 E deixe-me ir em frente agora e fazer printf. 1025 00:45:37,720 --> 00:45:39,950 Na verdade, isso vai ser menos interessante visualmente. 1026 00:45:39,950 --> 00:45:40,460 Vamos fazer isso. 1027 00:45:40,460 --> 00:45:44,840 Para int (i = 0; i> 0). 1028 00:45:44,840 --> 00:45:49,740 Vamos fazer este erro, i + +. 1029 00:45:49,740 --> 00:45:51,150 E não vamos printf aqui. 1030 00:45:51,150 --> 00:45:52,550 Vamos praticar o que eu estava pregando. 1031 00:45:52,550 --> 00:45:54,090 Vamos ter um método aqui. 1032 00:45:54,090 --> 00:46:00,860 Refrão vazio, e vamos dizer int i. 1033 00:46:00,860 --> 00:46:02,295 E então eu vou dizer, printf - 1034 00:46:04,871 --> 00:46:06,790 oh, vamos fazer isso mais interessante. 1035 00:46:06,790 --> 00:46:08,350 Não vamos realmente imprimir nada. 1036 00:46:08,350 --> 00:46:10,530 Vamos fazer isso. 1037 00:46:10,530 --> 00:46:11,780 Coro (i). 1038 00:46:16,630 --> 00:46:17,000 >> Tudo bem. 1039 00:46:17,000 --> 00:46:20,040 Portanto, este é buggy por que? 1040 00:46:20,040 --> 00:46:22,850 Eu estou fazendo isso como eu ir, porque o programa não faz nada 1041 00:46:22,850 --> 00:46:23,420 de interesse. 1042 00:46:23,420 --> 00:46:24,670 Mas esse não é o objetivo. 1043 00:46:24,670 --> 00:46:30,440 O objetivo é escrever um programa que tem como principal função faz o que, aparentemente? 1044 00:46:30,440 --> 00:46:31,370 Se identificar. 1045 00:46:31,370 --> 00:46:32,600 E, na verdade, nós não precisamos do loop. 1046 00:46:32,600 --> 00:46:36,070 Vamos mesmo simplificar este só para não perder de vista realmente a 1047 00:46:36,070 --> 00:46:37,310 bug fundamental. 1048 00:46:37,310 --> 00:46:39,200 Chamadas principais coro a cantar alguma coro. 1049 00:46:39,200 --> 00:46:41,760 Então eu fiz algo estúpido, e eu tinha coro chamada coro porque eu assumi 1050 00:46:41,760 --> 00:46:43,550 alguém estava indo para implementá-lo talvez. 1051 00:46:43,550 --> 00:46:45,960 E agora isso não vai compilar ainda. 1052 00:46:45,960 --> 00:46:48,340 Eu preciso fazer o quê? 1053 00:46:48,340 --> 00:46:49,700 Eu preciso do protótipo, lembre-se. 1054 00:46:49,700 --> 00:46:55,520 Então, eu preciso ter-se aqui coro void (int i);. 1055 00:46:55,520 --> 00:46:57,470 >> Então, agora, se eu descer aqui - 1056 00:46:57,470 --> 00:46:59,030 Na verdade, vamos usar a janela maior. 1057 00:46:59,030 --> 00:47:01,670 Vamos em frente e fazer coro. 1058 00:47:01,670 --> 00:47:06,000 Vamos em frente e fazer coro. 1059 00:47:06,000 --> 00:47:08,302 Utilização de declarante não identificado i. 1060 00:47:08,302 --> 00:47:09,860 Ah, isso foi estúpido. 1061 00:47:09,860 --> 00:47:11,020 Nós não precisamos do argumento. 1062 00:47:11,020 --> 00:47:13,680 Vamos fazer isso. 1063 00:47:13,680 --> 00:47:14,550 O Wish nós tinha começado dessa maneira. 1064 00:47:14,550 --> 00:47:16,160 Teria sido um programa muito mais fácil escrever. 1065 00:47:16,160 --> 00:47:20,100 Então lá. 1066 00:47:20,100 --> 00:47:23,870 Agora vamos para a minha janela de terminal, re-run Clang. 1067 00:47:23,870 --> 00:47:26,900 E aqui vamos nós. 1068 00:47:26,900 --> 00:47:28,020 Isso foi muito rápido. 1069 00:47:28,020 --> 00:47:30,690 O que realmente aconteceu, entretanto? 1070 00:47:30,690 --> 00:47:33,430 Bem, agora eu vou adicionar a linha de impressão, para que possamos ver. 1071 00:47:33,430 --> 00:47:41,330 Então deixe-me dizer printf, vamos dizer, eu estou aqui. 1072 00:47:41,330 --> 00:47:43,470 Ok, não variáveis, vamos deixá-lo assim. 1073 00:47:43,470 --> 00:47:44,860 Deixe-me voltar a correr fazer. 1074 00:47:44,860 --> 00:47:47,940 Deixe-me re-run coro. 1075 00:47:47,940 --> 00:47:51,235 E vamos. 1076 00:47:53,880 --> 00:47:55,130 Continue indo. 1077 00:47:57,630 --> 00:47:59,750 Como um aparte, por que ainda não caiu ainda? 1078 00:47:59,750 --> 00:48:02,050 A falha de segmentação aconteceu super rápido antes. 1079 00:48:02,050 --> 00:48:04,250 [Inaudível] 1080 00:48:04,250 --> 00:48:04,830 DAVID J. MALAN: Exatamente. 1081 00:48:04,830 --> 00:48:06,350 Então, é preciso tempo para imprimir. 1082 00:48:06,350 --> 00:48:08,370 Ele só tem mais trabalho por parte do computador. 1083 00:48:08,370 --> 00:48:09,550 E aí está. 1084 00:48:09,550 --> 00:48:10,620 Falha de segmentação. 1085 00:48:10,620 --> 00:48:12,140 >> Então, observe o quão rápido os programas executados. 1086 00:48:12,140 --> 00:48:14,110 Se você não está imprimindo nada, super rápido. 1087 00:48:14,110 --> 00:48:18,100 Mas ainda tenho essa falha de segmentação, porque o que estava acontecendo? 1088 00:48:18,100 --> 00:48:21,310 Bem, se você pensar sobre como a memória do seu computador é colocado para fora, esta 1089 00:48:21,310 --> 00:48:22,890 passa a ser principal. 1090 00:48:22,890 --> 00:48:23,800 Mas aqui - 1091 00:48:23,800 --> 00:48:28,670 vamos chamar este coro, e vamos chamar esse refrão. 1092 00:48:28,670 --> 00:48:33,420 E agora, se eu fizer minha estética certo, isso só vai dizer coro, 1093 00:48:33,420 --> 00:48:38,060 coro, coro, coro, coro, coro, coro, ad nauseum. 1094 00:48:38,060 --> 00:48:39,920 E, finalmente, o que vai acontecer? 1095 00:48:39,920 --> 00:48:46,690 Se o panorama é literalmente isso, o que acontece apenas conceitualmente? 1096 00:48:46,690 --> 00:48:48,320 As derrapagens pilha a pilha. 1097 00:48:48,320 --> 00:48:52,400 Ou pior, você só superado tudo, incluindo o segmento de texto, que é 1098 00:48:52,400 --> 00:48:54,530 os zeros e uns que representam o seu programa. 1099 00:48:54,530 --> 00:48:56,690 Em suma, este é apenas super, super-ruim. 1100 00:48:56,690 --> 00:48:56,860 Certo? 1101 00:48:56,860 --> 00:48:58,620 Seu programa entrou em uma espiral fora de controle. 1102 00:48:58,620 --> 00:49:02,840 Você está usando a memória muito mais do que você queria tudo por causa de um estúpido 1103 00:49:02,840 --> 00:49:03,920 erro, neste caso. 1104 00:49:03,920 --> 00:49:08,160 Ou, neste caso, uma função muito deliberadamente feito ligando-se. 1105 00:49:08,160 --> 00:49:09,210 Agora, isso não é de todo ruim. 1106 00:49:09,210 --> 00:49:12,540 Funções que chamam-se, na verdade, tem um grande poder 1107 00:49:12,540 --> 00:49:13,700 quando você usá-lo corretamente. 1108 00:49:13,700 --> 00:49:15,650 Eu não tenho usado corretamente aqui. 1109 00:49:15,650 --> 00:49:16,940 >> Então isso não é de todo ruim. 1110 00:49:16,940 --> 00:49:20,620 Mas o fato de que eu nunca realmente parar de chamar a mim mesmo é fundamental 1111 00:49:20,620 --> 00:49:23,050 fraqueza aqui deste programa. 1112 00:49:23,050 --> 00:49:25,090 Então para onde estamos indo com tudo isso? 1113 00:49:25,090 --> 00:49:26,230 Bem, o que está realmente acontecendo? 1114 00:49:26,230 --> 00:49:30,010 Quando eu chamo a função de incremento, como estávamos fazendo nesses exemplos, 1115 00:49:30,010 --> 00:49:33,290 Eu tenho um valor como uma que eu passar dentro 1116 00:49:33,290 --> 00:49:35,820 Eu passar em uma cópia do número um. 1117 00:49:35,820 --> 00:49:37,080 Então acontece o seguinte. 1118 00:49:37,080 --> 00:49:40,390 Então vamos para o exemplo de incremento. 1119 00:49:40,390 --> 00:49:44,230 E esse cara por aqui. 1120 00:49:44,230 --> 00:49:46,800 Então aqui é o que está realmente acontecendo. 1121 00:49:46,800 --> 00:49:50,770 Quando liguei incremento, e eu passar em x, pictoricamente o que é 1122 00:49:50,770 --> 00:49:53,660 acontecendo aqui é esta - 1123 00:49:53,660 --> 00:50:00,240 se eu tiver o valor de um armazenados aqui, e eu realmente chamar incremento, que 1124 00:50:00,240 --> 00:50:02,680 agora é chamado coro - 1125 00:50:02,680 --> 00:50:04,010 Sim, isso é me jogando fora aqui. 1126 00:50:04,010 --> 00:50:06,750 Então, vamos chamar este incremento. 1127 00:50:06,750 --> 00:50:09,420 E nós não sabemos o que esta função próximo vai ser. 1128 00:50:09,420 --> 00:50:14,270 Então o que está realmente acontecendo é aqui em algum lugar no principal, eu tenho um pedaço de 1129 00:50:14,270 --> 00:50:16,670 memória que armazena o número 1. 1130 00:50:16,670 --> 00:50:19,730 Quando eu chamo incremento, estou usando outro pedaço de memória, mas agora eu 1131 00:50:19,730 --> 00:50:20,840 tem a cópia de 1. 1132 00:50:20,840 --> 00:50:25,480 Quando eu incrementar esse valor, este torna-se 2 - horrivelmente escrito no 1133 00:50:25,480 --> 00:50:26,420 tela aqui. 1134 00:50:26,420 --> 00:50:30,550 Mas então, o que acontece logo retorna incremento? 1135 00:50:30,550 --> 00:50:34,610 Esta memória só fica transferido de volta para o sistema operacional, o que significa que todos os 1136 00:50:34,610 --> 00:50:37,470 que você fez não é nada útil. 1137 00:50:37,470 --> 00:50:43,460 O que foi originalmente contido no principal ainda é realmente lá. 1138 00:50:43,460 --> 00:50:44,650 >> Então para onde estamos indo com isso? 1139 00:50:44,650 --> 00:50:49,400 Bem, acontece que na memória que você tem esta de volta para trás seqüência de 1140 00:50:49,400 --> 00:50:50,940 bytes que você pode colocar coisas dentro 1141 00:50:50,940 --> 00:50:53,760 E acontece que já vimos algo que envolve a colocação de 1142 00:50:53,760 --> 00:50:55,100 as coisas de volta para trás, para trás, para trás. 1143 00:50:55,100 --> 00:51:00,170 O que é uma cadeia, com base em uma semana e agora de duas semanas? 1144 00:51:00,170 --> 00:51:01,840 Então, é apenas uma coleção de personagens. 1145 00:51:01,840 --> 00:51:05,290 Então não é que, assim como você pode colocar números na memória, da mesma forma que você pode 1146 00:51:05,290 --> 00:51:06,900 colocar personagens na memória. 1147 00:51:06,900 --> 00:51:09,810 E quando começamos a colocar personagens na memória de volta para trás para voltar ao 1148 00:51:09,810 --> 00:51:12,800 para trás, verifica-se que o uso mais simples das coisas como um loop ou 1149 00:51:12,800 --> 00:51:14,510 um loop while, podemos iterar - 1150 00:51:14,510 --> 00:51:17,130 da esquerda para a direita sobre os caracteres de uma string - 1151 00:51:17,130 --> 00:51:20,720 e começar massageando-os em personagens completamente diferentes. 1152 00:51:20,720 --> 00:51:25,550 Um pode se tornar B. B pode se tornar C. Assim que, finalmente, podemos tomar uma 1153 00:51:25,550 --> 00:51:28,830 Frase em Inglês que realmente faz sentido e converter cada um dos 1154 00:51:28,830 --> 00:51:32,440 letras uma a uma, caminhando através da memória do nosso computador para a esquerda para 1155 00:51:32,440 --> 00:51:34,300 direito à verdade criptografar. 1156 00:51:34,300 --> 00:51:36,590 >> Portanto, vamos ter a nossa pausa de cinco minutos aqui, e quando voltarmos, vamos 1157 00:51:36,590 --> 00:51:39,060 iniciar este processo de codificação de informações. 1158 00:51:41,640 --> 00:51:43,180 >> Tudo bem. 1159 00:51:43,180 --> 00:51:48,440 Então, antes de mergulhar em alguns criptografia e essas coisas chamadas de matrizes, deixe-me 1160 00:51:48,440 --> 00:51:51,610 pausa para todas as perguntas, porque eu sinto como se eu realmente tipo de confusa alguns dos 1161 00:51:51,610 --> 00:51:52,230 esses temas. 1162 00:51:52,230 --> 00:51:53,940 Então vamos corrigir agora, se pudermos. 1163 00:51:53,940 --> 00:51:56,480 Então, nós apenas conversamos sobre valores de retorno. 1164 00:51:56,480 --> 00:51:58,630 Nós conversamos sobre argumentos. 1165 00:51:58,630 --> 00:52:02,330 E nós falamos sobre esta noção, que nós vamos voltar para nas próximas semanas 1166 00:52:02,330 --> 00:52:07,140 vir, de ver a memória como um monte deles empilhados 1167 00:52:07,140 --> 00:52:08,540 bandejas, por assim dizer. 1168 00:52:08,540 --> 00:52:13,460 De baixo para cima, de tal forma que cada bandeja que será colocado na pilha representa 1169 00:52:13,460 --> 00:52:15,160 uma função que está sendo chamado. 1170 00:52:17,970 --> 00:52:20,300 Alguma pergunta? 1171 00:52:20,300 --> 00:52:22,890 Assim como sobre - deixe-me tentar fazer uma pergunta. 1172 00:52:22,890 --> 00:52:25,520 Eu mantenho estragar isso, mas agora é - vocês já todos vimos o rosto do menino. 1173 00:52:25,520 --> 00:52:27,020 Então, nós vamos voltar a isso. 1174 00:52:27,020 --> 00:52:29,700 >> Então deixe-me fazer uma pergunta aqui. 1175 00:52:29,700 --> 00:52:34,810 Deixe-me simplificar isso volta ao que era antes de alguns dos nossos mais cedo Q & A. 1176 00:52:34,810 --> 00:52:41,730 E o fato de que o incremento tem parêntese aberto, número int, fechada 1177 00:52:41,730 --> 00:52:42,260 parênteses. 1178 00:52:42,260 --> 00:52:46,370 O que o número int representa? 1179 00:52:46,370 --> 00:52:47,250 [Inaudível] 1180 00:52:47,250 --> 00:52:47,870 DAVID J. MALAN: Um argumento. 1181 00:52:47,870 --> 00:52:50,732 Ok, mas o que é um argumento? 1182 00:52:50,732 --> 00:52:51,620 [Inaudível] 1183 00:52:51,620 --> 00:52:52,500 DAVID J. MALAN: Desculpe, mas o que é isso? 1184 00:52:52,500 --> 00:52:53,150 SPEAKER 3: Algo que você passa dentro 1185 00:52:53,150 --> 00:52:53,570 DAVID J. MALAN: Okay. 1186 00:52:53,570 --> 00:52:54,780 Então, alguma coisa que você passa dentro 1187 00:52:54,780 --> 00:52:56,560 E, mais geralmente, é apenas a entrada. 1188 00:52:56,560 --> 00:52:59,860 Se você está escrevendo uma função e finalidade dessa função na vida é fazer 1189 00:52:59,860 --> 00:53:03,290 algo um pouco diferente cada vez que você usá-lo, então a única maneira de 1190 00:53:03,290 --> 00:53:07,710 que isso aconteça realmente parece ser o de fornecer-lo com entrada de forma que 1191 00:53:07,710 --> 00:53:10,180 pode fazer algo diferente com que a entrada de cada vez. 1192 00:53:10,180 --> 00:53:13,590 >> Então, você precisa especificar duas coisas quando leva uma função entradas. 1193 00:53:13,590 --> 00:53:17,240 Você precisa especificar o nome que você quiser dar para que a entrada, apenas para 1194 00:53:17,240 --> 00:53:20,790 sua própria conveniência para que você possa consultá-lo na função que você 1195 00:53:20,790 --> 00:53:23,610 se está escrevendo, como eu fiz aqui na linha 32. 1196 00:53:23,610 --> 00:53:27,840 Mas você também precisa especificar o tipo porque C é uma linguagem de programação 1197 00:53:27,840 --> 00:53:28,840 que apenas exige 1198 00:53:28,840 --> 00:53:31,810 que se você quiser uma variável, você tem que dizer ao computador o 1199 00:53:31,810 --> 00:53:32,790 tipo de dados que é, 1200 00:53:32,790 --> 00:53:35,540 em grande parte, para que ele saiba quantos bits para 1201 00:53:35,540 --> 00:53:37,230 alocar para essa variável. 1202 00:53:37,230 --> 00:53:38,600 Porque pode ser seis - 1203 00:53:38,600 --> 00:53:39,990 desculpe, isso não vai ser seis. 1204 00:53:39,990 --> 00:53:41,050 Pode ser 16. 1205 00:53:41,050 --> 00:53:41,630 Ele pode ser 8. 1206 00:53:41,630 --> 00:53:44,410 Ele pode ser de 32, até 64. 1207 00:53:44,410 --> 00:53:45,820 Mas o computador precisa saber. 1208 00:53:45,820 --> 00:53:49,110 Agora, a int no lado esquerdo representa o que, por outro lado? 1209 00:53:52,825 --> 00:53:53,780 [Inaudível] 1210 00:53:53,780 --> 00:53:54,570 DAVID J. MALAN: O que é isso? 1211 00:53:54,570 --> 00:53:55,390 [Inaudível] 1212 00:53:55,390 --> 00:53:57,920 DAVID J. MALAN: O tipo de função e, mais especificamente, o 1213 00:53:57,920 --> 00:53:59,755 tipo de sua saída. 1214 00:53:59,755 --> 00:54:00,220 Direito. 1215 00:54:00,220 --> 00:54:04,220 Assim, enquanto que a única coisa entre parênteses representa sua entrada, se houver, o 1216 00:54:04,220 --> 00:54:06,640 coisa para a esquerda representa sua saída. 1217 00:54:06,640 --> 00:54:10,560 E, neste caso, o incremento aparentemente retorna um int. 1218 00:54:10,560 --> 00:54:14,590 E assim int é o tipo de retorno desta função. 1219 00:54:14,590 --> 00:54:16,090 >> O que significa retornar? 1220 00:54:16,090 --> 00:54:19,810 Literalmente, você usa a palavra-chave return. 1221 00:54:19,810 --> 00:54:24,640 E então, se o que você está voltando para a direita da palavra-chave é uma 1222 00:54:24,640 --> 00:54:28,340 inteiro, então isso é realmente consistente com o que prometeram. 1223 00:54:28,340 --> 00:54:31,110 Você não poderia fazer algo assim - 1224 00:54:31,110 --> 00:54:32,280 Olá mundo, - 1225 00:54:32,280 --> 00:54:33,500 porque essa é uma string. 1226 00:54:33,500 --> 00:54:35,440 Obviamente, não é um número inteiro. 1227 00:54:35,440 --> 00:54:40,450 Assim, em breve, a carga é realmente em nós, o programador, para ser específico como 1228 00:54:40,450 --> 00:54:44,730 ao que estamos voltando e, em seguida, realmente ir sobre a devolver. 1229 00:54:44,730 --> 00:54:49,030 E depois de fazer um pouco mais claro o contexto - 1230 00:54:49,030 --> 00:54:50,080 lá está ele de novo. 1231 00:54:50,080 --> 00:54:51,060 O contexto - 1232 00:54:51,060 --> 00:54:52,830 grande surpresa em apenas um momento. 1233 00:54:52,830 --> 00:54:57,720 O contexto aqui agora é que a memória do computador é, novamente, uma 1234 00:54:57,720 --> 00:54:59,070 gigabyte, dois gigabytes, o que for. 1235 00:54:59,070 --> 00:54:59,630 Talvez seja mais. 1236 00:54:59,630 --> 00:55:00,540 Talvez seja menos. 1237 00:55:00,540 --> 00:55:03,750 Mas o computador vê-lo como tendo diferentes seções. 1238 00:55:03,750 --> 00:55:04,860 Algo vai lá em baixo. 1239 00:55:04,860 --> 00:55:06,020 Outra coisa vai lá em cima. 1240 00:55:06,020 --> 00:55:07,540 Coisas diferentes vai no meio. 1241 00:55:07,540 --> 00:55:09,300 E hoje, nós só começar a contar esta história. 1242 00:55:09,300 --> 00:55:11,130 >> Mas vamos voltar a esse tempo acabou. 1243 00:55:11,130 --> 00:55:15,000 Por enquanto, a única lembrança que realmente importa é o segmento de texto 1244 00:55:15,000 --> 00:55:17,160 pois que apenas representa os zeros e uns 1245 00:55:17,160 --> 00:55:18,460 Clang que tem emitido. 1246 00:55:18,460 --> 00:55:21,570 Então, quando você executar um comando no teclado como a.out, ou dupla 1247 00:55:21,570 --> 00:55:25,350 clicar em um ícone no Mac OS ou Windows, o programa é carregado a partir do disco rígido 1248 00:55:25,350 --> 00:55:26,930 dirigir na RAM. 1249 00:55:26,930 --> 00:55:30,850 E está se estatelou no topo da RAM do seu computador, por assim dizer. 1250 00:55:30,850 --> 00:55:35,470 Agora, entretanto, como o programa começa a ser executado e principal é chamado no 1251 00:55:35,470 --> 00:55:39,240 programa que você escreveu ou o programa Microsoft ou a Apple escreveu, qualquer um de seus 1252 00:55:39,240 --> 00:55:42,930 variáveis ​​locais acabam lá no fundo da memória de seu computador. 1253 00:55:42,930 --> 00:55:46,490 Mas se principal chama outra função que em si tem variáveis ​​ou 1254 00:55:46,490 --> 00:55:48,340 argumentos, eles acabam por cima. 1255 00:55:48,340 --> 00:55:50,670 E se essa função chama alguma coisa, eles acabam acima dela, 1256 00:55:50,670 --> 00:55:51,840 acima dele, acima dele. 1257 00:55:51,840 --> 00:55:56,100 E apenas uma vez uma função de execução é feita é que a pilha de tabuleiros, de modo 1258 00:55:56,100 --> 00:55:58,320 para falar, começa a ficar mais e mais. 1259 00:55:58,320 --> 00:56:03,370 E isso é o que então, em poucas palavras, explica por que, quando você chamar cubo - 1260 00:56:03,370 --> 00:56:04,660 ou você chamar incremento - 1261 00:56:04,660 --> 00:56:06,490 você está passando em uma cópia do valor. 1262 00:56:06,490 --> 00:56:09,840 E o que isso significa pictoricamente é que você está literalmente escrito o 1263 00:56:09,840 --> 00:56:14,540 número 1 na outra parte da memória, mudando de que 1 a 2, no caso de 1264 00:56:14,540 --> 00:56:15,360 incremento - 1265 00:56:15,360 --> 00:56:17,450 ou de um 8, no caso do cubo - 1266 00:56:17,450 --> 00:56:21,450 e, em seguida, que a memória atirar fora, logo que o incremento ou o cubo 1267 00:56:21,450 --> 00:56:23,410 função retorna. 1268 00:56:23,410 --> 00:56:24,267 >> Pergunta. 1269 00:56:24,267 --> 00:56:25,517 [Inaudível] 1270 00:56:28,090 --> 00:56:29,970 DAVID J. MALAN: Onde - variáveis ​​globais são armazenados em que é 1271 00:56:29,970 --> 00:56:32,960 atualmente chamado os dados inicializados ou dados não inicializados. 1272 00:56:32,960 --> 00:56:35,900 A diferença é, se você tem uma variável global, e lhe atribui 1273 00:56:35,900 --> 00:56:39,530 imediatamente um valor com o sinal de igual, ele acaba no topo lá. 1274 00:56:39,530 --> 00:56:43,390 E se você acabou de dizer int x vírgula e sem valor, acaba um pouco 1275 00:56:43,390 --> 00:56:46,670 inferior na RAM simplesmente por convenção. 1276 00:56:46,670 --> 00:56:49,308 Outras questões. 1277 00:56:49,308 --> 00:56:49,750 Tudo bem. 1278 00:56:49,750 --> 00:56:53,040 >> Portanto, esta imagem vai voltar como temos mais poderoso com o que podemos fazer 1279 00:56:53,040 --> 00:56:53,830 com o computador. 1280 00:56:53,830 --> 00:56:58,790 Mas, por agora, vamos ter uma breve introdução à criptografia, um tipo específico de 1281 00:56:58,790 --> 00:57:01,910 criptografia que não resolve todos os problemas do mundo, mas não resolve 1282 00:57:01,910 --> 00:57:02,480 alguns deles. 1283 00:57:02,480 --> 00:57:06,090 Neste caso aqui, temos uma coisa chamada criptografia de chave secreta. 1284 00:57:06,090 --> 00:57:10,430 E criptografia de chave secreta, como o nome sugere, deriva a sua segurança 1285 00:57:10,430 --> 00:57:11,330 a partir de um segredo. 1286 00:57:11,330 --> 00:57:14,720 Assim, por exemplo, se você está de volta na escola e você está passando uma 1287 00:57:14,720 --> 00:57:18,040 carta de amor pouco segredo para o menino ou a menina que você está esmagando - se você 1288 00:57:18,040 --> 00:57:20,820 queria passar isso através da audiência, você provavelmente não iria escrever 1289 00:57:20,820 --> 00:57:24,120 tal nota em Inglês ou qualquer que seja sua língua nativa é, em vez disso, você 1290 00:57:24,120 --> 00:57:25,800 pode criptografá-la. 1291 00:57:25,800 --> 00:57:27,820 Ou você pode apenas enviar-lhes uma mensagem de texto estes dias. 1292 00:57:27,820 --> 00:57:30,310 Mas você pode realmente passar-lhes uma nota ao longo da sala de aula. 1293 00:57:30,310 --> 00:57:33,820 E fazê-lo de forma segura, de tal forma que os seus amigos e do professor 1294 00:57:33,820 --> 00:57:36,820 não sei o que você está escrevendo, você pode chegar a uma bastante simples 1295 00:57:36,820 --> 00:57:37,800 algoritmo - 1296 00:57:37,800 --> 00:57:39,290 jovem que você pode ser - 1297 00:57:39,290 --> 00:57:40,780 apenas para embaralhar as palavras. 1298 00:57:40,780 --> 00:57:44,390 Então, em vez de escrever um, você pode escrever B. Em vez de B, você pode escrever 1299 00:57:44,390 --> 00:57:46,670 C. Em vez de C, você pode escrever D, e assim por diante. 1300 00:57:46,670 --> 00:57:50,020 Ou você pode vir com uma tradução mais sofisticado de cartas 1301 00:57:50,020 --> 00:57:51,300 de letras diferentes. 1302 00:57:51,300 --> 00:57:55,440 Mas o problema é o menino ou menina a quem você está enviando esta nota precisa 1303 00:57:55,440 --> 00:57:56,850 saber alguma coisa. 1304 00:57:56,850 --> 00:57:59,620 Que é o que, obviamente? 1305 00:57:59,620 --> 00:58:01,400 Como, o que é o seu segredo. 1306 00:58:01,400 --> 00:58:04,620 Como, o que é que o mapeamento entre As e Bs e Cs e Ds? 1307 00:58:04,620 --> 00:58:08,780 É apenas a adição de um, por assim dizer, para cada uma das cartas para ir de 1308 00:58:08,780 --> 00:58:09,730 A para B, de B para C? 1309 00:58:09,730 --> 00:58:11,350 O que é mais complexa do que a? 1310 00:58:11,350 --> 00:58:16,450 Assim, você e sua paixão precisa ter essa informação em segredo. 1311 00:58:16,450 --> 00:58:18,170 Mas há um tipo de catch-22 aqui. 1312 00:58:18,170 --> 00:58:20,760 Se esta é a primeira vez que você está enviando esta carta de amor através do 1313 00:58:20,760 --> 00:58:25,590 classe, como é que o menino ou a menina vai saber o que o segredo é mesmo? 1314 00:58:25,590 --> 00:58:28,450 Assim chave secreta de criptografia não resolve todos os problemas do mundo. 1315 00:58:28,450 --> 00:58:30,490 E não há, na verdade, uma relação que nós vamos voltar a direção 1316 00:58:30,490 --> 00:58:31,370 final do semestre. 1317 00:58:31,370 --> 00:58:35,970 >> Da mesma forma, não têm nenhum de nós provavelmente já enviou um - 1318 00:58:35,970 --> 00:58:39,453 da mesma forma, não a maioria de nós conhece alguém que trabalha, por exemplo, a 1319 00:58:39,453 --> 00:58:40,300 Amazon.com. 1320 00:58:40,300 --> 00:58:43,130 E, no entanto, muitos de nós provavelmente já comprou coisas na Amazon.com. 1321 00:58:43,130 --> 00:58:45,670 E nós fomos ensinados a supor que estes e-commerce 1322 00:58:45,670 --> 00:58:47,060 transações são seguras. 1323 00:58:47,060 --> 00:58:47,210 Certo? 1324 00:58:47,210 --> 00:58:49,310 A URL provavelmente diz https. 1325 00:58:49,310 --> 00:58:51,590 Há talvez um pouco bobo ícone de cadeado em algum lugar. 1326 00:58:51,590 --> 00:58:54,680 Há algum tipo de criptografia de proteger suas informações de cartão de crédito 1327 00:58:54,680 --> 00:58:56,980 entre você e Amazon.com. 1328 00:58:56,980 --> 00:59:00,410 E, no entanto, se a criptografia envolve saber algum segredo, e ainda assim eu não 1329 00:59:00,410 --> 00:59:03,330 Conhece alguém na Amazon, e eu certamente não dispostos qualquer tipo de 1330 00:59:03,330 --> 00:59:07,350 segredo com alguém na Amazônia, como é o meu computador ou o meu navegador fazendo isso? 1331 00:59:07,350 --> 00:59:10,100 Bem, acontece que há outros tipos de criptografia de um total que resolvem 1332 00:59:10,100 --> 00:59:10,740 esse problema. 1333 00:59:10,740 --> 00:59:13,610 Mas por hoje, vamos nos concentrar na simples, onde você pode organizar em 1334 00:59:13,610 --> 00:59:18,480 avançar para saber algum segredo, como mais um ou algum mapeamento entre As e Bs. 1335 00:59:18,480 --> 00:59:20,710 >> E o processo de criptografia envolve geralmente a este. 1336 00:59:20,710 --> 00:59:23,550 Você tem algum texto simples, representado aqui na esquerda. 1337 00:59:23,550 --> 00:59:26,260 Executá-lo através de algum tipo de algoritmo ou procedimento 1338 00:59:26,260 --> 00:59:27,670 para encriptar. 1339 00:59:27,670 --> 00:59:31,390 Talvez seja só um se torna B, B se torna C. E então você acabar com 1340 00:59:31,390 --> 00:59:32,260 texto cifrado. 1341 00:59:32,260 --> 00:59:36,450 Enquanto isso, uma vez que a sua paixão recebe a nota secreta, ele ou ela tem para depois 1342 00:59:36,450 --> 00:59:39,950 decifrá-lo por geralmente revertendo esse algoritmo de modo a obter 1343 00:59:39,950 --> 00:59:41,640 apoiar o texto simples. 1344 00:59:41,640 --> 00:59:43,860 Agora há encarnações físicas deste. 1345 00:59:43,860 --> 00:59:46,720 Por exemplo, isto é um anel descodificador pouco segredo. 1346 00:59:46,720 --> 00:59:50,060 E este é um anel no sentido de que não há dois mostradores aqui. 1347 00:59:50,060 --> 00:59:53,630 Na periferia fora desta coisa, há letras de A a Z, 1348 00:59:53,630 --> 00:59:55,110 embora eles estão em ordem aleatória. 1349 00:59:55,110 --> 00:59:58,410 E no interior, há realmente alguns números, tais que, com esta 1350 00:59:58,410 --> 01:00:02,940 anel, você pode transformar o tipo de fora, mas não dentro da, a fim de alinhar 1351 01:00:02,940 --> 01:00:04,110 números com letras. 1352 01:00:04,110 --> 01:00:08,290 E no clipe que você está prestes a ver - alguns dos quais você pode ter visto 24/7 1353 01:00:08,290 --> 01:00:11,120 em torno da temporada de Natal de um filme chamado Uma História de Natal. 1354 01:00:11,120 --> 01:00:16,050 Você vai ver que Ralphie pouco estava tão ansioso para descobrir o que pequeno órfão 1355 01:00:16,050 --> 01:00:19,810 Mensagem secreta de Annie foi a ele que tinha sido comunicado, acho que, no 1356 01:00:19,810 --> 01:00:22,810 forma de mensagens numéricos em uma caixa de série. 1357 01:00:22,810 --> 01:00:26,760 E você tinha que acumular todos os cartões pequenos que vieram 1358 01:00:26,760 --> 01:00:27,480 na caixa de cereal. 1359 01:00:27,480 --> 01:00:28,320 Você tinha que enviá-los dentro 1360 01:00:28,320 --> 01:00:31,060 Você tinha que voltar o anel decodificador secreto, de modo que você pode finalmente descobrir 1361 01:00:31,060 --> 01:00:34,190 o que é o mapeamento entre letras e números, 1362 01:00:34,190 --> 01:00:35,420 ou cartas e cartas. 1363 01:00:35,420 --> 01:00:39,790 Então, eu dar-lhe este pequeno clipe de A História de Natal para motivar pset 2 e 1364 01:00:39,790 --> 01:00:42,340 nossa discussão, em um momento, de matrizes. 1365 01:00:42,340 --> 01:00:43,773 Portanto, temos aqui Ralphie. 1366 01:00:43,773 --> 01:00:44,126 >> [REPRODUÇÃO] 1367 01:00:44,126 --> 01:00:47,470 -Ser-lo conhecido a toda a gente que Ralph Parker é nomeado 1368 01:00:47,470 --> 01:00:50,690 membro da Orphan Annie Pouco Secret Circle e tem direito a todos 1369 01:00:50,690 --> 01:00:53,500 as honras e benefícios que ocorrem ao mesmo. 1370 01:00:53,500 --> 01:00:56,040 -Assinado, Little Orphan Annie. 1371 01:00:56,040 --> 01:00:58,730 Referendado, Pierre Andre! 1372 01:00:58,730 --> 01:01:00,150 Em tinta! 1373 01:01:00,150 --> 01:01:02,910 Honras e benefícios, já com a idade de nove. 1374 01:01:09,970 --> 01:01:10,730 Vamos lá, vamos em frente. 1375 01:01:10,730 --> 01:01:15,000 Eu não preciso de jazz que cerca de contrabandistas e piratas. 1376 01:01:15,000 --> 01:01:17,624 Ouça-noite de amanhã para a aventura de conclusão do The Black 1377 01:01:17,624 --> 01:01:19,710 Navio de pirata. 1378 01:01:19,710 --> 01:01:23,380 Agora é hora de mensagem secreta de Annie por vocês, membros 1379 01:01:23,380 --> 01:01:25,670 do Círculo Secreto. 1380 01:01:25,670 --> 01:01:30,260 Lembre-se, as crianças, apenas membros do Secret Circle Annie pode decodificar 1381 01:01:30,260 --> 01:01:31,660 Mensagem secreta de Annie. 1382 01:01:31,660 --> 01:01:36,230 Lembre-se, Annie está dependendo de você. 1383 01:01:36,230 --> 01:01:38,720 Defina suas pinos para B2. 1384 01:01:38,720 --> 01:01:41,040 Aqui é a mensagem. 1385 01:01:41,040 --> 01:01:42,470 12, 11 - 1386 01:01:42,470 --> 01:01:46,000 -Eu estou na minha primeira reunião secreta. 1387 01:01:46,000 --> 01:01:49,440 -14, 11, 18, 16 - 1388 01:01:49,440 --> 01:01:51,700 -Pierre estava em noite grande voz. 1389 01:01:51,700 --> 01:01:54,890 Eu poderia dizer que a mensagem desta noite era realmente importante. 1390 01:01:54,890 --> 01:01:56,750 -3, 25. 1391 01:01:56,750 --> 01:01:58,590 Essa é uma mensagem de Annie se. 1392 01:01:58,590 --> 01:01:59,840 Lembre-se, não diga a ninguém. 1393 01:02:04,570 --> 01:02:08,750 -90 Segundos depois, eu estou na sala só na casa onde um menino de nove anos 1394 01:02:08,750 --> 01:02:12,980 poderia sentar em privacidade e decodificação. 1395 01:02:12,980 --> 01:02:17,130 Aha, B. Eu fui para o outro. 1396 01:02:17,130 --> 01:02:20,330 E. A primeira palavra é ser. 1397 01:02:20,330 --> 01:02:22,670 S. Estava vindo mais fácil agora. 1398 01:02:22,670 --> 01:02:24,590 U. 1399 01:02:24,590 --> 01:02:26,510 -Oh, vamos lá, Ralphie. 1400 01:02:26,510 --> 01:02:28,430 Eu tenho que ir. 1401 01:02:28,430 --> 01:02:30,350 -Eu vou estar bem para baixo, ma. 1402 01:02:30,350 --> 01:02:33,720 -Gee Whiz. 1403 01:02:33,720 --> 01:02:38,270 -T, O. Certifique-se. 1404 01:02:38,270 --> 01:02:40,000 Certifique-se de que? 1405 01:02:40,000 --> 01:02:42,105 Qual foi Little Orphan Annie está tentando dizer? 1406 01:02:42,105 --> 01:02:43,095 Certifique-se de que? 1407 01:02:43,095 --> 01:02:43,590 -Ralphie! 1408 01:02:43,590 --> 01:02:44,580 Randy tem que ir. 1409 01:02:44,580 --> 01:02:45,570 Quer fazer o favor de sair? 1410 01:02:45,570 --> 01:02:46,560 -Tudo bem, ma. 1411 01:02:46,560 --> 01:02:48,540 Eu estarei fora. 1412 01:02:48,540 --> 01:02:50,580 -Eu estava ficando mais perto agora. 1413 01:02:50,580 --> 01:02:52,550 A tensão era terrível. 1414 01:02:52,550 --> 01:02:53,355 O que foi? 1415 01:02:53,355 --> 01:02:56,315 O destino do planeta pode estar em equilíbrio. 1416 01:02:56,315 --> 01:02:56,790 -Ralphie! 1417 01:02:56,790 --> 01:02:59,165 Randy tem que ir. 1418 01:02:59,165 --> 01:03:02,310 -Eu vou estar bem para fora, pelo amor de Deus. 1419 01:03:02,310 --> 01:03:04,000 -Nossa, quase lá. 1420 01:03:04,000 --> 01:03:05,180 Meus dedos voaram. 1421 01:03:05,180 --> 01:03:07,150 Minha mente era uma armadilha de aço. 1422 01:03:07,150 --> 01:03:08,790 Todos os poros vibrou. 1423 01:03:08,790 --> 01:03:10,040 Era quase claro. 1424 01:03:10,040 --> 01:03:13,400 Sim, sim, sim, sim. 1425 01:03:13,400 --> 01:03:18,960 -Certifique-se de beber o seu Ovomaltine. 1426 01:03:18,960 --> 01:03:20,210 Ovomaltine? 1427 01:03:24,010 --> 01:03:25,260 Um comercial miserável? 1428 01:03:28,200 --> 01:03:29,640 Filho da puta. 1429 01:03:29,640 --> 01:03:33,340 [REPRODUÇÃO FIM] 1430 01:03:33,340 --> 01:03:36,040 >> DAVID J. MALAN: Portanto, temos de criptografia. 1431 01:03:36,040 --> 01:03:39,670 Assim como em um computador podemos ir sobre a implementação ou 1432 01:03:39,670 --> 01:03:40,950 representando coisas como esta? 1433 01:03:40,950 --> 01:03:44,430 Bem, precisamos de uma forma de nos expressar um pouco mais flexível do que 1434 01:03:44,430 --> 01:03:46,420 nossas variáveis, até agora, têm permitido. 1435 01:03:46,420 --> 01:03:47,370 Tivemos ints. 1436 01:03:47,370 --> 01:03:48,380 Tivemos caracteres. 1437 01:03:48,380 --> 01:03:50,790 Nós tivemos carros alegóricos e duplos e alguns outros. 1438 01:03:50,790 --> 01:03:55,050 Mas essas são peças individuais de memória que realmente não nos permitem 1439 01:03:55,050 --> 01:03:58,010 expressar coisas como palavras e frases e frases. 1440 01:03:58,010 --> 01:04:00,200 Na verdade, nós temos chamado cordas tais coisas. 1441 01:04:00,200 --> 01:04:03,650 Mas prometeu que isso é realmente apenas uma simplificação na CS50 1442 01:04:03,650 --> 01:04:07,020 biblioteca que estamos pretendendo descascar. 1443 01:04:07,020 --> 01:04:08,970 >> E assim vamos começar a fazer isso aqui. 1444 01:04:08,970 --> 01:04:11,130 Deixe-me ir em frente e abrir um arquivo - 1445 01:04:11,130 --> 01:04:13,770 todos esses arquivos estão disponíveis on-line como de costume - 1446 01:04:13,770 --> 01:04:19,120 array.c chamado para resolver um problema relacionado com cordas, mas que traça um 1447 01:04:19,120 --> 01:04:23,040 foto aqui de como podemos usar uma coisa chamada matriz. 1448 01:04:23,040 --> 01:04:25,530 Uma matriz é um tipo de dados. 1449 01:04:25,530 --> 01:04:31,320 É um tipo de variável, do tipo, que tem vários tipos de dados menores 1450 01:04:31,320 --> 01:04:34,150 dentro dela de costas para trás, para trás. 1451 01:04:34,150 --> 01:04:37,700 Assim, por exemplo, se quiser escrever um pequeno programa que lhe dá o seu 1452 01:04:37,700 --> 01:04:42,110 questionário média para um curso como 50, que tem dois testes, você poderia muito facilmente 1453 01:04:42,110 --> 01:04:45,170 escrever este programa - baseado mesmo em alguns dos materiais da semana passada - 1454 01:04:45,170 --> 01:04:47,770 usando GetInt e um par de variáveis. 1455 01:04:47,770 --> 01:04:51,920 Int quiz1, int quiz2, e é bastante simples. 1456 01:04:51,920 --> 01:04:55,930 É talvez 10, 20 linhas de código, max, para implementar um programa que pede ao 1457 01:04:55,930 --> 01:05:01,170 usuário para duas pontuações do questionário e calcula sua média, adicionando- 1458 01:05:01,170 --> 01:05:03,850 em conjunto, dividindo-se em dois, e em seguida a impressão dos resultados. 1459 01:05:03,850 --> 01:05:06,380 Nós provavelmente poderia fazer isso muito rapidamente agora, depois de 1460 01:05:06,380 --> 01:05:07,510 um determinado número de minutos. 1461 01:05:07,510 --> 01:05:11,005 >> Mas o problema é que suponho que 50 tinha três ou quatro testes. 1462 01:05:11,005 --> 01:05:13,510 Suponha que você queria usar o mesmo programa para uma classe que teve 1463 01:05:13,510 --> 01:05:14,850 testes semanalmente. 1464 01:05:14,850 --> 01:05:16,610 Pense em uma classe que tem testes semanalmente. 1465 01:05:16,610 --> 01:05:20,610 Se não há como 16 ou mais semanas, em um semestre, agora você tem 16 variáveis ​​- 1466 01:05:20,610 --> 01:05:24,270 int quiz1, int quiz2, int quiz3, int quiz4. 1467 01:05:24,270 --> 01:05:27,560 Assim que você começar a ver essa redundância, esta copiando e colando 1468 01:05:27,560 --> 01:05:31,390 de código, ele deve começar a fazer você gostaria que houvesse uma maneira melhor. 1469 01:05:31,390 --> 01:05:33,930 E, felizmente, porque de matrizes, não existe. 1470 01:05:33,930 --> 01:05:34,980 Então, vamos fazer isso. 1471 01:05:34,980 --> 01:05:38,430 Primeiro, deixe-me apresentar uma coisa muito simples que não usei até agora, 1472 01:05:38,430 --> 01:05:40,140 mas você vai ver que, ocasionalmente, em código. 1473 01:05:40,140 --> 01:05:42,360 Isto é o que é geralmente chamado de uma constante. 1474 01:05:42,360 --> 01:05:45,790 Então, é uma constante no sentido de que este valor nunca muda. 1475 01:05:45,790 --> 01:05:49,210 A convenção humana ao criar uma constante é usar todo o capital 1476 01:05:49,210 --> 01:05:51,940 letras, apenas para que ele realmente se destaca em seu código. 1477 01:05:51,940 --> 01:05:55,960 E a palavra-chave que você usa em C # é definir. 1478 01:05:55,960 --> 01:06:00,250 Então, se você diz # define, então, um espaço, então a palavra que você deseja usar para 1479 01:06:00,250 --> 01:06:03,260 nome da constante, e, em seguida, o valor da constante. 1480 01:06:03,260 --> 01:06:06,180 Então aviso, isso é diferente de atribuir algo a uma variável. 1481 01:06:06,180 --> 01:06:07,020 Não há sinal de igual. 1482 01:06:07,020 --> 01:06:08,240 Não há nenhum ponto e vírgula. 1483 01:06:08,240 --> 01:06:11,410 Isso é o que é geralmente conhecido como um pré-processador de directiva, mas mais sobre 1484 01:06:11,410 --> 01:06:12,210 que em outro momento. 1485 01:06:12,210 --> 01:06:18,540 >> Por agora, isso cria um valor imutável chamado QUESTIONÁRIOS cujo real 1486 01:06:18,540 --> 01:06:19,940 valor numérico é 2. 1487 01:06:19,940 --> 01:06:24,020 Então, em qualquer lugar que você vê testes, questionários, testes ao longo deste arquivo, que é 1488 01:06:24,020 --> 01:06:25,410 apenas o número 2. 1489 01:06:25,410 --> 01:06:28,100 Agora, se eu olhar para principal agora, vamos ver como isso funciona. 1490 01:06:28,100 --> 01:06:29,500 Na primeira, ele parece um pouco enigmática. 1491 01:06:29,500 --> 01:06:31,340 Mas é tudo a partir de uma semana. 1492 01:06:31,340 --> 01:06:32,710 Peça ao usuário para notas. 1493 01:06:32,710 --> 01:06:33,630 Como podemos fazer isso? 1494 01:06:33,630 --> 01:06:35,470 Bem, na linha 22 - 1495 01:06:35,470 --> 01:06:37,210 esta é realmente a parte suculenta - 1496 01:06:37,210 --> 01:06:40,960 Eu declaro uma bóia, mas não apenas um único flutuador. 1497 01:06:40,960 --> 01:06:44,620 Estou declarando, em vez disso, uma matriz de valores de ponto flutuante. 1498 01:06:44,620 --> 01:06:49,100 Essa variável vai ser chamado de notas, como implicado aqui. 1499 01:06:49,100 --> 01:06:53,080 Mas a única peça de nova sintaxe, então são estes colchetes, o fato 1500 01:06:53,080 --> 01:06:59,350 que eu disse notas float e, em seguida, suporte aberto e, em seguida, um número. 1501 01:06:59,350 --> 01:07:02,460 Aviso prévio, se este for uma constante, isto é, tal como fizemos isso. 1502 01:07:02,460 --> 01:07:06,890 Isto significa computador hey, dá-me dois carros alegóricos, e vamos chamar coletivamente 1503 01:07:06,890 --> 01:07:08,220 los graus. 1504 01:07:08,220 --> 01:07:11,920 Isto está em contraste com um processo muito mais tedioso como este. 1505 01:07:11,920 --> 01:07:15,850 Classe1 flutuar, flutuar grade2, e assim por diante. 1506 01:07:15,850 --> 01:07:20,010 Assim, uma matriz que nos permite implementar esta idéia, mas muito menos messily, em 1507 01:07:20,010 --> 01:07:24,630 de modo a que podemos escrever uma linha de código, em vez de, digamos, 16 para um 16 1508 01:07:24,630 --> 01:07:25,740 semestre semana. 1509 01:07:25,740 --> 01:07:29,950 Então, eu não queria rígido código-2 porque se você pensar sobre isso agora 1510 01:07:29,950 --> 01:07:34,160 logicamente - suponho que no próximo ano CS50 alterações 3 quizzes vez. 1511 01:07:34,160 --> 01:07:35,510 E eu tinha o número 2 aqui. 1512 01:07:35,510 --> 01:07:36,600 Eu tive o número 2 aqui. 1513 01:07:36,600 --> 01:07:37,580 Eu tive o número 2 aqui. 1514 01:07:37,580 --> 01:07:38,560 Eu tive o número 2 aqui. 1515 01:07:38,560 --> 01:07:43,180 Torna-se muito tedioso e muito fácil de estragar e mudar acidentalmente 1516 01:07:43,180 --> 01:07:47,690 um valor para 3 e perder algum outro valor de 2. 1517 01:07:47,690 --> 01:07:52,460 Então, eu estou indo para lugar abstrato isso adiante e usar essa constante que, como seu 1518 01:07:52,460 --> 01:07:54,120 nome sugere, nunca muda. 1519 01:07:54,120 --> 01:07:57,710 E agora, não importa se temos diferentes questionários este ano ou no próximo, eu 1520 01:07:57,710 --> 01:08:01,210 apenas temos que mudar isso em um só lugar, aqui em cima. 1521 01:08:01,210 --> 01:08:02,720 >> Então, isso é tudo que é constante. 1522 01:08:02,720 --> 01:08:08,680 Enquanto isso, o novo recurso conceitual é que de uma matriz. 1523 01:08:08,680 --> 01:08:14,660 Assim, os colchetes me dar esta flutua muitos e me deixa coletivamente 1524 01:08:14,660 --> 01:08:16,630 chamá-los de notas aqui. 1525 01:08:16,630 --> 01:08:17,990 Então agora vamos ver o que eu vou fazer. 1526 01:08:17,990 --> 01:08:20,359 Aqui, na linha 24 é o início de um laço. 1527 01:08:20,359 --> 01:08:22,260 Isto é realmente nada extravagante. 1528 01:08:22,260 --> 01:08:25,060 É só usar questionários em vez de um número codificado. 1529 01:08:25,060 --> 01:08:27,790 Mas não há nada intelectualmente diferente lá desde a semana passada. 1530 01:08:27,790 --> 01:08:29,040 Este é apenas printf. 1531 01:08:29,040 --> 01:08:35,490 Então printf ("quiz número% d de% d"), porque eu só quero imprimir me dar questionário 1532 01:08:35,490 --> 01:08:38,050 um número de dois e, em seguida, dois a dois. 1533 01:08:38,050 --> 01:08:39,850 Portanto, esta é puramente uma coisa estética. 1534 01:08:39,850 --> 01:08:42,500 Mas a parte interessante agora é na linha 27. 1535 01:08:42,500 --> 01:08:48,310 A fim de preencher um dos dois marcadores de posição com um ponto flutuante 1536 01:08:48,310 --> 01:08:51,029 valor, você novamente usar colchetes. 1537 01:08:51,029 --> 01:08:55,620 Neste caso, eu estou usando i porque este loop começou com i igualando 1538 01:08:55,620 --> 01:08:57,560 qual o valor que, aparentemente? 1539 01:08:57,560 --> 01:08:58,279 0. 1540 01:08:58,279 --> 01:09:01,350 >> Assim, na primeira iteração do loop, é como se eu 1541 01:09:01,350 --> 01:09:02,689 escreveu isso no código. 1542 01:09:02,689 --> 01:09:05,580 Mas na segunda iteração do loop, é como se eu 1543 01:09:05,580 --> 01:09:07,750 escreveu isso no meu código. 1544 01:09:07,750 --> 01:09:10,750 Mas o fato de que eu estou usando uma variável é perfeito, porque, como o nome 1545 01:09:10,750 --> 01:09:14,300 sugere, está variando o seu valor a cada iteração. 1546 01:09:14,300 --> 01:09:17,370 Então, eu estou preenchendo essa matriz um ponto de cada vez. 1547 01:09:17,370 --> 01:09:18,910 O que essa matriz se parece? 1548 01:09:18,910 --> 01:09:21,430 Bem, a razão Eu tirei este rectângulo super simples na tela aqui 1549 01:09:21,430 --> 01:09:23,350 antes era por este motivo. 1550 01:09:23,350 --> 01:09:27,279 Uma matriz é apenas um pedaço de memória seguido por outro pedaço de memória, 1551 01:09:27,279 --> 01:09:30,109 seguido por um outro bloco de memória, e assim por diante. 1552 01:09:30,109 --> 01:09:35,260 Então, se minha matriz é de tamanho 2, neste caso aqui, tudo o que eu estaria fazendo por 1553 01:09:35,260 --> 01:09:37,590 digitando na pontuação meus quiz, como aqui. 1554 01:09:37,590 --> 01:09:39,430 Eu tenho 100 em um presente. 1555 01:09:39,430 --> 01:09:42,020 E então eu tenho um 99 em um presente. 1556 01:09:42,020 --> 01:09:46,040 Então, essa memória não pode ser usado até mesmo porque eu só perguntei o 1557 01:09:46,040 --> 01:09:48,689 computador para uma matriz de tamanho 2. 1558 01:09:48,689 --> 01:09:50,180 Essas praças ainda estão lá. 1559 01:09:50,180 --> 01:09:50,340 Certo? 1560 01:09:50,340 --> 01:09:52,500 Você ainda tem dois gigabytes de memória RAM, mesmo se você estiver apenas 1561 01:09:52,500 --> 01:09:53,979 pedindo dois carros alegóricos. 1562 01:09:53,979 --> 01:09:58,710 Assim, a idéia por trás de matrizes é que o computador só tem um pedaço da memória 1563 01:09:58,710 --> 01:10:03,230 e depois reparte pequenos pedaços de costas para trás, para trás. 1564 01:10:03,230 --> 01:10:04,740 E para que é tudo uma matriz é. 1565 01:10:04,740 --> 01:10:09,080 É um pedaço contíguo de memória, dentro do qual você pode colocar as coisas. 1566 01:10:09,080 --> 01:10:12,400 >> Agora isso acontecer para depois fazer apenas alguns aritmética chato. 1567 01:10:12,400 --> 01:10:16,170 Se eu rolar por aqui, este é o lugar onde eu então iterar sobre o array. 1568 01:10:16,170 --> 01:10:19,410 Eu venho com o somatório de todos os valores na matriz. 1569 01:10:19,410 --> 01:10:22,390 E então eu uso a função round aqui para realmente fazer o 1570 01:10:22,390 --> 01:10:23,940 Resumindo dividido por testes. 1571 01:10:23,940 --> 01:10:27,450 Mas deixe-me acenar a minha mão em que, como espécie de aritmética suficiente por enquanto. 1572 01:10:27,450 --> 01:10:30,010 Mas tudo o que está fazendo para mim, em última análise é o cálculo de uma média. 1573 01:10:30,010 --> 01:10:33,640 Então, primeiro teste mais segundo questionário, dividido por 2, e depois imprimir 1574 01:10:33,640 --> 01:10:34,700 lo como um int. 1575 01:10:34,700 --> 01:10:39,030 >> Mas vamos transição agora a um exemplo diferente, chamado string1, 1576 01:10:39,030 --> 01:10:42,370 que pinta um quadro similar, mas usando cordas. 1577 01:10:42,370 --> 01:10:45,550 Deixe-me ir em frente e simplificar este apenas por um momento. 1578 01:10:45,550 --> 01:10:48,340 E perdoa o recuo para agora. 1579 01:10:48,340 --> 01:10:52,280 Observe na linha 19 deste exemplo, eu recebo uma string do usuário. 1580 01:10:52,280 --> 01:10:55,780 Mas note o que eu estou fazendo no próximo linhas de 22 em diante. 1581 01:10:55,780 --> 01:11:00,260 Na verdade, estou repetindo a partir de i-se - e este é um novo truque - 1582 01:11:00,260 --> 01:11:02,730 strlen comprimento da corda,. 1583 01:11:02,730 --> 01:11:07,010 Esta é uma função que vem com o C que se você passar uma corda, ele diz 1584 01:11:07,010 --> 01:11:08,950 quantos personagens estão em que seqüência. 1585 01:11:08,950 --> 01:11:09,440 Isto é tudo. 1586 01:11:09,440 --> 01:11:12,520 O fato de que é strlen em vez de comprimento da corda é só porque ele é 1587 01:11:12,520 --> 01:11:13,040 mais sucinto. 1588 01:11:13,040 --> 01:11:17,100 30 anos atrás, as pessoas gostavam de escrever coisas da forma mais sucinta possível. 1589 01:11:17,100 --> 01:11:19,080 Então, nós temos mantido essa convenção aqui. 1590 01:11:19,080 --> 01:11:21,730 i + + significa apenas incrementar i em cada iteração. 1591 01:11:21,730 --> 01:11:24,310 E agora perceber isso, o que é realmente interessante. 1592 01:11:24,310 --> 01:11:28,730 Assim, na linha 24, eu digo computador, dá-me um personagem, oito 1593 01:11:28,730 --> 01:11:30,770 bits, e chamá-lo c. 1594 01:11:30,770 --> 01:11:35,370 Mas o que é isso no lado direito dizendo? 1595 01:11:35,370 --> 01:11:38,150 Em Inglês, o que isso representa? 1596 01:11:38,150 --> 01:11:40,070 [Inaudível] 1597 01:11:40,070 --> 01:11:40,490 DAVID J. MALAN: Exatamente. 1598 01:11:40,490 --> 01:11:42,390 Dá-me o primeiro caractere na matriz. 1599 01:11:42,390 --> 01:11:45,400 Ou, mais geralmente, dá-me o caráter i-th na matriz. 1600 01:11:45,400 --> 01:11:48,230 E perceber que é importante agora que, como cientistas da computação, estamos, na verdade, 1601 01:11:48,230 --> 01:11:49,330 contagem de 0. 1602 01:11:49,330 --> 01:11:51,290 Você não tem critério agora para começar a fazer isso. 1603 01:11:51,290 --> 01:11:54,580 Agora você tem que se comportar de acordo com as expectativas do computador e 1604 01:11:54,580 --> 01:11:58,010 contar a partir de zero, porque [0] vai ser o primeiro 1605 01:11:58,010 --> 01:11:59,670 caractere em uma string. 1606 01:11:59,670 --> 01:12:01,320 [1] vai ser o segundo. 1607 01:12:01,320 --> 01:12:03,610 [2] vai ser o terceiro, e assim por diante. 1608 01:12:03,610 --> 01:12:08,840 Portanto, este programa, se eu compilá-lo - isto é, novamente, string1. 1609 01:12:08,840 --> 01:12:11,040 >> Então faça string1. 1610 01:12:11,040 --> 01:12:16,730 E agora eu corro string1 na minha janela de terminal. 1611 01:12:16,730 --> 01:12:19,180 Ele está esperando por entrada, então eu vou digitar, por exemplo, David. 1612 01:12:19,180 --> 01:12:20,080 Enter. 1613 01:12:20,080 --> 01:12:23,350 E agora ela imprime DAVID tudo em linhas diferentes, porque 1614 01:12:23,350 --> 01:12:24,430 perceber o que estou fazendo. 1615 01:12:24,430 --> 01:12:27,510 Estou imprimindo um caráter de cada vez. 1616 01:12:27,510 --> 01:12:29,100 Agora, não vou entrar em detalhes hoje sobre isso. 1617 01:12:29,100 --> 01:12:31,610 Mas eu apaguei há pouco esta verificação aqui. 1618 01:12:31,610 --> 01:12:36,310 Acontece que se o usuário está se comportando mal, contraditório, ou apenas 1619 01:12:36,310 --> 01:12:41,780 confuso, você pode realmente deixar de dar uma seqüência de algum tempo. 1620 01:12:41,780 --> 01:12:43,640 Se você bater na tecla errada no teclado, você pode dar 1621 01:12:43,640 --> 01:12:44,390 nenhuma seqüência em tudo. 1622 01:12:44,390 --> 01:12:47,790 Ou se você é malicioso, você pode tentar colar no valor de um gigabyte de um 1623 01:12:47,790 --> 01:12:49,380 ensaio para preencher essa seqüência. 1624 01:12:49,380 --> 01:12:52,060 E se o computador ficar sem memória, verifica-se que vamos 1625 01:12:52,060 --> 01:12:54,310 para voltar este valor especial chamado null. 1626 01:12:54,310 --> 01:12:57,550 Então, por enquanto, só sei que há esse valor especial chamado nula de que 1627 01:12:57,550 --> 01:13:01,000 nos permitirá verificar quando estamos fora de memória, entre outras coisas. 1628 01:13:01,000 --> 01:13:07,330 >> Mas se eu abrir agora string2, notar uma diferença aqui. 1629 01:13:07,330 --> 01:13:09,760 Observe uma diferença aqui com string2. 1630 01:13:09,760 --> 01:13:13,260 Com string2, este loop é um pouco diferente. 1631 01:13:13,260 --> 01:13:16,350 Deixe-me apagar os nulos, para que possamos falar sobre isso outra hora. 1632 01:13:16,350 --> 01:13:18,460 Mas o que é diferente sobre o laço for desta vez? 1633 01:13:21,580 --> 01:13:23,160 E eu posso voltar para o exemplo anterior. 1634 01:13:23,160 --> 01:13:24,800 Então essa é a versão dois. 1635 01:13:24,800 --> 01:13:27,020 Esta é uma versão. 1636 01:13:27,020 --> 01:13:31,935 Um, dois, um, dois. 1637 01:13:35,030 --> 01:13:38,240 Assim, a chamada strlen é onde? 1638 01:13:38,240 --> 01:13:40,420 É na primeira parte do loop. 1639 01:13:40,420 --> 01:13:43,060 Todos os pensamentos a respeito de porque eu estou fazendo isso? 1640 01:13:43,060 --> 01:13:43,690 Sim. 1641 01:13:43,690 --> 01:13:46,010 [Inaudível] 1642 01:13:46,010 --> 01:13:47,630 DAVID J. MALAN: Então nós não chamar a função a cada momento. 1643 01:13:47,630 --> 01:13:48,040 Exatamente. 1644 01:13:48,040 --> 01:13:50,350 Lembre-se de laços que são super simples, uma vez que tipo de 1645 01:13:50,350 --> 01:13:52,180 compreender que esta é a inicialização, o 1646 01:13:52,180 --> 01:13:53,330 condição, e da atualização. 1647 01:13:53,330 --> 01:13:55,430 O problema é que a condição ocorre em cada 1648 01:13:55,430 --> 01:13:56,600 iteração do loop. 1649 01:13:56,600 --> 01:13:59,930 E assim, neste exemplo aqui, o que é ruim sobre o fato 1650 01:13:59,930 --> 01:14:03,500 que esta é a minha condição? 1651 01:14:03,500 --> 01:14:05,920 Você está chamando strlen novo e de novo e de novo. 1652 01:14:05,920 --> 01:14:08,990 Mas uma vez que eu digitei em DAVID, o comprimento da corda que é cinco. 1653 01:14:08,990 --> 01:14:11,560 E isso não vai mudar em cada iteração do loop, porque o 1654 01:14:11,560 --> 01:14:15,560 string é ainda D-A-V-I-D. Portanto, esta é uma dica do que vai se tornar um 1655 01:14:15,560 --> 01:14:19,650 idéia cada vez mais importante conhecida como uma decisão de projeto, onde - apenas não 1656 01:14:19,650 --> 01:14:21,640 fazer o computador fazer um trabalho desnecessário. 1657 01:14:21,640 --> 01:14:25,630 >> Agora, assim como uma prévia de pset 2, pset 2 na edição padrão é 1658 01:14:25,630 --> 01:14:28,850 vai desafiá-lo para realmente implementar um número de cifras, alguns 1659 01:14:28,850 --> 01:14:32,650 número de algoritmos de criptografia, de modo que você pode criptografar e descriptografar 1660 01:14:32,650 --> 01:14:35,530 mensagens secretas, bem como o Ralphie um lá decodificado. 1661 01:14:35,530 --> 01:14:38,720 Na edição de hacker de pset 2, vamos ir um pouco mais longe. 1662 01:14:38,720 --> 01:14:42,010 Nós vamos entregar-lhe um arquivo de um sistema de computador que contém um real 1663 01:14:42,010 --> 01:14:45,690 monte de nomes de usuário e senhas criptografadas reais, eo desafio 1664 01:14:45,690 --> 01:14:49,110 para a edição de hacker vai ser para quebrar as senhas e figura 1665 01:14:49,110 --> 01:14:53,060 o que a criptografia ou o segredo foi usado para realmente 1666 01:14:53,060 --> 01:14:55,080 gerar as senhas. 1667 01:14:55,080 --> 01:14:58,360 E nós vamos fazer isso usando um novo recurso aqui de C que eu vou dar 1668 01:14:58,360 --> 01:15:02,200 você apenas uma demo de, conhecido como linha de comando argumentos. 1669 01:15:02,200 --> 01:15:05,930 >> Então não é que, como alguns de vocês podem ter visto na seção ou nos livros didáticos, 1670 01:15:05,930 --> 01:15:09,850 principal nem sempre tem que ser nula entre parênteses. 1671 01:15:09,850 --> 01:15:14,060 Acontece que principal também pode ser escrito assim, com dois argumentos, 1672 01:15:14,060 --> 01:15:19,690 argc e argv, onde argc é o número de palavras que você escreva depois 1673 01:15:19,690 --> 01:15:21,940 o nome do programa na linha de comando. 1674 01:15:21,940 --> 01:15:24,550 E argv são as palavras reais. 1675 01:15:24,550 --> 01:15:29,470 E, como os colchetes lá sugerir, argv é, aparentemente, um array. 1676 01:15:29,470 --> 01:15:33,720 Vai ser uma seqüência, após uma série depois de uma série na memória. 1677 01:15:33,720 --> 01:15:36,170 Então, o que nós vamos ser capazes de fazer, começando com pset 2, é 1678 01:15:36,170 --> 01:15:37,310 algo como isto. 1679 01:15:37,310 --> 01:15:42,450 Se eu fizer argv1, que é um exemplo que vai voltar para segunda-feira, e executar 1680 01:15:42,450 --> 01:15:45,180 ela, perceberá que ela não parece fazer nada ainda. 1681 01:15:45,180 --> 01:15:47,050 Ele só imprime seu próprio nome. 1682 01:15:47,050 --> 01:15:53,220 Mas se eu disser adeus classe, aviso que este programa aparentemente itera 1683 01:15:53,220 --> 01:15:57,030 sobre cada uma das palavras que foram digitados no prompt. 1684 01:15:57,030 --> 01:16:02,050 E os meios pelos quais nós vamos ter acesso a palavras que o usuário tem 1685 01:16:02,050 --> 01:16:06,780 digitado no prompt é mudando principal, a partir deste fim de semana, a partir de int 1686 01:16:06,780 --> 01:16:10,710 main (void) para int main (argc, argv). 1687 01:16:10,710 --> 01:16:13,700 E assim vai nascer argumentos de linha de comando. 1688 01:16:13,700 --> 01:16:17,210 E uma vez que você realmente sofisticado com isso, você vai ser capaz de escrever 1689 01:16:17,210 --> 01:16:21,370 programas realmente trippy, como este aqui, que vai acima e além 1690 01:16:21,370 --> 01:16:25,520 algumas das funcionalidades que temos feito até agora, mas todos muito poderoso. 1691 01:16:25,520 --> 01:16:27,330 >> Então, vamos deixar isso com isso na tela. 1692 01:16:27,330 --> 01:16:29,160 E nós vamos vê-lo na segunda-feira.