1 00:00:07,420 --> 00:00:08,160 [Powered by Google Translate] DAVID J. Malan: Todo ben. 2 00:00:08,160 --> 00:00:11,170 Este é CS50, e este é o fin da segunda semana. 3 00:00:11,170 --> 00:00:14,650 Se esperar a estar con fame volta a esta hora mañá, sabe que nós estamos indo 4 00:00:14,650 --> 00:00:18,920 a convocatoria de mañá como un pequeno grupo, xoves, 1:15 PM. 5 00:00:18,920 --> 00:00:21,460 Hai esa URL aquí se desexa RSVP. 6 00:00:21,460 --> 00:00:25,270 O espazo é limitado, polo tanto, por favor, Perdoando o formulario foi cuberto polo tempo que 7 00:00:25,270 --> 00:00:26,680 cubrir iso. 8 00:00:26,680 --> 00:00:29,400 Outra URL con todo, que pode ser de interese é ese. 9 00:00:29,400 --> 00:00:32,409 >> Así, en só preto de un mes, o curso vai ser facilitado 10 00:00:32,409 --> 00:00:36,090 todo o máis amplamente a través de EDX, a través do cal as persoas na Internet será 11 00:00:36,090 --> 00:00:39,580 capaz de seguir, participar no curso bastante activa, en realidade. 12 00:00:39,580 --> 00:00:43,070 Eles van estar a usar o aparello CS50 e CS50 Discutir e na maioría das 13 00:00:43,070 --> 00:00:45,840 diversas ferramentas de software que xa foron usar este semestre. 14 00:00:45,840 --> 00:00:49,030 E unha das iniciativas que quere asumir como unha experiencia deste ano 15 00:00:49,030 --> 00:00:53,120 é ver o que de contido que se pode traducir en outras linguas faladas e 16 00:00:53,120 --> 00:00:54,110 linguas escritas. 17 00:00:54,110 --> 00:00:58,000 Entón, se pode ter interese en participar neste proxecto, que 18 00:00:58,000 --> 00:01:02,090 imos proporcionar transcricións en inglés e subtítulos para o seu curso 19 00:01:02,090 --> 00:01:05,190 conferencias e shorts e seminarios e seccións e similares - 20 00:01:05,190 --> 00:01:08,700 se falar fluentemente ou escribir con fluidez outra lingua, teriamos 21 00:01:08,700 --> 00:01:12,240 amo para axusta-lo neste proxecto, que toma un ou máis dos 22 00:01:12,240 --> 00:01:15,340 vídeos, traducindo os nunha lingua que coñece moi ben. 23 00:01:15,340 --> 00:01:19,050 Para darlle un sentido de interface, non hai esa interface de usuario baseada na web 24 00:01:19,050 --> 00:01:22,330 que nós imos usar que pode crear, esencialmente, unha interface de usuario como este. 25 00:01:22,330 --> 00:01:24,520 Isto foi me ensinando uns Halloween atrás. 26 00:01:24,520 --> 00:01:27,710 E no lado dereito, en negro ao lado destes selos de tempo, 27 00:01:27,710 --> 00:01:31,300 vai ver as moitas cousas que saíron da miña boca aquel día. 28 00:01:31,300 --> 00:01:34,660 E entón a continuación, será capaz de traducir a outra lingua. 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, español. 31 00:01:38,660 --> 00:01:40,480 Entón, é realmente unha ferramenta moi agradable. 32 00:01:40,480 --> 00:01:43,690 Pode retroceder e avanzar moi rapidamente con atallos de teclado. 33 00:01:43,690 --> 00:01:46,710 Entón, se quere participar nesta experiencia e ter as súas palabras 34 00:01:46,710 --> 00:01:50,730 visto e lido por potencialmente miles de persoas alí fóra, por favor, me sinto 35 00:01:50,730 --> 00:01:51,960 libre para participar. 36 00:01:51,960 --> 00:01:56,940 >> Agora unha palabra sobre o gatinho de luns, para que non nos enviou un excedente 37 00:01:56,940 --> 00:01:58,120 mensaxe asustado. 38 00:01:58,120 --> 00:02:02,130 Facer entender que, como o horario de oficina suxerir e como seccións suxiren, o 39 00:02:02,130 --> 00:02:05,110 proxecto do curso é moi de alumnos a colaborar e 40 00:02:05,110 --> 00:02:09,250 falando para traballar con conxuntos de problemas e os problemas xuntos. 41 00:02:09,250 --> 00:02:13,630 E realmente a liña se reduce a, unha vez máis, o traballo que, en última análise 42 00:02:13,630 --> 00:02:16,420 deberá presentar debe ser o seu propio. 43 00:02:16,420 --> 00:02:19,080 E por iso é moi sincero - en horario de oficina, é totalmente normal - 44 00:02:19,080 --> 00:02:21,560 É totalmente de esperar, mesmo - para estar falando con algunhas 45 00:02:21,560 --> 00:02:22,370 amigos ao seu lado. 46 00:02:22,370 --> 00:02:25,240 Se el ou ela está loitando con algún tema, e é como, oh, así imos 47 00:02:25,240 --> 00:02:27,750 me dar-lle un reflexo de algunha liña de código que eu escribín. 48 00:02:27,750 --> 00:02:28,290 Isto é bo. 49 00:02:28,290 --> 00:02:28,700 Isto acontece. 50 00:02:28,700 --> 00:02:31,580 E iso é moi favorable, creo que, co proceso de aprendizaxe. 51 00:02:31,580 --> 00:02:35,270 Onde a liña, unha vez máis, queda cruzada é cando a cabeza é inclinado por riba da especie 52 00:02:35,270 --> 00:02:38,800 aquí a un segundo lonxe de máis ou minutos para que realmente a ter só 53 00:02:38,800 --> 00:02:41,250 foi unha oportunidade de desbloqueo para o seu amigo. 54 00:02:41,250 --> 00:02:43,870 E, por suposto, cando as cousas están trocadas por correo electrónico e Dropbox e 55 00:02:43,870 --> 00:02:45,350 semellante, hai tamén o é a liña. 56 00:02:45,350 --> 00:02:48,940 Entón, por todos os medios, sentirse cómodo e sentirse encoraxados a falar con amigos 57 00:02:48,940 --> 00:02:51,270 e compañeiros sobre serie de exercicios e moito máis. 58 00:02:51,270 --> 00:02:54,680 E só entende que o que en última análise, presentar debe ser realmente a 59 00:02:54,680 --> 00:02:57,780 produto da súa creación e non outra persoa. 60 00:02:57,780 --> 00:03:01,010 >> Así, na mesma liña de criaturas peluches, pode 61 00:03:01,010 --> 00:03:02,820 coñezo este cara aquí. 62 00:03:02,820 --> 00:03:06,180 Polo tanto, este é un filme terrible brega de anos. 63 00:03:06,180 --> 00:03:08,680 Alguén aquí viu Spaceballs? 64 00:03:08,680 --> 00:03:09,120 Todo ben. 65 00:03:09,120 --> 00:03:10,220 Así, un bo número aquí. 66 00:03:10,220 --> 00:03:13,840 Entón esta é a nosa maneira marabillosas académica introducir finalmente hoxe 67 00:03:13,840 --> 00:03:15,130 a noción de cifrado. 68 00:03:15,130 --> 00:03:19,010 E así un dos problemas de dominio específico para pset 2, que virá 69 00:03:19,010 --> 00:03:22,770 mañá á noite tarde, e mergullo no mundo da criptografía, o que 70 00:03:22,770 --> 00:03:26,380 é a arte de cifrado ou codificación da información. 71 00:03:26,380 --> 00:03:30,160 E esta última instancia, para o mundo da seguridade. 72 00:03:30,160 --> 00:03:34,440 >> Agora máis seguridade para nós ven en forma de mecanismos moi mundanas. 73 00:03:34,440 --> 00:03:36,920 Todos temos nomes de usuario e contrasinais. 74 00:03:36,920 --> 00:03:41,350 E todos nós temos nomes de usuarios e contrasinais moi malas, máis probable. 75 00:03:41,350 --> 00:03:45,250 Se o teu contrasinal é o mesmo en varios sitios, que probablemente non é 76 00:03:45,250 --> 00:03:47,920 a mellor idea, como discutir en dirección ao fin do semestre. 77 00:03:47,920 --> 00:03:51,680 Se o teu contrasinal está escrito nunha nota - non é broma - no seu 78 00:03:51,680 --> 00:03:55,130 monitor, que tamén non é necesariamente o mellor proxecto, pero bastante común 79 00:03:55,130 --> 00:03:56,140 fenómeno. 80 00:03:56,140 --> 00:04:00,420 E se non está a usar cifrado para cifrar as súas claves, son 81 00:04:00,420 --> 00:04:01,610 particularmente vulnerables. 82 00:04:01,610 --> 00:04:04,670 Entón, se pensas que está a ser super intelixente por unha palabra oculta 83 00:04:04,670 --> 00:04:07,740 documento en algún lugar no seu disco duro que ten todas as súas claves, pero 84 00:04:07,740 --> 00:04:10,550 está nunha carpeta que ninguén vai buscar, iso non é moi 85 00:04:10,550 --> 00:04:11,540 mecanismo seguro. 86 00:04:11,540 --> 00:04:15,100 E entón o que pset 2 ha introducir e esta arte de cifrado e 87 00:04:15,100 --> 00:04:18,300 loitando información para que cousas como claves son 88 00:04:18,300 --> 00:04:19,500 todo o máis seguro. 89 00:04:19,500 --> 00:04:24,500 De xeito motivar este problema moito no mundo real cun moi non do mundo real 90 00:04:24,500 --> 00:04:28,740 escenario, deixe-me presenta-lo a un dos nosos clips favoritos aquí deste 91 00:04:28,740 --> 00:04:29,895 película, Spaceballs. 92 00:04:29,895 --> 00:04:30,565 >> [REPRODUCIÓN] 93 00:04:30,565 --> 00:04:32,995 -Helmet, que demo, o que está a suceder? 94 00:04:32,995 --> 00:04:34,730 O que está facendo a miña filla? 95 00:04:34,730 --> 00:04:38,960 -Permítame presentar o cirurxián plástico brillante moza, o Dr Philip 96 00:04:38,960 --> 00:04:43,290 Schlotkin, o home maior nariz en todo o 97 00:04:43,290 --> 00:04:45,526 universo e Beverly Hills. 98 00:04:45,526 --> 00:04:46,450 -A súa Alteza. 99 00:04:46,450 --> 00:04:47,380 -Nariz traballo? 100 00:04:47,380 --> 00:04:48,035 Non estou entendendo. 101 00:04:48,035 --> 00:04:49,480 Ela xa tiña un traballo nariz. 102 00:04:49,480 --> 00:04:51,490 Foi un agasallo de 16 doce. 103 00:04:51,490 --> 00:04:53,090 -Non, non é o que pensa. 104 00:04:53,090 --> 00:04:55,150 É moi, moito peor. 105 00:04:55,150 --> 00:04:59,860 Se non me dá a combinación do escudo de aire, o Dr Schlotkin vontade 106 00:04:59,860 --> 00:05:04,135 dar a súa filla de volta o seu vello nariz. 107 00:05:04,135 --> 00:05:05,385 -Non! 108 00:05:08,202 --> 00:05:10,186 De onde tirou iso? 109 00:05:10,186 --> 00:05:11,178 -Todo ben. 110 00:05:11,178 --> 00:05:11,674 Eu vou dicir. 111 00:05:11,674 --> 00:05:12,666 Eu vou dicir. 112 00:05:12,666 --> 00:05:14,154 -Non, papá, non. 113 00:05:14,154 --> 00:05:15,150 Non debe. 114 00:05:15,150 --> 00:05:16,460 -Está ben, miña querida. 115 00:05:16,460 --> 00:05:18,450 Vou sentir falta do seu nariz novo. 116 00:05:18,450 --> 00:05:21,550 Pero eu non vou dicir-lles a combinación, non importa o que. 117 00:05:21,550 --> 00:05:23,100 -Moi ben. 118 00:05:23,100 --> 00:05:25,510 Dr Schlotkin, faga o seu peor. 119 00:05:25,510 --> 00:05:26,760 -O pracer é meu. 120 00:05:30,560 --> 00:05:31,180 -Non! 121 00:05:31,180 --> 00:05:33,450 Espere, espere. 122 00:05:33,450 --> 00:05:34,770 Eu vou dicir. 123 00:05:34,770 --> 00:05:36,400 Eu vou dicir. 124 00:05:36,400 --> 00:05:38,630 -Eu sabía que el ía traballar. 125 00:05:38,630 --> 00:05:42,040 Todo ben, para min. 126 00:05:42,040 --> 00:05:46,890 -A combinación é un. 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 -Tres 133 00:05:50,715 --> 00:05:51,380 -Tres. 134 00:05:51,380 --> 00:05:52,390 -Tres. 135 00:05:52,390 --> 00:05:53,200 -Catro. 136 00:05:53,200 --> 00:05:53,720 -Catro. 137 00:05:53,720 --> 00:05:55,830 -Catro. 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 -Así, a combinación é un, dous, tres, catro, cinco. 142 00:06:03,770 --> 00:06:06,745 Esta é a combinación máis estúpida que eu xa oín na miña vida. 143 00:06:06,745 --> 00:06:09,290 Ese é o tipo de cousa que un idiota tería na súa equipaxe. 144 00:06:09,290 --> 00:06:11,540 -Grazas, a súa Alteza. 145 00:06:11,540 --> 00:06:12,940 -O que fixo? 146 00:06:12,940 --> 00:06:14,230 -Eu desliguei a parede. 147 00:06:14,230 --> 00:06:14,630 -Non, non fixo. 148 00:06:14,630 --> 00:06:15,430 Vostede desactivar o filme todo. 149 00:06:15,430 --> 00:06:16,722 -Eu debo ter presionado o botón errado. 150 00:06:16,722 --> 00:06:18,078 -Ben, colocar-lo de volta. 151 00:06:18,078 --> 00:06:18,805 Pon a película de novo. 152 00:06:18,805 --> 00:06:19,080 -Si, señor. 153 00:06:19,080 --> 00:06:19,270 Si, señor. 154 00:06:19,270 --> 00:06:19,830 -Imos, Erna. 155 00:06:19,830 --> 00:06:20,270 Veña, Gretchen. 156 00:06:20,270 --> 00:06:22,850 Está claro que vostede sabe que eu aínda vou ter que cobre-lo por iso. 157 00:06:27,400 --> 00:06:28,325 -Ben, iso funcionou? 158 00:06:28,325 --> 00:06:29,550 Onde está o portón? 159 00:06:29,550 --> 00:06:29,910 -Funcionou, señor. 160 00:06:29,910 --> 00:06:30,770 Temos a combinación. 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 aire fresco do planeta Druidia. 163 00:06:35,630 --> 00:06:36,550 Cal é a combinación? 164 00:06:36,550 --> 00:06:38,805 -Un, dous, tres, catro, cinco. 165 00:06:38,805 --> 00:06:40,610 -Un, dous, tres, catro, cinco? 166 00:06:40,610 --> 00:06:41,070 -Si. 167 00:06:41,070 --> 00:06:41,760 -Isto é incrible. 168 00:06:41,760 --> 00:06:45,200 Eu teño a mesma combinación na miña equipaxe. 169 00:06:45,200 --> 00:06:47,800 Prepare Spaceball 1 a partida inmediata. 170 00:06:47,800 --> 00:06:48,536 -Si, señor. 171 00:06:48,536 --> 00:06:52,350 -E cambiar a combinación na miña equipaxe. 172 00:06:52,350 --> 00:06:53,250 -Ai! 173 00:06:53,250 --> 00:06:55,020 [REPRODUCIÓN FIN] 174 00:06:55,020 --> 00:06:57,470 >> DAVID J. Malan: Un filme sorprendente que ten que ver agora todo. 175 00:07:00,600 --> 00:07:06,540 Así, no contexto aquí é que, con datos inseguras vén unha oportunidade para 176 00:07:06,540 --> 00:07:07,790 criptografía-lo e para embaralhar-lo. 177 00:07:07,790 --> 00:07:11,060 E para que este, por exemplo, é un exemplo dunha mensaxe cifrada. 178 00:07:11,060 --> 00:07:12,980 Isto realmente di algo en inglés. 179 00:07:12,980 --> 00:07:14,750 Pero non é claramente totalmente obvio. 180 00:07:14,750 --> 00:07:17,360 E imos pechar o círculo hoxe a separar o que este segredo 181 00:07:17,360 --> 00:07:18,380 mensaxe aquí é. 182 00:07:18,380 --> 00:07:22,370 Pero no mundo real dos ordenadores, as cousas nin sequera ollar como eles puidesen 183 00:07:22,370 --> 00:07:23,440 ser frases en inglés. 184 00:07:23,440 --> 00:07:27,500 Por exemplo, este é o que se pode atopar nun estándar de Linux ou Mac ou 185 00:07:27,500 --> 00:07:32,080 Unix ordenador nun arquivo que foi unha vez chamado de arquivo de contrasinal. 186 00:07:32,080 --> 00:07:34,170 Hoxe en día, el foi trasladado para outros lugares. 187 00:07:34,170 --> 00:07:38,660 Pero se ollar no lugar seguro nun sistema, vai ver non só o seu 188 00:07:38,660 --> 00:07:41,430 nome de usuario ou a outras persoas sobre o sistema, pero vai ver un 189 00:07:41,430 --> 00:07:43,410 versión cifrada de contrasinal. 190 00:07:43,410 --> 00:07:47,800 De feito, a cripta palabra alí suxire que as seguintes cousas son criptografada. 191 00:07:47,800 --> 00:07:52,030 E esta serie de letras aparentemente aleatorias e personaxes e números e 192 00:07:52,030 --> 00:07:56,370 así por diante pode ser decifrada só por xeralmente sabendo algún segredo - 193 00:07:56,370 --> 00:07:58,600 unha palabra secreta, un número secreto. 194 00:07:58,600 --> 00:08:02,760 E así, de feito, a arte de cifrado, en última análise resúmese a confianza dalgúns 195 00:08:02,760 --> 00:08:05,700 tipo e saber algo que alguén non fai. 196 00:08:05,700 --> 00:08:10,010 Imos explorar iso en detalles un pouco máis hoxe e no pset para vir. 197 00:08:10,010 --> 00:08:11,860 >> E agora unha palabra sobre pasa / fallo. 198 00:08:11,860 --> 00:08:15,250 Así, principalmente, como algúns de vós xa mergullou pset 1, o aparello, e 199 00:08:15,250 --> 00:08:18,390 un mundo moi novo para ti, entender que as frustracións e 200 00:08:18,390 --> 00:08:21,340 dificultades confusión e só técnica son de esperar. 201 00:08:21,340 --> 00:08:24,410 Especialmente co pset primeiro, onde hai tanta cousa nova, só comezando 202 00:08:24,410 --> 00:08:28,830 familiarizado con ls e CD e todos estes comandos arcanos nun novo ambiente. 203 00:08:28,830 --> 00:08:32,679 E iso é separado do material real e propia programación. 204 00:08:32,679 --> 00:08:35,960 Así, entender, tamén, que hai certamente expediente que existen como 205 00:08:35,960 --> 00:08:36,770 a estrutura soporte. 206 00:08:36,770 --> 00:08:38,620 Seccións comezan o vindeiro domingo. 207 00:08:38,620 --> 00:08:41,990 Pero o máis importante, se está sentindo só que este non é o 208 00:08:41,990 --> 00:08:44,420 mundo para ti, entender que realmente é só levar tempo. 209 00:08:44,420 --> 00:08:47,520 E se non fose por esa oportunidade hai anos para me de tomar unha clase 210 00:08:47,520 --> 00:08:50,840 aprobación / reprovação, honesta, eu nunca tería sequera puxo os pés na aula. 211 00:08:50,840 --> 00:08:53,520 E pode cambiar isto ata, digamos, o luns quinta do curso. 212 00:08:53,520 --> 00:08:57,110 Entón, se está no bordo agora, entender que, no canto de cabeza nalgún outro 213 00:08:57,110 --> 00:09:01,000 augas completamente, que seguramente considerar só mudando de aprobación / reprovação. 214 00:09:01,000 --> 00:09:03,750 De novo, non hai realmente esta cultura aquí en Harvard de levar as cousas 215 00:09:03,750 --> 00:09:08,080 pasa / falla unha vez que todos realmente quere alcanzar ou overachieve. 216 00:09:08,080 --> 00:09:11,470 Pero, francamente, esta é unha boa forma de probar algo que quizais non 217 00:09:11,470 --> 00:09:13,110 ser familiar para ti. 218 00:09:13,110 --> 00:09:17,090 E vai acabar facendo, na maioría dos casos, moi finos, quizais 219 00:09:17,090 --> 00:09:18,040 para a súa sorpresa. 220 00:09:18,040 --> 00:09:20,850 E, en termos máis concretos, o que eu creo que pasa / fallo xeralmente fai, 221 00:09:20,850 --> 00:09:23,350 especialmente no que se pode probar con pset 0, se pór 222 00:09:23,350 --> 00:09:27,200 en 10 horas, 15 horas, 25 horas nalgúns pset - e só está batendo 223 00:09:27,200 --> 00:09:28,180 súa cabeza contra a parede, 224 00:09:28,180 --> 00:09:29,850 e está quedando super tarde, á noite, 225 00:09:29,850 --> 00:09:31,880 pero tomou o pset como o 90% do camiño, 226 00:09:31,880 --> 00:09:33,780 vostede sabe que simplemente non pode descubrir unha cousa - 227 00:09:33,780 --> 00:09:36,830 pasa / falla realmente leva a bordo fora dunha clase como este, onde pode clasificar 228 00:09:36,830 --> 00:09:39,150 dicir Feliz todo ben, sei que non é perfecto. 229 00:09:39,150 --> 00:09:40,470 Pero eu traballei para caramba sobre iso. 230 00:09:40,470 --> 00:09:42,410 Estou moi feliz con o lugar onde foi parar. 231 00:09:42,410 --> 00:09:44,780 E que van atender as expectativas de aprobación / reprovação. 232 00:09:44,780 --> 00:09:46,850 Así que manter isto presente. 233 00:09:46,850 --> 00:09:47,140 >> Todo ben. 234 00:09:47,140 --> 00:09:50,980 Entón, aqueles de vostedes que teñen se pretensado para usar a Universidade de Harvard Wi-Fi saber 235 00:09:50,980 --> 00:09:54,780 que hai un SSID CS50, unha conexión Wi-Fi por aí que 236 00:09:54,780 --> 00:09:56,520 podería ter mellor sorte para. 237 00:09:56,520 --> 00:09:59,430 É un pouco irónico que o contrasinal para iso - se quere probar 238 00:09:59,430 --> 00:10:03,080 conexión a este para mellores velocidades e deixe-nos saber se non é mellor - 239 00:10:03,080 --> 00:10:09,240 é un, dous, tres, catro, cinco, todo o camiño ata oito por oito é 240 00:10:09,240 --> 00:10:10,270 máis seguro que cinco. 241 00:10:10,270 --> 00:10:15,520 Entón, se precisa de contrasinal de acceso Wi-Fi, conectar-se sen fíos CS50 aquí. 242 00:10:15,520 --> 00:10:16,950 Un, dous, tres, catro, cinco, seis, sete, oito. 243 00:10:16,950 --> 00:10:20,440 E puxo en CS50 Discutir se aínda ten problemas intermitentes de conectividade, 244 00:10:20,440 --> 00:10:24,880 e imos deixar que os poderes que coñece a este espazo. 245 00:10:24,880 --> 00:10:25,180 >> Todo ben. 246 00:10:25,180 --> 00:10:30,350 Entón, un teaser rápido, especialmente para aqueles de vostedes que son nenos ou nenas de fans 247 00:10:30,350 --> 00:10:31,900 de todas as cousas de Apple. 248 00:10:31,900 --> 00:10:37,566 O que eu retirado uns anos era este ficheiro aquí, ilock.c, só para 249 00:10:37,566 --> 00:10:40,930 tipo de facer máis concreto e máis complexa algúns dos máis básicos C 250 00:10:40,930 --> 00:10:42,350 programas que teño escrito. 251 00:10:42,350 --> 00:10:44,360 Entón eu abri-lo arquivo, ilock.c. 252 00:10:44,360 --> 00:10:46,830 Está dispoñible na páxina de charla para hoxe. 253 00:10:46,830 --> 00:10:49,470 No lado esquerdo, podes ver unha longa lista de funcións. 254 00:10:49,470 --> 00:10:51,860 Así, o suxeito que escribiu este escribiu unha morea de funcións, 255 00:10:51,860 --> 00:10:53,290 máis que de inicio. 256 00:10:53,290 --> 00:10:55,490 El usou unha morea de bibliotecas aquí. 257 00:10:55,490 --> 00:11:00,450 E se comezar a percorrer o que isto realmente é é o propio 258 00:11:00,450 --> 00:11:04,670 En primeiro lugar, eu creo, crack para o iPhone orixinal. 259 00:11:04,670 --> 00:11:08,000 Cando quería facer o Jailbreak do iPhone orixinal, o que significa untether 260 00:11:08,000 --> 00:11:11,800 Os da AT & T e que en realidade instalar un programa especial sobre el e facer as cousas 261 00:11:11,800 --> 00:11:13,510 que Apple non quere que as persoas fan - 262 00:11:13,510 --> 00:11:17,020 Ben, alguén tivo tempo para descubrir exactamente como eles poderían explotar 263 00:11:17,020 --> 00:11:20,880 fallos de software, erros, erros no software de Apple. 264 00:11:20,880 --> 00:11:22,650 E así naceu ilock.c. 265 00:11:22,650 --> 00:11:26,670 Que se compilou en un ordenador e instala-lo en un iPhone que 266 00:11:26,670 --> 00:11:29,810 foi conectado ao ordenador a través de, por exemplo, un cable USB, este lle daría 267 00:11:29,810 --> 00:11:33,360 privilexios administrativos ou de raíz no seu iPhone e deixalo facer moi ben 268 00:11:33,360 --> 00:11:34,170 o que quere. 269 00:11:34,170 --> 00:11:36,740 >> E así houbo este gato fascinante e rato entre Apple e 270 00:11:36,740 --> 00:11:39,920 o resto do mundo, en particular no que, como moitas empresas, tentar bloquear 271 00:11:39,920 --> 00:11:43,220 súas cousas para abaixo así que só pode facer con el o que pretenden. 272 00:11:43,220 --> 00:11:46,620 Pero, grazas a xente como esta é a súa comprensión de baixo nivel 273 00:11:46,620 --> 00:11:50,580 detalles e, neste caso, de programación C e un monte de as construcións familiares 274 00:11:50,580 --> 00:11:54,630 que xa comezou a xogar con, vostede é realmente capaz de alavancar o 275 00:11:54,630 --> 00:11:59,050 hardware dun xeito que pensar mellor e non necesariamente unha entidade corporativa. 276 00:11:59,050 --> 00:12:01,360 Así, por exemplo, eu non teño idea do que todo isto está facendo. 277 00:12:01,360 --> 00:12:03,220 Pero GetVersion soa moi sinxelo. 278 00:12:03,220 --> 00:12:05,480 E parece que esa é unha función que a persoa escribiu. 279 00:12:05,480 --> 00:12:09,240 Tomar algún tipo de número enteiro como argumento, non retorna nada, pero 280 00:12:09,240 --> 00:12:13,080 parece loop cun lazo e un aquí a condición, a condición, 281 00:12:13,080 --> 00:12:15,620 romper, e dalgunha forma relacionado con números de versión. 282 00:12:15,620 --> 00:12:16,700 Se rolar - 283 00:12:16,700 --> 00:12:19,570 aínda que moitas destas palabras clave vai ser novo, e hai unha 284 00:12:19,570 --> 00:12:22,590 serie de funcións no aquí nunca vimos e quizais nunca máis ver 285 00:12:22,590 --> 00:12:23,830 o curso do semestre - 286 00:12:23,830 --> 00:12:27,150 ao final do día, el segue as mesmas regras e lóxica que fomos 287 00:12:27,150 --> 00:12:28,760 xogando con ata agora. 288 00:12:28,760 --> 00:12:34,220 Polo tanto, este é vello de máis para romper o seu iPhone ou 3s 4s ou 5S en breve, estes días, 289 00:12:34,220 --> 00:12:37,320 pero sei que está todo moi derivado deste mundo que temos 290 00:12:37,320 --> 00:12:38,430 mergullou. 291 00:12:38,430 --> 00:12:41,900 >> Entón, imos dar un ollo a un exemplo un pouco máis simple. 292 00:12:41,900 --> 00:12:46,100 Este, só para quentar cunha sintaxe e tamén algúns outros datos 293 00:12:46,100 --> 00:12:49,240 tipo que temos falado, pero realmente non teño visto en C. Polo tanto, este é un 294 00:12:49,240 --> 00:12:51,680 arquivo chamado positive1.c. 295 00:12:51,680 --> 00:12:55,120 E polos comentarios na parte superior, iso só esixe que o usuario proporciona un 296 00:12:55,120 --> 00:12:55,960 número positivo. 297 00:12:55,960 --> 00:12:59,530 Entón, é un exemplo de un loop do-tempo, o que é bo para o usuario interactivo 298 00:12:59,530 --> 00:13:01,980 programas en que precisa dicir ao usuario para facer algo. 299 00:13:01,980 --> 00:13:05,190 E se eles non cooperaren, vostede gritar con eles ou rexeitar a súa entrada. 300 00:13:05,190 --> 00:13:11,610 O caso en cuestión, eu vou facer liñas 19 a 24, sempre que o usuario ten 301 00:13:11,610 --> 00:13:14,310 Non me deu un número positivo. 302 00:13:14,310 --> 00:13:20,400 Agora ese detalle aquí na liña 18, por que eu declarar n riba de toda esa 303 00:13:20,400 --> 00:13:24,490 construción de loop en vez de á beira da liña 22, onde 304 00:13:24,490 --> 00:13:26,880 realmente importa para obter n? 305 00:13:26,880 --> 00:13:27,330 Si? 306 00:13:27,330 --> 00:13:27,780 [Inaudível] 307 00:13:27,780 --> 00:13:29,040 >> DAVID J. Malan: Si, entón esa cuestión do ámbito. 308 00:13:29,040 --> 00:13:30,850 E en termos de secular, o que ámbito se refire? 309 00:13:34,690 --> 00:13:36,610 Si? 310 00:13:36,610 --> 00:13:37,860 [Inaudível] 311 00:13:40,040 --> 00:13:41,105 DAVID J. Malan: Pode falar un pouco máis alto? 312 00:13:41,105 --> 00:13:43,450 COLUMNA 1: Onde podes acceder a unha variable particular. 313 00:13:43,450 --> 00:13:45,170 DAVID J. Malan: Perfect. 314 00:13:45,170 --> 00:13:47,360 Onde podes acceder a unha determinada variable. 315 00:13:47,360 --> 00:13:50,400 E, xeralmente, a regra de ouro ata agora foi a de que o alcance dalgunhas 316 00:13:50,400 --> 00:13:55,860 variable é definida polos aparellos máis recentes rizados que xa viu. 317 00:13:55,860 --> 00:14:02,010 E por iso, neste caso, se eu cometín o erro de declarar n na liña 22, 318 00:14:02,010 --> 00:14:03,010 que a liña ía traballar. 319 00:14:03,010 --> 00:14:10,990 Quere obter un int, e quere poñelas en que n variable na liña 22. 320 00:14:10,990 --> 00:14:16,900 Pero cal liña de código que agora non ten idea do que estou falando? 321 00:14:16,900 --> 00:14:22,650 Así, 25, e verifica-se 24, así como, porque, neste caso, está fóra 322 00:14:22,650 --> 00:14:23,610 das claves. 323 00:14:23,610 --> 00:14:27,280 Entón, un pouco de problema, pero moi doado de resolver, simplemente declarando 324 00:14:27,280 --> 00:14:30,140 a variable fóra da propia función. 325 00:14:30,140 --> 00:14:32,600 >> Agora imos ver máis adiante hoxe, pode ir un paso máis aló. 326 00:14:32,600 --> 00:14:34,860 E pode ata quedar un pouco preguiceiro - 327 00:14:34,860 --> 00:14:37,320 e iso non está a ser recomendado en xeral - 328 00:14:37,320 --> 00:14:42,260 pero pode ata ir con preguiza e poñer unha variable global, por así dicir, non 329 00:14:42,260 --> 00:14:46,670 dentro dunha función, e non dentro dun lazo, pero o arquivo en si, fóra 330 00:14:46,670 --> 00:14:49,600 de todas as funcións que escribiu, como eu fixen aquí en liña 15. 331 00:14:49,600 --> 00:14:51,160 Pero este é xeralmente desaprovado. 332 00:14:51,160 --> 00:14:55,680 Pero esta é unha solución, por veces, a outros problemas, como veremos 333 00:14:55,680 --> 00:14:56,620 finalmente ver. 334 00:14:56,620 --> 00:14:58,130 Entón, por agora, imos deixalo así. 335 00:14:58,130 --> 00:15:01,030 Pero imos ver se podemos reescribir iso só para comezar a expresar-nos un 336 00:15:01,030 --> 00:15:01,990 pouco diferente. 337 00:15:01,990 --> 00:15:05,330 >> Polo tanto, este programa, só para quedar claro, é positive1. 338 00:15:05,330 --> 00:15:11,810 Deixe-me ir á fronte e aquí na miña xanela de terminal facer positive1, Intro. 339 00:15:11,810 --> 00:15:12,740 Compila, todo ben. 340 00:15:12,740 --> 00:15:14,910 Vou correr positive1, prema Intro. 341 00:15:14,910 --> 00:15:16,820 Eu esixo que me dea un número enteiro positivo. 342 00:15:16,820 --> 00:15:18,260 Eu vou dicir -1. 343 00:15:18,260 --> 00:15:18,910 Isto non funcionou. 344 00:15:18,910 --> 00:15:22,150 0, 99, que parece funcionar. 345 00:15:22,150 --> 00:15:23,570 Quizais non a proba máis rigoroso. 346 00:15:23,570 --> 00:15:26,480 Pero polo menos é unha proba de sanidade bo que estamos no camiño correcto. 347 00:15:26,480 --> 00:15:29,240 Entón, agora deixe-me ir adiante e abra a versión dous deste. 348 00:15:29,240 --> 00:15:32,500 E o que é diferente xa? 349 00:15:32,500 --> 00:15:35,140 El aplica a mesma cousa. 350 00:15:35,140 --> 00:15:40,660 Pero o que está pulando fóra tan claramente distinto desta vez? 351 00:15:40,660 --> 00:15:42,560 Si, así que este bool en verde. 352 00:15:42,560 --> 00:15:45,980 Gedit ten destaque na palabra clave deste verde coñecida como bool, 353 00:15:45,980 --> 00:15:47,000 que é un tipo de datos. 354 00:15:47,000 --> 00:15:51,080 El non vén construído en todas as versións de C. Debe incluír un 355 00:15:51,080 --> 00:15:52,010 biblioteca particular. 356 00:15:52,010 --> 00:15:54,770 No noso caso, inclúe a biblioteca para que CS50 357 00:15:54,770 --> 00:15:56,460 ter acceso a bool. 358 00:15:56,460 --> 00:15:59,810 Pero, na liña 18, parece que temos un valor booleano aquí chamado agradecido. 359 00:15:59,810 --> 00:16:01,040 Entón, eu podería ter chamado este nada. 360 00:16:01,040 --> 00:16:04,500 Pero eu liguei para el grata só para transmitir algún tipo de significado semántico. 361 00:16:04,500 --> 00:16:07,930 Polo tanto, inicialmente na liña 18, eu non son aparentemente grata porque o 362 00:16:07,930 --> 00:16:12,150 Valor booleano grata é inicializar como false na liña 18. 363 00:16:12,150 --> 00:16:16,890 E entón parece que eu fixen aquí en liñas de 21 a 23 e que acaba de 364 00:16:16,890 --> 00:16:18,610 tipo de reescrita miña lóxica. 365 00:16:18,610 --> 00:16:21,020 Polo tanto, non funcionalmente diferente. 366 00:16:21,020 --> 00:16:26,940 Pero, na liña 22, agora podo comprobar que o int o usuario teña solicitado é maior que 367 00:16:26,940 --> 00:16:31,120 0, entón eu simplemente cambiar o valor de grata a verdade. 368 00:16:31,120 --> 00:16:32,290 E por que eu faría iso? 369 00:16:32,290 --> 00:16:35,600 Porque, na liña 25, ao parecer, eu estou indo para comprobar unha condición. 370 00:16:35,600 --> 00:16:39,380 Fai iso loop while grata é falsa. 371 00:16:39,380 --> 00:16:43,610 >> Entón eu propoño isto como unha alternativa para unha versión porque é polo menos un 372 00:16:43,610 --> 00:16:45,130 pouco máis intuitivo, quizais. 373 00:16:45,130 --> 00:16:46,900 É un pouco máis fundamentada en inglés. 374 00:16:46,900 --> 00:16:51,710 Entón faga o seguinte mentres non está grata ou agradecido mentres é falso. 375 00:16:51,710 --> 00:16:55,890 E esta vez, tamén, eu aparentemente non lle importa lembrar que o usuario introduciu 376 00:16:55,890 --> 00:16:57,730 no aviso, porque non hai ningunha variable n. 377 00:16:57,730 --> 00:16:58,650 Entón, en realidade, eu - 378 00:16:58,650 --> 00:17:00,080 unha pequena mentira alí. 379 00:17:00,080 --> 00:17:02,770 Funcionalmente, o programa é un pouco diferente, xa que chegar ao fondo da 380 00:17:02,770 --> 00:17:04,819 porque eu non estou lembrando que n é. 381 00:17:04,819 --> 00:17:09,579 Pero eu quería demostrar aquí tamén que aínda que vimos e GetInt 382 00:17:09,579 --> 00:17:13,920 GetString ser utilizado no lado da man dereita de un sinal de igual modo que, ata agora, 383 00:17:13,920 --> 00:17:17,160 lembrar o valor, tecnicamente, iso non é estrictamente necesario. 384 00:17:17,160 --> 00:17:20,950 Se por calquera motivo vostede simplemente non lles importa para salvar o valor, só quere 385 00:17:20,950 --> 00:17:25,710 para comprobar o valor, observe que podemos simplemente escribir isto como GetInt aberto 386 00:17:25,710 --> 00:17:27,000 paren, paren preto. 387 00:17:27,000 --> 00:17:30,460 Esta función devolverá un valor, como temos benvida a dicir. 388 00:17:30,460 --> 00:17:32,010 Vai dar de volta un int. 389 00:17:32,010 --> 00:17:36,450 E se pensas que mentalmente de isto acontecer, cando escribir 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 así, conceptualmente, é coma se o meu código eran, en realidade iso. 392 00:17:41,330 --> 00:17:45,880 Entón, se 99 é de feito maior que 0, entón grata se fai realidade. 393 00:17:45,880 --> 00:17:50,420 Entón entende Ooh liña 25, estamos a facer porque eu son grata agora. 394 00:17:50,420 --> 00:17:54,590 E na liña 26, nós simplemente dicir, grazas pola enteiro positivo, o que quere que 395 00:17:54,590 --> 00:17:55,710 pasou a ser. 396 00:17:55,710 --> 00:17:58,900 >> Agora imos facer azucre sintático lixeiro aquí, por así dicir. 397 00:17:58,900 --> 00:18:02,990 Imos ver se conseguimos limpar esa liña 25 con esa variación terceira e última 398 00:18:02,990 --> 00:18:04,640 en positive3. 399 00:18:04,640 --> 00:18:08,250 Entón, observe a única diferenza agora é que liña de código? 400 00:18:11,930 --> 00:18:13,260 Si, entón 25. 401 00:18:13,260 --> 00:18:15,520 E nós non temos realmente visto este truco aínda. 402 00:18:15,520 --> 00:18:19,510 Pero fixo ver o punto de exclamación o luns, o que denota o que? 403 00:18:19,510 --> 00:18:20,970 Entón, non, negación ou. 404 00:18:20,970 --> 00:18:23,460 Entón, ter un 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 fai certo. 407 00:18:25,500 --> 00:18:28,910 Así, gustaríame propoñer, é ata un pouco máis intuitiva dun modo de 408 00:18:28,910 --> 00:18:32,200 escribir o código, porque eu aínda arrincar grata a falso. 409 00:18:32,200 --> 00:18:33,530 Eu segue a facer o seguinte. 410 00:18:33,530 --> 00:18:35,700 Eu define grata a verdade cando chegar a hora. 411 00:18:35,700 --> 00:18:40,690 Pero agora pode realmente só traducir este código verbalmente esquerda a dereita, 412 00:18:40,690 --> 00:18:42,550 mentres non agradecido. 413 00:18:42,550 --> 00:18:46,170 Porque bang, ou punto de exclamación, denota a noción de non, entón mentres 414 00:18:46,170 --> 00:18:47,010 Non agradecido. 415 00:18:47,010 --> 00:18:49,740 >> Entón, de novo, non introduciron novos conceptos en si. 416 00:18:49,740 --> 00:18:53,230 Nós conversas sobre booleanos atrás cando nós tocamos co scratch. 417 00:18:53,230 --> 00:18:55,690 Pero entendo agora podemos só comezar a escribir o noso código 418 00:18:55,690 --> 00:18:56,550 moitas maneiras diferentes. 419 00:18:56,550 --> 00:19:00,010 Así, especialmente no pset1, se é unha especie de loita para descubrir a forma de 420 00:19:00,010 --> 00:19:03,400 escribir un programa, a probabilidade de que está con sorte, porque non vai ser calquera 421 00:19:03,400 --> 00:19:05,780 número de solucións que pode acontecer enriba. 422 00:19:05,780 --> 00:19:09,850 Por exemplo, este é só tres, mesmo para o máis simple dos programas. 423 00:19:09,850 --> 00:19:10,180 Todo ben. 424 00:19:10,180 --> 00:19:13,860 E agora lembrar o luns, que deixou esta nota con valores de retorno. 425 00:19:13,860 --> 00:19:18,280 Así, a primeira vez, escribir un programa que non só principal, 426 00:19:18,280 --> 00:19:22,240 tamén ten a súa propia función personalizada que escribín aquí. 427 00:19:22,240 --> 00:19:26,640 Así, na liña 31 a 34, eu apliquei unha función cubo. 428 00:19:26,640 --> 00:19:27,800 Non é complexo. 429 00:19:27,800 --> 00:19:29,830 É só unha veces veces un, neste caso. 430 00:19:29,830 --> 00:19:34,920 Pero o que é importante sobre o que é que eu estou tendo entrada na forma dun e 431 00:19:34,920 --> 00:19:38,910 Estou volvendo a produción en forma de veces veces un. 432 00:19:38,910 --> 00:19:43,940 >> Entón agora eu teño a capacidade, tanto como eu adoitaba facer printf só para chamar 433 00:19:43,940 --> 00:19:47,120 esta función chamando a función cubo. 434 00:19:47,120 --> 00:19:49,470 E a función cubo leva algún entrada. 435 00:19:49,470 --> 00:19:52,030 E a función cubo retorna algunha saída. 436 00:19:52,030 --> 00:19:56,660 E así por contraste, printf só fixen algo. 437 00:19:56,660 --> 00:19:59,490 El non devolveu algo que importaba - aínda que, como un 438 00:19:59,490 --> 00:20:00,820 de lado, fai voltar un valor. 439 00:20:00,820 --> 00:20:02,650 Normalmente só ignore-lo. 440 00:20:02,650 --> 00:20:04,000 Printf só fixen algo. 441 00:20:04,000 --> 00:20:06,220 El tiña un efecto colateral de impresión á pantalla. 442 00:20:06,220 --> 00:20:09,480 En contraste aquí, temos a función de cubo, que 443 00:20:09,480 --> 00:20:11,400 En realidade, retorna algo. 444 00:20:11,400 --> 00:20:12,960 >> Polo tanto, esta é xeralmente - 445 00:20:12,960 --> 00:20:15,260 para aqueles familiarizado con iso, é unha idea moi sinxelo. 446 00:20:15,260 --> 00:20:18,460 Pero, para os menos familiarizados con esta idea de pasar insumos e obter 447 00:20:18,460 --> 00:20:21,700 saídas de volta, imos tratar só algo simple super. 448 00:20:21,700 --> 00:20:25,180 Alguén está cómodo chegando no escenario brevemente? 449 00:20:25,180 --> 00:20:27,460 Ten que estar cómodo con unha cámara en ti, tamén. 450 00:20:27,460 --> 00:20:27,640 Si 451 00:20:27,640 --> 00:20:28,610 Ok, cal é 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 Todo ben, Ken. 455 00:20:29,810 --> 00:20:31,060 Imos cara arriba. 456 00:20:31,060 --> 00:20:34,660 Entón Ken vai ser unha función do tipo aquí. 457 00:20:34,660 --> 00:20:35,760 E imos adiante e facelo. 458 00:20:35,760 --> 00:20:38,790 Imos pegar un pouco de fantasía. 459 00:20:38,790 --> 00:20:39,770 Pracer de coñece lo. 460 00:20:39,770 --> 00:20:41,010 Benvido ao centro do escenario. 461 00:20:41,010 --> 00:20:41,980 Todo ben. 462 00:20:41,980 --> 00:20:45,590 Imos bater este botón aquí. 463 00:20:45,590 --> 00:20:46,420 Todo ben. 464 00:20:46,420 --> 00:20:49,490 Entón aquí tes un cadro moderno. 465 00:20:49,490 --> 00:20:53,050 E o que eu son é a función principal, por exemplo. 466 00:20:53,050 --> 00:20:55,990 E eu non teño un iPad na man. 467 00:20:55,990 --> 00:20:59,000 Eu realmente non me lembro como - ben, en realidade, non podo dicir iso. 468 00:20:59,000 --> 00:21:02,200 Eu realmente non teño boa caligrafía. 469 00:21:02,200 --> 00:21:05,260 E así, polo tanto, quero que imprimir algo na pantalla para min. 470 00:21:05,260 --> 00:21:07,470 >> Entón, eu estou sendo o programa principal. 471 00:21:07,470 --> 00:21:15,060 E eu vou ter que dicir isto por escrito na miña cero polo e 472 00:21:15,060 --> 00:21:16,600 a continuación, pasando-lle unha entrada. 473 00:21:16,600 --> 00:21:20,000 Así como boba que este exercicio é, a noción de funcións e chamar a un 474 00:21:20,000 --> 00:21:22,260 función e voltar unha función en realidade se reduce a iso. 475 00:21:22,260 --> 00:21:23,120 Estou principal. 476 00:21:23,120 --> 00:21:26,270 Acabo de escribir printf ("algo") na pantalla. 477 00:21:26,270 --> 00:21:27,470 Estou executar este programa. 478 00:21:27,470 --> 00:21:30,900 E logo que printf é chamado, ten un argumento - ou un parámetro, 479 00:21:30,900 --> 00:21:31,660 ás veces - 480 00:21:31,660 --> 00:21:32,780 entre comiñas dobres. 481 00:21:32,780 --> 00:21:33,960 Aquí é que o argumento. 482 00:21:33,960 --> 00:21:35,740 Estou pasando para Ken. 483 00:21:35,740 --> 00:21:39,390 Agora é unha caixa negra escrito algún número de anos que, ao parecer, 484 00:21:39,390 --> 00:21:41,070 só sabe como imprimir cousas na pantalla. 485 00:21:41,070 --> 00:21:42,320 >> Entón, siga. 486 00:21:48,842 --> 00:21:49,900 Isto non é malo. 487 00:21:49,900 --> 00:21:50,890 Entón, moi bo. 488 00:21:50,890 --> 00:21:52,900 Entón, agora está feito Ken execución. 489 00:21:52,900 --> 00:21:55,810 Será que precisa me dar nada a cambio? 490 00:21:55,810 --> 00:21:57,240 Polo tanto, non que vimos ata agora. 491 00:21:57,240 --> 00:21:59,230 Unha vez máis, printf fai realmente voltar un número. 492 00:21:59,230 --> 00:22:01,640 Pero imos ignorar que, por agora, porque nunca usei. 493 00:22:01,640 --> 00:22:03,400 Entón é iso para Ken. 494 00:22:03,400 --> 00:22:06,650 E agora principal volve executar - 495 00:22:06,650 --> 00:22:09,630 Inicio asume o control do programa de novo, porque esa liña de código, 496 00:22:09,630 --> 00:22:11,010 printf, está feita a execución. 497 00:22:11,010 --> 00:22:13,890 E nós imos sobre o noso xeito de facer o que quere que as outras liñas están alí. 498 00:22:13,890 --> 00:22:14,130 >> Todo ben. 499 00:22:14,130 --> 00:22:17,080 Entón, agora imos tratar un exemplo un pouco diferente. 500 00:22:17,080 --> 00:22:22,430 E este tempo aquí, imos primeiro limpar a pantalla aquí. 501 00:22:22,430 --> 00:22:24,670 E esta vez, imos facer a función de cubagem. 502 00:22:24,670 --> 00:22:27,350 Pero esta vez, espero un valor de saída. 503 00:22:27,350 --> 00:22:28,630 Entón, imos adiante e facelo. 504 00:22:28,630 --> 00:22:35,680 Entón agora eu teño unha liña de código que di que x = cubo (x). 505 00:22:35,680 --> 00:22:36,930 Entón, en realidade imos - 506 00:22:41,450 --> 00:22:43,940 a liña de código, recall, parece con isto. 507 00:22:43,940 --> 00:22:45,960 x = cubo (x). 508 00:22:45,960 --> 00:22:48,100 Entón, como é que isto vai funcionar? 509 00:22:48,100 --> 00:22:50,820 Entón, imos adiante e dar-lle unha pantalla branca de novo. 510 00:22:50,820 --> 00:22:55,000 E eu vou escribir agora baixo o valor de x, que neste momento 511 00:22:55,000 --> 00:23:01,080 tempo pasa a ser, digamos, 2, para mantelo simple. 512 00:23:01,080 --> 00:23:04,890 Entón, eu teño escrito nun anaco de papel o valor 2, 513 00:23:04,890 --> 00:23:06,100 cal é o meu valor x. 514 00:23:06,100 --> 00:23:08,250 Eu entregalo a Ken. 515 00:23:08,250 --> 00:23:09,200 Ken: E eu só escribir a resposta? 516 00:23:09,200 --> 00:23:12,660 DAVID J. Malan: Si, imos só escribir a resposta. 517 00:23:12,660 --> 00:23:13,030 Okay. 518 00:23:13,030 --> 00:23:16,280 E agora ten que volver-me algo. 519 00:23:16,280 --> 00:23:17,560 Entón - 520 00:23:17,560 --> 00:23:18,170 perfecto. 521 00:23:18,170 --> 00:23:18,840 Segue agradable. 522 00:23:18,840 --> 00:23:21,970 >> Entón, agora me dá de volta o valor de 8, neste caso. 523 00:23:21,970 --> 00:23:23,220 E o que fago con el? 524 00:23:23,220 --> 00:23:26,130 Ben, en realidade, imos ver. 525 00:23:26,130 --> 00:23:26,640 Obter este dereito. 526 00:23:26,640 --> 00:23:27,880 O que eu vou facer con el? 527 00:23:27,880 --> 00:23:31,900 Agora eu vou levar ese valor e, de feito, almacena-lo naqueles 528 00:23:31,900 --> 00:23:33,400 mesmos bits na memoria. 529 00:23:33,400 --> 00:23:35,030 Pero aviso, eu son o tipo de loita aquí. 530 00:23:35,030 --> 00:23:38,280 Estou un pouco confuso, porque onde eu realmente escribir o valor de x? 531 00:23:38,280 --> 00:23:41,840 Porque o que eu acaba de facer é fisicamente man Ken un anaco de papel 532 00:23:41,840 --> 00:23:44,400 que tiña o valor 2, que foi x. 533 00:23:44,400 --> 00:23:46,300 E, de feito, iso é precisamente o que pasa. 534 00:23:46,300 --> 00:23:50,100 Así, verifícase que cando chamar a unha función, e pasa un argumento 535 00:23:50,100 --> 00:23:54,130 como "Ola Mundo" ou pasa un argumento como 2, xeralmente, está 536 00:23:54,130 --> 00:23:56,720 pasando unha copia do argumento. 537 00:23:56,720 --> 00:24:01,020 E como eu escribín o número 2 aquí e entregouna a Ken, o que debe 538 00:24:01,020 --> 00:24:04,760 significa que eu aínda teño unha copia do 2 valor en algún lugar. 539 00:24:04,760 --> 00:24:08,140 Porque en realidade, agora que eu comece de novo o valor 8, eu teño volver a 540 00:24:08,140 --> 00:24:12,010 RAM e realmente escribir 8, onde unha vez eu tiven o número 2. 541 00:24:12,010 --> 00:24:15,720 >> Entón lembre-se visualmente esa noción de paso en literalmente 542 00:24:15,720 --> 00:24:16,730 unha copia do valor. 543 00:24:16,730 --> 00:24:19,570 Ken fai a súa cousa, me dá de volta algo - neste caso, 544 00:24:19,570 --> 00:24:20,820 un valor como 8. 545 00:24:20,820 --> 00:24:22,660 E entón eu teño que facer algo con ese valor, se eu 546 00:24:22,660 --> 00:24:24,880 quere mantelo por preto. 547 00:24:24,880 --> 00:24:29,470 Entón, todo isto será moi familiar antes de tempo. 548 00:24:29,470 --> 00:24:33,082 Moitas grazas por esta demo aquí, Ken. 549 00:24:33,082 --> 00:24:34,820 Todo ben. 550 00:24:34,820 --> 00:24:36,720 Moi ben feito. 551 00:24:36,720 --> 00:24:40,610 Entón, imos ver como é que, en última análise relaciónase con algunhas das funcións 552 00:24:40,610 --> 00:24:42,270 chamada que estamos facendo aquí. 553 00:24:42,270 --> 00:24:47,610 Entón deixe-me ir adiante e nos traer de volta ao exemplo cubagem aquí. 554 00:24:47,610 --> 00:24:53,080 E entender que, se queremos realmente comezar a tomar isto aínda máis, imos 555 00:24:53,080 --> 00:24:57,050 ter que estar atentos ao feito de que o número x que está a ser pasado 556 00:24:57,050 --> 00:25:01,390 aquí é diferente do que realmente está a ser pasado para a función. 557 00:25:01,390 --> 00:25:03,940 Entón, de novo, este pasou por copia vai tornar-se bastante 558 00:25:03,940 --> 00:25:05,620 Germano en só un momento. 559 00:25:05,620 --> 00:25:09,320 >> Entón, imos dar un ollo a algo que non funciona moi ben certo aínda. 560 00:25:09,320 --> 00:25:11,790 Eu estou indo a ir adiante e abrir un exemplo de buggy terceiro, que 561 00:25:11,790 --> 00:25:13,560 é fallou por natureza. 562 00:25:13,560 --> 00:25:18,070 E é chamado buggy3, e implementa unha función de cambio. 563 00:25:18,070 --> 00:25:23,500 Polo tanto, temos aquí unha función principal que X e Y arbitrariamente inicializar a 564 00:25:23,500 --> 00:25:24,720 1 e 2, respectivamente. 565 00:25:24,720 --> 00:25:27,590 Nós poderiamos usar GetInt, pero só necesitamos un exercicio sinxelo. 566 00:25:27,590 --> 00:25:29,680 Entón está codificado como 1 e 2. 567 00:25:29,680 --> 00:25:35,330 En liñas 21 e 22, que, ao parecer, imprimir x e y, un por liña. 568 00:25:35,330 --> 00:25:39,620 A continuación, na liña 23, eu afirmo que estou cambiando estes valores, punto, punto, punto. 569 00:25:39,620 --> 00:25:43,030 Eu aparentemente chamar unha función na liña 24 chamado de intercambio 570 00:25:43,030 --> 00:25:44,000 que leva dous argumentos. 571 00:25:44,000 --> 00:25:46,430 É totalmente lexítimo para as funcións de tomar dous argumentos. 572 00:25:46,430 --> 00:25:48,220 Vimos printf facelo xa. 573 00:25:48,220 --> 00:25:50,370 Así, ao parecer, ten de permuta x e y. 574 00:25:50,370 --> 00:25:53,010 E, como o propio nome suxire, eu espero que vai 575 00:25:53,010 --> 00:25:54,320 intercambiar estes dous valores. 576 00:25:54,320 --> 00:25:57,560 Entón eu reclamar na liña 25, trocados. 577 00:25:57,560 --> 00:26:01,570 E I reimprimir x e y con base no presuposto de que 578 00:26:01,570 --> 00:26:02,830 eles de traxe foron trocados. 579 00:26:02,830 --> 00:26:04,370 Pero se realmente executar este programa - 580 00:26:04,370 --> 00:26:06,060 deixe-me abrir unha xanela de terminal. 581 00:26:06,060 --> 00:26:07,750 Deixe-me facer buggy3. 582 00:26:07,750 --> 00:26:09,970 Como o nome suxire, este non vai acabar ben. 583 00:26:09,970 --> 00:26:14,690 Porque cando prema Intro, 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 aínda, ao final do programa, eles aínda son, en realidade, a mesma cousa. 586 00:26:19,160 --> 00:26:22,760 >> Así, con base na demostración só agora con Ken, o que está realmente a suceder? 587 00:26:22,760 --> 00:26:24,660 Ben, imos mergullar nesta función de intercambio. 588 00:26:24,660 --> 00:26:25,800 É super curto. 589 00:26:25,800 --> 00:26:28,020 É só unhas liñas de código longo. 590 00:26:28,020 --> 00:26:32,810 Pero cal é o problema fundamental, baseado na historia sinxela contada 591 00:26:32,810 --> 00:26:34,270 aquí con Ken? 592 00:26:34,270 --> 00:26:36,115 Por que o intercambio de partido? 593 00:26:36,115 --> 00:26:37,365 [Inaudível] 594 00:26:39,840 --> 00:26:40,460 Exactamente. 595 00:26:40,460 --> 00:26:43,610 Entón, nós estamos almacenando unha copia, e non a propia variable. 596 00:26:43,610 --> 00:26:46,810 Noutras palabras, cambio aparentemente ten dous argumentos, un int. 597 00:26:46,810 --> 00:26:49,370 E é arbitrariamente chamada a e b. 598 00:26:49,370 --> 00:26:54,430 E aquí enriba, eu pase en X e Y, que son, respectivamente, 1 e 2. 599 00:26:54,430 --> 00:26:56,580 Pero eu non estou literalmente pasando x. 600 00:26:56,580 --> 00:26:58,410 Eu non estou literalmente pasando y. 601 00:26:58,410 --> 00:27:01,230 Estou pasando unha copia de X e unha copia do y. 602 00:27:01,230 --> 00:27:05,180 É como se case como se copiado e pegado en cambiar os valores que 603 00:27:05,180 --> 00:27:07,440 queres que realmente manipular. 604 00:27:07,440 --> 00:27:11,970 Entón, se ese é o caso, cando o programa, iniciar a execución 605 00:27:11,970 --> 00:27:14,140 liña 35, despois 36 - 606 00:27:14,140 --> 00:27:17,740 cando chegar á liña 37, neste punto da historia, o que é o valor dunha? 607 00:27:20,740 --> 00:27:24,850 Neste punto da historia, liña 37, que é o valor dun, neste punto? 608 00:27:24,850 --> 00:27:25,980 Por iso, debe ser só unha. 609 00:27:25,980 --> 00:27:26,170 Non? 610 00:27:26,170 --> 00:27:29,100 Como x foi pasado como o primeiro argumento. 611 00:27:29,100 --> 00:27:33,150 E esa función só arbitrariamente está chamando o seu primeiro argumento, a. 612 00:27:33,150 --> 00:27:35,130 Do mesmo xeito é y, o segundo argumento. 613 00:27:35,130 --> 00:27:37,930 E só arbitrariamente chamar a b segundo argumento. 614 00:27:37,930 --> 00:27:40,510 >> Agora esa dicotomía é, en realidade, moi sinxelo explicou. 615 00:27:40,510 --> 00:27:40,880 Pense sobre iso. 616 00:27:40,880 --> 00:27:42,980 Ningún de nós coñeceu a persoa que escribiu printf. 617 00:27:42,980 --> 00:27:49,880 Así, por suposto, el ou ela non ten idea do que as nosas variables 30 anos máis tarde van 618 00:27:49,880 --> 00:27:50,710 a ser chamado. 619 00:27:50,710 --> 00:27:55,110 Entón, ten que haber unha distinción entre o que chama de variables en 620 00:27:55,110 --> 00:27:59,960 funcións que está escribindo e que vostedes chaman de variables en funcións que está a 621 00:27:59,960 --> 00:28:01,770 chamada ou usar. 622 00:28:01,770 --> 00:28:05,120 Polo tanto, noutras palabras, eu escribín os meus variables como X e Y. 623 00:28:05,120 --> 00:28:08,060 Pero, se alguén tiña escrito a función de intercambio, el ou ela certamente 624 00:28:08,060 --> 00:28:10,480 non sei o que os meus variables van ser chamados. 625 00:28:10,480 --> 00:28:13,850 Entón entender que é por iso que ten esa dualidade de nomes. 626 00:28:13,850 --> 00:28:16,800 Tecnicamente, eu podería facelo por coincidencia. 627 00:28:16,800 --> 00:28:19,750 Pero aínda ser pasado como copias. 628 00:28:19,750 --> 00:28:22,940 Sería só pura coincidencia esteticamente se esa persoa que escribiu 629 00:28:22,940 --> 00:28:25,590 cambio usara os mesmos nomes. 630 00:28:25,590 --> 00:28:25,930 >> Todo ben. 631 00:28:25,930 --> 00:28:29,010 Polo tanto, neste punto da historia, liña 37, un é un. 632 00:28:29,010 --> 00:28:30,410 b é 2. 633 00:28:30,410 --> 00:28:32,040 E agora debo proceder para trocalos. 634 00:28:32,040 --> 00:28:34,730 Ben, primeiro de todo, deixe-me realmente facelo moito máis simple. 635 00:28:34,730 --> 00:28:36,500 Eu non sei o que estas tres liñas de código foron facendo. 636 00:28:36,500 --> 00:28:37,370 Deixe-me facelo. 637 00:28:37,370 --> 00:28:38,850 b recibe un. 638 00:28:38,850 --> 00:28:40,170 obtén un b. 639 00:28:40,170 --> 00:28:41,450 Feito. 640 00:28:41,450 --> 00:28:43,540 Por que iso é roto, loxicamente? 641 00:28:46,980 --> 00:28:48,590 É o tipo de cousa intuitiva, non? 642 00:28:48,590 --> 00:28:50,640 Así, torna-se un b. 643 00:28:50,640 --> 00:28:52,450 E faise un b. 644 00:28:52,450 --> 00:28:55,410 Pero o problema é que, así como a liña 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 xa derrotado, por así dicir, vostede cambiou b para igualar un. 648 00:29:03,460 --> 00:29:06,000 Polo tanto, unha vez liña 37 é executado, iso é óptimo. 649 00:29:06,000 --> 00:29:09,940 Vostede agora ten dúas copias do número 1 dentro desta función. 650 00:29:09,940 --> 00:29:14,720 Entón cando di na liña 38, un queda b, así, vostede é do tipo de rosca. 651 00:29:14,720 --> 00:29:17,370 Porque está só a asignación de 1 a 1. 652 00:29:17,370 --> 00:29:20,400 Vostede medio que perdín o valor que se preocupaba. 653 00:29:20,400 --> 00:29:22,910 >> Así, na versión orixinal do presente, observe o que eu fixen. 654 00:29:22,910 --> 00:29:26,620 Eu en vez tivo unha terceira liña de código que era así. 655 00:29:26,620 --> 00:29:29,910 Eu declaro dunha variable temporal - tmp é un nome moi común 656 00:29:29,910 --> 00:29:31,240 para unha variable temporal. 657 00:29:31,240 --> 00:29:34,280 É un int porque ten que coincidir co que quero facer unha copia. 658 00:29:34,280 --> 00:29:39,720 Eu gardar unha copia dun dentro tmp. Polo tanto, unha vez liña 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 tamén é 1. 664 00:29:48,470 --> 00:29:51,470 Entón agora eu executar a liña 38. 665 00:29:51,470 --> 00:29:57,180 Así, unha vez liña 38 é executado, unha toma o valor de b. 666 00:29:57,180 --> 00:29:58,510 B foi 2. 667 00:29:58,510 --> 00:30:00,500 Así, é agora un 2. 668 00:30:00,500 --> 00:30:03,110 Entón, neste punto da historia, un é de 2, B e 2, 669 00:30:03,110 --> 00:30:05,130 tmp e 1. 670 00:30:05,130 --> 00:30:09,330 Entón, agora, loxicamente, podemos só valor tmp plop de en b. 671 00:30:09,330 --> 00:30:10,690 E estamos a facer. 672 00:30:10,690 --> 00:30:12,170 >> Entón nós decidimos este problema. 673 00:30:12,170 --> 00:30:16,040 Desafortunadamente, cando executar este programa baixo esta forma, que en realidade non cambiar 674 00:30:16,040 --> 00:30:17,700 os valores. 675 00:30:17,700 --> 00:30:18,950 Pero, para ser claro, por que? 676 00:30:23,420 --> 00:30:26,310 Resolve o problema lóxico dun momento atrás. 677 00:30:26,310 --> 00:30:31,150 Pero, de novo, se eu executar este programa, X e Y permanecen inalteradas ata finais de 678 00:30:31,150 --> 00:30:33,834 execución 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ón non retornaron nada. 681 00:30:36,030 --> 00:30:36,960 Entón, iso é verdade. 682 00:30:36,960 --> 00:30:39,880 Pero acontece que hai un pouco de un problema aquí, porque, ata agora, o 683 00:30:39,880 --> 00:30:42,460 único que teño sido capaz de volver é unha cousa. 684 00:30:42,460 --> 00:30:46,540 E esta é unha restrición de C. Só podes voltar un valor realmente, 685 00:30:46,540 --> 00:30:48,970 caso en que, eu son o tipo de preso aquí 686 00:30:48,970 --> 00:30:51,805 porque eu podería voltar o novo valor de x ou que eu podería volver a 687 00:30:51,805 --> 00:30:53,160 novo valor de y. 688 00:30:53,160 --> 00:30:54,330 Pero quero os dous de volta. 689 00:30:54,330 --> 00:30:58,010 Entón, retornando non é a solución simple aquí. 690 00:30:58,010 --> 00:30:59,770 Pero o problema fundamental é por que? 691 00:30:59,770 --> 00:31:03,270 O que realmente trocados? 692 00:31:03,270 --> 00:31:04,010 a e b. 693 00:31:04,010 --> 00:31:07,670 Pero a e b son copias de x e y, o que significa que só fixo todo isto 694 00:31:07,670 --> 00:31:10,080 traballar - só pasou uns tres minutos falando sobre o intercambio 695 00:31:10,080 --> 00:31:11,680 función e todas estas tres variables. 696 00:31:11,680 --> 00:31:15,090 E iso é óptimo, perfectamente correcto en illamento. 697 00:31:15,090 --> 00:31:20,230 Pero e ámbito de b é só nestas liñas aquí. 698 00:31:20,230 --> 00:31:24,130 Entón, como un loop, se declara un enteiro i na 699 00:31:24,130 --> 00:31:27,400 loop - Do mesmo xeito, se está dentro de declarar a e b dunha función que 700 00:31:27,400 --> 00:31:30,550 escribiu, son só válido dentro desa función. 701 00:31:30,550 --> 00:31:35,020 O que significa que, unha vez que swap está feito execución e nós imos de liña de 24 a 702 00:31:35,020 --> 00:31:38,380 liña 25, x e y non foron alteradas de forma algunha. 703 00:31:38,380 --> 00:31:42,580 Vostede desperdiçar só unha morea de tempo a cambio de copias de variables. 704 00:31:42,580 --> 00:31:46,490 >> Así, verifícase que a solución para iso é, en realidade, non obvia. 705 00:31:46,490 --> 00:31:49,210 Non é ben abondo para voltar valores porque podemos 706 00:31:49,210 --> 00:31:50,320 voltar só un valor. 707 00:31:50,320 --> 00:31:53,370 E eu realmente quero cambiar x e y ao mesmo tempo. 708 00:31:53,370 --> 00:31:55,020 Entón, imos voltar a iso. 709 00:31:55,020 --> 00:31:58,770 Pero, por agora, entender que a cuestión fundamental deriva do feito de 710 00:31:58,770 --> 00:32:00,660 que a e b son copias. 711 00:32:00,660 --> 00:32:03,450 E eles están no seu propio ámbito. 712 00:32:03,450 --> 00:32:04,980 Ben, imos tentar resolver iso de algunha maneira. 713 00:32:04,980 --> 00:32:09,200 Deixe-me realmente rolar de volta aquí e abrir-se, por exemplo, unha cuarta variante 714 00:32:09,200 --> 00:32:11,170 diso, buggy4. 715 00:32:11,170 --> 00:32:13,230 E o que sobre iso? 716 00:32:13,230 --> 00:32:16,690 Este é un problema semellante, pero máis sinxelo de ollar antes de tomar unha facada 717 00:32:16,690 --> 00:32:17,530 resolvelo. 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 inicia un enteiro x 1 en liña 18. 720 00:32:24,320 --> 00:32:25,950 Eu, entón, dicir que x é 1. 721 00:32:25,950 --> 00:32:28,020 Eu, entón, afirman incrementando, punto, punto, punto. 722 00:32:28,020 --> 00:32:29,460 Eu, entón, chamar incremento. 723 00:32:29,460 --> 00:32:33,480 Pero, entón, en liñas 22 e 23, eu afirmo que foi incrementado. 724 00:32:33,480 --> 00:32:37,780 Eu reivindico x é agora o que quere que sexa, 2 presuntamente. 725 00:32:37,780 --> 00:32:39,770 >> Pero este programa é buggy. 726 00:32:39,770 --> 00:32:41,020 Cal é o problema? 727 00:32:43,450 --> 00:32:44,418 Si? 728 00:32:44,418 --> 00:32:45,668 [Inaudível] 729 00:32:49,260 --> 00:32:49,850 DAVID J. Malan: Exactamente. 730 00:32:49,850 --> 00:32:52,430 Entón x foi declarada, obviamente, na liña 18. 731 00:32:52,430 --> 00:32:54,410 Que está dentro de chaves principais. 732 00:32:54,410 --> 00:32:58,470 Polo tanto, a resposta simple é que, así, x existe aquí. 733 00:32:58,470 --> 00:33:01,510 Non existe na liña 32. 734 00:33:01,510 --> 00:33:03,710 Polo tanto, este programa realmente non vai nin compilar. 735 00:33:03,710 --> 00:33:07,910 O compilador, cando tentar compilar este código, vai berrar comigo 736 00:33:07,910 --> 00:33:13,190 sobre algúns identificador non declarado ou algo nese sentido. 737 00:33:13,190 --> 00:33:13,870 En realidade, imos tratar. 738 00:33:13,870 --> 00:33:15,235 Esta é facer buggy4. 739 00:33:17,780 --> 00:33:18,190 Non é. 740 00:33:18,190 --> 00:33:22,030 Use X identificador non declarado na liña 32. 741 00:33:22,030 --> 00:33:25,700 E, de feito, imos ser máis explícito aquí hoxe para que esta sexa útil 742 00:33:25,700 --> 00:33:27,140 horario de oficina e na casa. 743 00:33:27,140 --> 00:33:29,000 Teña en conta que é un pouco enigmática escritura. 744 00:33:29,000 --> 00:33:31,560 Pero o feito de que Clang ten chamado, dicindo 745 00:33:31,560 --> 00:33:36,970 buggy4.c: 32:5, é realmente útil. 746 00:33:36,970 --> 00:33:41,970 Isto significa que o erro está na liña 32 na posición de cinco caracteres. 747 00:33:41,970 --> 00:33:44,670 Entón, un, dous, tres, catro, cinco. 748 00:33:44,670 --> 00:33:46,640 Isto é, de feito, onde está o problema. 749 00:33:46,640 --> 00:33:49,710 E tamén para manter presente á hora de oficina e na casa, teño sorte aquí. 750 00:33:49,710 --> 00:33:50,740 Eu teño un erro. 751 00:33:50,740 --> 00:33:52,660 Vai ser relativamente doado de corrixir. 752 00:33:52,660 --> 00:33:56,220 Pero se recibir unha pantalla chea de mensaxes de erro esmagadora, unha vez máis, 753 00:33:56,220 --> 00:33:59,240 entender que o máis inferior pode ser só sintomático da 754 00:33:59,240 --> 00:34:00,320 os de nivel superior. 755 00:34:00,320 --> 00:34:03,560 Entón, sempre perseguir os seus erros dende arriba para abaixo. 756 00:34:03,560 --> 00:34:06,720 Porque non pode ser só un efecto en cadea que está suxerindo que 757 00:34:06,720 --> 00:34:09,030 ten problemas de xeito máis que realmente fai. 758 00:34:09,030 --> 00:34:14,989 >> Entón, como poderiamos resolver iso o meu obxectivo é incrementar x? 759 00:34:14,989 --> 00:34:15,370 ¿Que é iso? 760 00:34:15,370 --> 00:34:15,620 Okay. 761 00:34:15,620 --> 00:34:16,679 Así, podemos facer x global. 762 00:34:16,679 --> 00:34:18,860 Imos incorporarse a ligazón que eu avisei sobre a anterior. 763 00:34:18,860 --> 00:34:20,550 Pero que demo, só necesitamos unha solución rápida. 764 00:34:20,550 --> 00:34:23,949 Entón imos só dicir int x aquí. 765 00:34:23,949 --> 00:34:25,600 Isto fai x global. 766 00:34:25,600 --> 00:34:28,460 Entón, agora principal ten acceso a el. 767 00:34:28,460 --> 00:34:31,780 E incremento ten acceso a el. 768 00:34:31,780 --> 00:34:33,860 E entón deixe-me ir adiante e compile iso agora. 769 00:34:33,860 --> 00:34:36,330 Fai buggy4, Intro. 770 00:34:36,330 --> 00:34:37,440 Parece compilar. 771 00:34:37,440 --> 00:34:40,949 Imos correr buggy4, e parece realmente funciona. 772 00:34:40,949 --> 00:34:42,780 Agora, esta é unha desas cousas - 773 00:34:42,780 --> 00:34:45,870 faga o que eu digo, non o que fago, como eu acaba de facer aquí. 774 00:34:45,870 --> 00:34:49,239 Porque, en xeral, os nosos programas van ser moito máis interesante e 775 00:34:49,239 --> 00:34:50,440 moito máis que iso. 776 00:34:50,440 --> 00:34:53,199 E se a súa solución para os problemas da vida é só ah, poñer todo o 777 00:34:53,199 --> 00:34:57,550 variables na parte superior do seu arquivo, moi rapidamente facer programas de obter 778 00:34:57,550 --> 00:34:59,700 terriblemente difícil de xestionar. 779 00:34:59,700 --> 00:35:02,050 Está máis difícil de pensar en novos nomes de variables. 780 00:35:02,050 --> 00:35:05,240 Está máis difícil de entender o que está facendo o que variable. 781 00:35:05,240 --> 00:35:08,250 >> E así, en xeral, isto non é unha boa solución. 782 00:35:08,250 --> 00:35:09,780 Entón, imos facelo mellor. 783 00:35:09,780 --> 00:35:11,920 Nós non queremos usar unha variable global aquí. 784 00:35:11,920 --> 00:35:14,050 Eu quero incrementar x. 785 00:35:14,050 --> 00:35:16,050 Entón, eu podería, por suposto - 786 00:35:16,050 --> 00:35:18,450 ao final do día, é unha especie de unha historia boba, porque acabamos de facelo. 787 00:35:18,450 --> 00:35:22,050 Pero se eu non sabía sobre ese operador, ou eu non tiña permiso para 788 00:35:22,050 --> 00:35:27,700 muda-lo principal en si, que outra forma eu podería aplicar Ken aquí, este 789 00:35:27,700 --> 00:35:31,450 tempo de cubo, pero non para incrementar? 790 00:35:31,450 --> 00:35:32,700 ¿Como cambiar a cousa aquí? 791 00:35:32,700 --> 00:35:33,025 Si 792 00:35:33,025 --> 00:35:34,275 [Inaudível] 793 00:35:37,430 --> 00:35:38,000 DAVID J. Malan: Ok, moi bo. 794 00:35:38,000 --> 00:35:40,490 Entón, por que non eu pasar x? 795 00:35:40,490 --> 00:35:44,390 E entón, en vez de devolve-lo, por que non eu só fago retorno x + 1? 796 00:35:44,390 --> 00:35:46,370 Agora, algunhas cousas teñen que cambiar aquí. 797 00:35:46,370 --> 00:35:47,530 Eu estou no camiño correcto. 798 00:35:47,530 --> 00:35:48,910 O que máis me teño para axustar? 799 00:35:48,910 --> 00:35:49,470 Alguén. 800 00:35:49,470 --> 00:35:49,882 Si? 801 00:35:49,882 --> 00:35:51,530 [Inaudível] 802 00:35:51,530 --> 00:35:53,520 DAVID J. Malan: Eu teño cambiar o tipo de retorno de incremento 803 00:35:53,520 --> 00:35:54,590 porque non está baleiro. 804 00:35:54,590 --> 00:35:56,650 Baleiro non significa nada está devolto. 805 00:35:56,650 --> 00:35:57,600 Pero, claro, agora é. 806 00:35:57,600 --> 00:36:01,280 Entón, iso precisa cambiar int para ser coherente co que 807 00:36:01,280 --> 00:36:02,580 En realidade, estou volvendo. 808 00:36:02,580 --> 00:36:04,580 >> Agora outra cousa aínda é buggy aquí. 809 00:36:04,580 --> 00:36:04,982 Si? 810 00:36:04,982 --> 00:36:06,590 [Inaudível] 811 00:36:06,590 --> 00:36:07,630 DAVID J. Malan: Entón eu teño 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ón eu teño pasar x. 814 00:36:11,880 --> 00:36:13,300 Entón eu teño que facer iso aquí. 815 00:36:17,590 --> 00:36:19,690 Así, o prototipo, eu teño que cambiar isto aquí. 816 00:36:19,690 --> 00:36:21,290 Polo tanto, este ten que facer un int. 817 00:36:21,290 --> 00:36:22,820 Isto ten que facer - 818 00:36:22,820 --> 00:36:23,670 hmm. 819 00:36:23,670 --> 00:36:24,710 En realidade, teño un erro aquí. 820 00:36:24,710 --> 00:36:25,780 Imos solucionar isto primeiro. 821 00:36:25,780 --> 00:36:27,990 O que isto realmente debe ser? 822 00:36:27,990 --> 00:36:29,330 Entón, ten que ser unha cousa int. 823 00:36:29,330 --> 00:36:30,340 Podería ser x. 824 00:36:30,340 --> 00:36:33,120 Pero, francamente, se comezar a chamar toda a súa x variables, que vai comezar 825 00:36:33,120 --> 00:36:35,250 menos e menos claro cal é cal. 826 00:36:35,250 --> 00:36:38,210 Entón imos escoller arbitrariamente unha convención de nomenclatura diferente para o meu 827 00:36:38,210 --> 00:36:40,220 funcións auxiliares, as funcións que estou escribindo. 828 00:36:40,220 --> 00:36:41,100 Imos chamar-lle un. 829 00:36:41,100 --> 00:36:44,500 Ou poderiamos chamalo - imos chamalo even_number ser aínda máis explícito. 830 00:36:44,500 --> 00:36:47,610 Entón eu teño que devolver calquera que sexa o número engade 1. 831 00:36:47,610 --> 00:36:49,720 E agora eu teño que cambiar unha cousa aquí e un 832 00:36:49,720 --> 00:36:50,700 outra cousa aquí. 833 00:36:50,700 --> 00:36:54,150 O que eu teño que cambiar en liña 21 en primeiro lugar? 834 00:36:54,150 --> 00:36:55,390 Eu teño que asignar a x. 835 00:36:55,390 --> 00:36:57,480 Entón eu non podo só chamar x incremento. 836 00:36:57,480 --> 00:37:01,000 Cómpre lembrar a resposta, cambiando o valor de x en 837 00:37:01,000 --> 00:37:02,020 á esquerda. 838 00:37:02,020 --> 00:37:04,930 E aínda que x é agora á esquerda e á dereita, que é totalmente bo porque 839 00:37:04,930 --> 00:37:08,370 o lado dereito é executado primeiro, entón, é se xogou na esquerda 840 00:37:08,370 --> 00:37:10,240 cousa man, x, neste caso. 841 00:37:10,240 --> 00:37:11,900 E entón, finalmente, este é un reparación doado agora. 842 00:37:11,900 --> 00:37:15,080 Este debe só combinar o que hai alí embaixo. 843 00:37:15,080 --> 00:37:17,120 Número int. 844 00:37:17,120 --> 00:37:17,320 >> Todo ben. 845 00:37:17,320 --> 00:37:20,290 Entón, unha morea de cambios para unha función moi estúpido. 846 00:37:20,290 --> 00:37:24,250 Pero representante das cousas que imos cada vez máis quere facer. 847 00:37:24,250 --> 00:37:25,490 Entón faga buggy4. 848 00:37:25,490 --> 00:37:26,485 Eu estraguei todo en algún lugar. 849 00:37:26,485 --> 00:37:27,520 Oh, meu Deus. 850 00:37:27,520 --> 00:37:29,660 Cinco erros en, tipo, un programa de seis liña. 851 00:37:29,660 --> 00:37:36,500 Entón, o que hai de malo en liña 18, o personaxe de 5? 852 00:37:36,500 --> 00:37:36,970 Todo ben. 853 00:37:36,970 --> 00:37:39,330 Entón eu teño que declarar este int. 854 00:37:39,330 --> 00:37:39,630 Todo ben. 855 00:37:39,630 --> 00:37:41,790 Entón imos ver, unha morea 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 Pero, de novo, imos limpar a pantalla - 859 00:37:46,020 --> 00:37:48,660 L control aquí - e re-run Clang. 860 00:37:48,660 --> 00:37:51,340 Entón, cinco problemas que en realidade é só unha. 861 00:37:51,340 --> 00:37:53,500 Entón, agora imos realizar buggy4, Intro. 862 00:37:53,500 --> 00:37:54,150 Ufa. 863 00:37:54,150 --> 00:37:57,434 X foi incrementado correctamente. 864 00:37:57,434 --> 00:37:58,420 >> Todo ben. 865 00:37:58,420 --> 00:38:01,700 Calquera dúbida sobre como incrementar números? 866 00:38:01,700 --> 00:38:02,896 Si? 867 00:38:02,896 --> 00:38:06,864 Speaker 2: Por que pode simplemente cambiar o número x na variable 868 00:38:06,864 --> 00:38:08,860 nomear e vai saber o que quere dicir? 869 00:38:08,860 --> 00:38:09,600 DAVID J. Malan: Boa pregunta. 870 00:38:09,600 --> 00:38:13,130 Como é que podo simplemente cambiar o número x eo programa vai saber 871 00:38:13,130 --> 00:38:13,990 inmediatamente? 872 00:38:13,990 --> 00:38:16,120 Entón, de novo, pensar nel como esa abstracción. 873 00:38:16,120 --> 00:38:20,110 Entón, se eu son de inicio e Ken é incremental, francamente, eu non me importa 874 00:38:20,110 --> 00:38:21,540 o que Ken chama o seu iPad. 875 00:38:21,540 --> 00:38:25,350 Eu non ligo para o que el chama de nada que teña que ver coa súa implementación 876 00:38:25,350 --> 00:38:26,550 esta funcionalidade. 877 00:38:26,550 --> 00:38:32,130 Polo tanto, este é un detalle de implementación que, de inicio, non 878 00:38:32,130 --> 00:38:33,010 ten que se preocupar. 879 00:38:33,010 --> 00:38:37,440 E así simplemente cambiar consistente dentro da función, número aquí 880 00:38:37,440 --> 00:38:41,340 eo número aquí, é todo o que preciso tanto tempo como eu recompilar. 881 00:38:41,340 --> 00:38:43,820 É unha especie de sabor, se pensar - que moitos de nós, aqueles de vostedes con condutor 882 00:38:43,820 --> 00:38:46,590 licenzas que xa percorridos, ou se mesmo conducido nun coche - 883 00:38:46,590 --> 00:38:50,710 a maioría de nós non ten idea de como un coche funciona baixo o capo. 884 00:38:50,710 --> 00:38:54,710 E, literalmente, se abrir o capó, a maioría de nós - eu incluído - 885 00:38:54,710 --> 00:38:56,580 non están indo para realmente saber o que estamos mirando. 886 00:38:56,580 --> 00:38:58,850 Tipo de como pode se sentir con cousas como esta agora. 887 00:38:58,850 --> 00:39:01,380 Pero nós realmente non se preocupe como o coche funciona. 888 00:39:01,380 --> 00:39:05,000 Nós non temos que coidar o que todos os bastóns e pistóns e cables dentro 889 00:39:05,000 --> 00:39:07,700 o coche está realmente facendo. 890 00:39:07,700 --> 00:39:11,360 >> Polo tanto, algo así como o que vostedes chaman o pistón non importa 891 00:39:11,360 --> 00:39:11,920 aquí neste caso. 892 00:39:11,920 --> 00:39:12,490 Mesma idea. 893 00:39:12,490 --> 00:39:12,670 Si? 894 00:39:12,670 --> 00:39:13,920 [Inaudível] 895 00:39:25,250 --> 00:39:29,530 DAVID J. Malan: Se houbese máis usos do momento XA variable atrás, 896 00:39:29,530 --> 00:39:32,220 ti, programador, tería que cambiar todos os lugares. 897 00:39:32,220 --> 00:39:35,230 Ou pode literalmente facer menú Arquivo e, a continuación, atopar / substituír, 898 00:39:35,230 --> 00:39:36,270 algo así. 899 00:39:36,270 --> 00:39:40,110 Pero vai ter que facer estas modificacións mesmo. 900 00:39:40,110 --> 00:39:41,200 Ten 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: Unha orde particular, como aquí? 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 Si 905 00:39:52,940 --> 00:39:56,430 Así orde importa cando está chamando a función. 906 00:39:56,430 --> 00:40:00,350 Entón, se eu estivese chamando incremento aquí con algo coma algo 907 00:40:00,350 --> 00:40:01,400 hai un mapeamento directo. 908 00:40:01,400 --> 00:40:04,490 A primeira variable, o que se chama, faise unha copia do primeiro 909 00:40:04,490 --> 00:40:05,480 argumento aquí. 910 00:40:05,480 --> 00:40:07,280 Sentímolo, iso non debe ser un paréntese. 911 00:40:07,280 --> 00:40:09,300 O segundo argumento liñas anteriores co segundo. 912 00:40:09,300 --> 00:40:11,220 >> Así, a orde, si, importa. 913 00:40:11,220 --> 00:40:11,490 Todo ben. 914 00:40:11,490 --> 00:40:13,360 Sentímolo eu levei un longo camiño para chegar alí. 915 00:40:13,360 --> 00:40:14,610 Outras preguntas? 916 00:40:16,460 --> 00:40:16,850 Todo ben. 917 00:40:16,850 --> 00:40:20,300 Entón imos ver se non podemos pintar unha imaxe do que está realmente a suceder 918 00:40:20,300 --> 00:40:22,160 aquí debaixo do capó, por así dicir. 919 00:40:22,160 --> 00:40:26,310 Polo tanto, este é un rectángulo que pode representar a memoria do seu ordenador. 920 00:40:26,310 --> 00:40:31,240 Así, mesmo se non ten idea de como funciona a memoria ou como funciona a memoria RAM, polo menos 921 00:40:31,240 --> 00:40:33,590 asumir que ten acios de que estes días. 922 00:40:33,590 --> 00:40:34,740 Tes megabytes del. 923 00:40:34,740 --> 00:40:35,760 Tes gigabytes de lo. 924 00:40:35,760 --> 00:40:40,690 E sabemos de cero semana un byte é o que? 925 00:40:40,690 --> 00:40:41,280 8 bits. 926 00:40:41,280 --> 00:40:42,730 Certo, entón oito ceros e uns. 927 00:40:42,730 --> 00:40:46,300 Entón, se o seu ordenador ten un giga de RAM, dous Gb de RAM nestes días, ten un 928 00:40:46,300 --> 00:40:54,450 millóns ou 2 millóns de bytes de memoria, ou preto de 8 millóns ou 16000000000 929 00:40:54,450 --> 00:40:56,560 bits, dentro do seu ordenador. 930 00:40:56,560 --> 00:40:59,710 Agora, ao contrario do exemplo Willy pouco Woolly, non é partículas magnéticas 931 00:40:59,710 --> 00:41:00,560 tipicamente máis. 932 00:41:00,560 --> 00:41:04,470 Cada vez máis, en portátiles, polo menos, é drives de estado sólido, os SSDs, que 933 00:41:04,470 --> 00:41:05,560 só non teñen partes móbiles. 934 00:41:05,560 --> 00:41:06,710 É todo electrónico. 935 00:41:06,710 --> 00:41:08,070 É todo de electricidade baseada. 936 00:41:08,070 --> 00:41:12,360 Entón, creo que, no entanto, este rectángulo como só representa un ou dous 937 00:41:12,360 --> 00:41:13,930 gigabytes de memoria que ten. 938 00:41:13,930 --> 00:41:15,500 >> Polo tanto, é unha peza da memoria. 939 00:41:15,500 --> 00:41:20,460 Agora, o mundo da informática ten a sorte de anacos particionadas fóra de 940 00:41:20,460 --> 00:41:22,570 memoria para facer cousas distintas. 941 00:41:22,570 --> 00:41:25,930 Así, por exemplo, esta é a memoria RAM do ordenador - como suxerido pola 942 00:41:25,930 --> 00:41:30,400 rectángulo alí - Acontece que, por convención, na parte superior da súa memoria RAM, para 943 00:41:30,400 --> 00:41:33,170 para falar, é xeralmente o que se denomina un segmento de texto. 944 00:41:33,170 --> 00:41:35,910 Estes son os ceros e uns que compilados. 945 00:41:35,910 --> 00:41:39,040 Entón, cando nós miramos debaixo do capo que a.out é, todo 946 00:41:39,040 --> 00:41:40,360 os ceros e uns - 947 00:41:40,360 --> 00:41:44,000 cando executar un programa, estes ceros e uns son cargados a partir do seu disco duro 948 00:41:44,000 --> 00:41:46,290 unidade en algo chamado RAM. 949 00:41:46,290 --> 00:41:48,950 E na RAM, son colocadas na parte superior. 950 00:41:48,950 --> 00:41:50,330 Agora, con todo, ten outras cousas. 951 00:41:50,330 --> 00:41:53,060 Datos inicializados, datos non inicializados. 952 00:41:53,060 --> 00:41:56,440 Eses dous fragmentos de memoria refírense a variables globais, que 953 00:41:56,440 --> 00:41:57,530 non adoita usar. 954 00:41:57,530 --> 00:42:00,630 Pero, ás veces, se fai iso, eles acaban alí tamén. 955 00:42:00,630 --> 00:42:01,620 Despois, hai algunhas outras cousas. 956 00:42:01,620 --> 00:42:04,130 Variables de ambiente, que non vai pasar moito tempo. 957 00:42:04,130 --> 00:42:06,120 Pero, entón, dúas cousas importantes que volverá ao longo deste 958 00:42:06,120 --> 00:42:08,130 pila semestre, e heap. 959 00:42:08,130 --> 00:42:12,280 >> Así, a maioría da memoria do seu ordenador está reservado ao executar un programa para 960 00:42:12,280 --> 00:42:14,880 algo chamado de pila e algo chamado de pila. 961 00:42:14,880 --> 00:42:16,940 E nós non imos falar sobre a pila de hoxe, pero imos 962 00:42:16,940 --> 00:42:18,180 falar sobre a pila. 963 00:42:18,180 --> 00:42:22,910 E a pila é destinado a conxurar a vista de como comedor 964 00:42:22,910 --> 00:42:26,120 bandexas de comida Mather casa, ou onde queira que estea, onde o 965 00:42:26,120 --> 00:42:27,810 comedor equipo limpa-los todos os días. 966 00:42:27,810 --> 00:42:30,180 Eles empilhá-los do chan cara arriba. 967 00:42:30,180 --> 00:42:33,800 E do mesmo xeito na memoria, non é esa idea de poñer algo nun 968 00:42:33,800 --> 00:42:36,740 empilhar, poñer algo nunha pila, poñer algo nunha pila. 969 00:42:36,740 --> 00:42:38,000 E o que queremos dicir con iso? 970 00:42:38,000 --> 00:42:41,430 Ben, imos zoom e só a metade inferior da imaxe, do seu ordenador 971 00:42:41,430 --> 00:42:43,990 RAM, a propoñer o seguinte. 972 00:42:43,990 --> 00:42:48,300 Acontece que cando executar un programa como a.out ou Ola, sexa cal sexa 973 00:42:48,300 --> 00:42:49,920 do programa que escribiu, 974 00:42:49,920 --> 00:42:53,030 de novo, os ceros e uns son cargados a partir do disco duro - o que é 975 00:42:53,030 --> 00:42:56,190 almacenamento a longo prazo, permanece alí mesmo cando puxar a ficha - 976 00:42:56,190 --> 00:42:57,220 cargado na memoria RAM. 977 00:42:57,220 --> 00:42:59,020 RAM é máis rápida que os discos duros. 978 00:42:59,020 --> 00:43:00,700 É menor que os discos duros. 979 00:43:00,700 --> 00:43:03,490 Pero é que os programas en directo, mentres está executando-os. 980 00:43:03,490 --> 00:43:06,380 >> Entón premer dúas veces un programa en un Mac ou PC - é cargado de 981 00:43:06,380 --> 00:43:07,750 disco duro para a memoria RAM. 982 00:43:07,750 --> 00:43:11,760 Así como é cargado na memoria RAM, os ceros e uns ir na parte superior forma, o 983 00:43:11,760 --> 00:43:13,130 chamado segmento de texto. 984 00:43:13,130 --> 00:43:17,040 Pero entón, logo que o programa realmente comeza a funcionar, o principal 985 00:43:17,040 --> 00:43:18,140 función é chamada. 986 00:43:18,140 --> 00:43:21,070 E principal, como vimos, moitas veces ten variables locais. 987 00:43:21,070 --> 00:43:24,560 E ints e cordas e carácter e semellantes. 988 00:43:24,560 --> 00:43:28,300 Polo tanto, se o seu programa que escribiu ou o programa que ten 989 00:43:28,300 --> 00:43:33,680 premendo dúas veces usou algunhas variables dentro do principal, eles acaban no 990 00:43:33,680 --> 00:43:37,020 fondo da súa pila de memoria, por así dicir. 991 00:43:37,020 --> 00:43:39,160 Agora, máis concretamente, o que iso realmente significa? 992 00:43:39,160 --> 00:43:44,080 Isto só significa que se fósemos a contar as cousas - 993 00:43:44,080 --> 00:43:49,380 se estivésemos indo ao número de bytes de memoria RAM no seu ordenador, observe que 994 00:43:49,380 --> 00:43:51,650 este pode ser o número cero byte. 995 00:43:51,650 --> 00:43:56,130 Este pode ser o número de bytes de un, dous, tres, catro, cinco, seis, todos 996 00:43:56,130 --> 00:43:57,290 o camiño ata gusta - 997 00:43:57,290 --> 00:44:01,520 2000000000 sería todo o camiño ata alí enriba. 998 00:44:01,520 --> 00:44:05,960 Polo tanto, noutras palabras, cando falamos de memoria RAM ou en termos de bytes, 999 00:44:05,960 --> 00:44:09,680 Significa só que alguén decidiu que cada número de 1000 00:44:09,680 --> 00:44:11,110 os anacos de memoria. 1001 00:44:11,110 --> 00:44:16,950 >> Así, cando precisa de 32 bits para un enteiro, ou precisa de 8 bits para un char, cando 1002 00:44:16,950 --> 00:44:18,320 eles acaban na memoria? 1003 00:44:18,320 --> 00:44:20,650 Ben conceptualmente, eles só acaban no fin desta 1004 00:44:20,650 --> 00:44:21,780 cousa chamada a pila. 1005 00:44:21,780 --> 00:44:25,670 Pero o que é interesante agora é cando chama unha función principal. 1006 00:44:25,670 --> 00:44:28,830 Supoña que unha función chamada foo, só o nome dunha arbitraria. 1007 00:44:28,830 --> 00:44:32,480 O que pasa é principal na parte inferior desta pila de memoria. 1008 00:44:32,480 --> 00:44:35,630 Foo agora é poñer enriba do principal na memoria. 1009 00:44:35,630 --> 00:44:40,020 Así, todas as variables locais que foo teña acabar tipo de conceptualmente arriba 1010 00:44:40,020 --> 00:44:40,770 aqueles en principal. 1011 00:44:40,770 --> 00:44:46,920 Se foo chama outra función chamada bar, estas variables acaban aquí. 1012 00:44:46,920 --> 00:44:49,790 Se a barra de chama outra cousa, aquí, aquí, aquí. 1013 00:44:49,790 --> 00:44:53,900 Entón, o que é interesante sobre a execución dun programa que, como chamar funcións, 1014 00:44:53,900 --> 00:44:57,720 e como esas funcións chamar funcións, e como esas funcións chamar funcións, 1015 00:44:57,720 --> 00:45:00,980 construír esta pila de funcións na memoria. 1016 00:45:00,980 --> 00:45:06,740 E só unha vez a función devolve comezar a que a memoria de volta. 1017 00:45:06,740 --> 00:45:11,190 Polo tanto, unha das formas máis fáciles de quedar sen memoria nun programa de ordenador é 1018 00:45:11,190 --> 00:45:14,170 escribir funcións que nunca retornan. 1019 00:45:14,170 --> 00:45:16,650 >> Así, por exemplo, imos demostrar tanto cunha 1020 00:45:16,650 --> 00:45:18,460 programa intencionalmente buggy. 1021 00:45:18,460 --> 00:45:24,690 Deixe-me ir adiante e facer # include, int main (void). 1022 00:45:24,690 --> 00:45:31,270 E eu vou facer mentres (2> 1), o que probablemente non ha nunca 1023 00:45:31,270 --> 00:45:33,370 cambiar en nós. 1024 00:45:33,370 --> 00:45:37,720 E deixe-me ir adiante agora e facer printf. 1025 00:45:37,720 --> 00:45:39,950 En realidade, iso vai ser menos interesante visualmente. 1026 00:45:39,950 --> 00:45:40,460 Imos facelo. 1027 00:45:40,460 --> 00:45:44,840 Para int (i = 0; i> 0). 1028 00:45:44,840 --> 00:45:49,740 Imos facer este erro, i + +. 1029 00:45:49,740 --> 00:45:51,150 E non imos printf aquí. 1030 00:45:51,150 --> 00:45:52,550 Imos practicar o que eu estaba predicando. 1031 00:45:52,550 --> 00:45:54,090 Imos ter un método aquí. 1032 00:45:54,090 --> 00:46:00,860 Refrán baleiro, e imos dicir int i. 1033 00:46:00,860 --> 00:46:02,295 E entón eu vou dicir, printf - 1034 00:46:04,871 --> 00:46:06,790 oh, imos facelo máis interesante. 1035 00:46:06,790 --> 00:46:08,350 Non imos realmente imprimir nada. 1036 00:46:08,350 --> 00:46:10,530 Imos facelo. 1037 00:46:10,530 --> 00:46:11,780 Coro (i). 1038 00:46:16,630 --> 00:46:17,000 >> Todo ben. 1039 00:46:17,000 --> 00:46:20,040 Polo tanto, este é buggy por que? 1040 00:46:20,040 --> 00:46:22,850 Eu estou facendo iso como eu ir, porque o programa non fai nada 1041 00:46:22,850 --> 00:46:23,420 de interese. 1042 00:46:23,420 --> 00:46:24,670 Pero ese non é o obxectivo. 1043 00:46:24,670 --> 00:46:30,440 O obxectivo é escribir un programa que ten como principal función fai o que, ao parecer? 1044 00:46:30,440 --> 00:46:31,370 Identificar. 1045 00:46:31,370 --> 00:46:32,600 E, en realidade, nós non precisamos do loop. 1046 00:46:32,600 --> 00:46:36,070 Imos mesmo simplificar este só para non perder de vista realmente a 1047 00:46:36,070 --> 00:46:37,310 erro fundamental. 1048 00:46:37,310 --> 00:46:39,200 Chamadas principais coro a cantar algunha coro. 1049 00:46:39,200 --> 00:46:41,760 Entón eu fixen algo estúpido, e eu tiña coro chamada coro porque eu asumín 1050 00:46:41,760 --> 00:46:43,550 alguén estaba indo a implementar lo quizais. 1051 00:46:43,550 --> 00:46:45,960 E agora iso non vai compilar aínda. 1052 00:46:45,960 --> 00:46:48,340 Eu teño que facer o que? 1053 00:46:48,340 --> 00:46:49,700 Eu teño do prototipo, lembre-se. 1054 00:46:49,700 --> 00:46:55,520 Entón, eu preciso ter-se aquí coro void (int i);. 1055 00:46:55,520 --> 00:46:57,470 >> Entón, agora, se eu baixar aquí - 1056 00:46:57,470 --> 00:46:59,030 En realidade, imos usar a xanela máis grande. 1057 00:46:59,030 --> 00:47:01,670 Imos adiante e facer coro. 1058 00:47:01,670 --> 00:47:06,000 Imos adiante e facer coro. 1059 00:47:06,000 --> 00:47:08,302 Utilización de declarante Non está identificado i. 1060 00:47:08,302 --> 00:47:09,860 Ah, iso foi estúpido. 1061 00:47:09,860 --> 00:47:11,020 Nós non precisamos do argumento. 1062 00:47:11,020 --> 00:47:13,680 Imos facelo. 1063 00:47:13,680 --> 00:47:14,550 O Wish nós comezara dese xeito. 1064 00:47:14,550 --> 00:47:16,160 Sería un programa moito máis doado escribir. 1065 00:47:16,160 --> 00:47:20,100 Entón alí. 1066 00:47:20,100 --> 00:47:23,870 Agora imos para a miña xanela de terminal, re-run Clang. 1067 00:47:23,870 --> 00:47:26,900 E aquí imos nós. 1068 00:47:26,900 --> 00:47:28,020 Iso foi moi rápido. 1069 00:47:28,020 --> 00:47:30,690 O que realmente aconteceu, mentres? 1070 00:47:30,690 --> 00:47:33,430 Ben, agora eu vou engadir a liña de impresión, para que poidamos ver. 1071 00:47:33,430 --> 00:47:41,330 Entón deixe-me dicir printf, imos dicir, eu estou aquí. 1072 00:47:41,330 --> 00:47:43,470 Ok, non variables, imos deixalo así. 1073 00:47:43,470 --> 00:47:44,860 Deixe-me volver a correr facer. 1074 00:47:44,860 --> 00:47:47,940 Deixe-me re-run coro. 1075 00:47:47,940 --> 00:47:51,235 E imos. 1076 00:47:53,880 --> 00:47:55,130 Continúe indo. 1077 00:47:57,630 --> 00:47:59,750 Como un aparte, por que aínda non caeu aínda? 1078 00:47:59,750 --> 00:48:02,050 O fallo de segmentación ocorreu 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: Exactamente. 1081 00:48:04,830 --> 00:48:06,350 Entón, hai que tempo para imprimir. 1082 00:48:06,350 --> 00:48:08,370 El só ten máis traballo por parte do ordenador. 1083 00:48:08,370 --> 00:48:09,550 E aí está. 1084 00:48:09,550 --> 00:48:10,620 Fallo de segmento. 1085 00:48:10,620 --> 00:48:12,140 >> Entón, observe o quão rápido os programas executados. 1086 00:48:12,140 --> 00:48:14,110 Se vostede non está imprimindo nada, super rápido. 1087 00:48:14,110 --> 00:48:18,100 Pero aínda teño esa fallo de segmento, porque o que estaba a suceder? 1088 00:48:18,100 --> 00:48:21,310 Ben, se pensar sobre como a memoria do seu ordenador e colocar para fóra, esta 1089 00:48:21,310 --> 00:48:22,890 pasa a ser principal. 1090 00:48:22,890 --> 00:48:23,800 Pero aquí - 1091 00:48:23,800 --> 00:48:28,670 imos chamar este coro, e imos chamar este refrán. 1092 00:48:28,670 --> 00:48:33,420 E agora, se eu fai a miña estética certo, iso só vai dicir coro, 1093 00:48:33,420 --> 00:48:38,060 coro, coro, coro, coro, coro, coro, relativa nauseum. 1094 00:48:38,060 --> 00:48:39,920 E, finalmente, o que vai ocorrer? 1095 00:48:39,920 --> 00:48:46,690 O panorama é literalmente iso, o que pasa só conceptualmente? 1096 00:48:46,690 --> 00:48:48,320 As derrapagens pila a pila. 1097 00:48:48,320 --> 00:48:52,400 Ou peor, só superado todo, incluíndo o segmento de texto, que é 1098 00:48:52,400 --> 00:48:54,530 os ceros e uns que representan o seu programa. 1099 00:48:54,530 --> 00:48:56,690 En suma, este é só super, super-malo. 1100 00:48:56,690 --> 00:48:56,860 Non? 1101 00:48:56,860 --> 00:48:58,620 O seu programa entrou nunha espiral fóra de control. 1102 00:48:58,620 --> 00:49:02,840 Está a usar a memoria moito máis do que quería todo por mor dun 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, unha función moi deliberadamente feito ligando-se. 1105 00:49:08,160 --> 00:49:09,210 Agora, iso non é de todo malo. 1106 00:49:09,210 --> 00:49:12,540 Funcións que chaman-se, en realidade, ten un gran poder 1107 00:49:12,540 --> 00:49:13,700 cando usalo correctamente. 1108 00:49:13,700 --> 00:49:15,650 Eu non teño usado correctamente aquí. 1109 00:49:15,650 --> 00:49:16,940 >> Entón iso non é de todo malo. 1110 00:49:16,940 --> 00:49:20,620 Pero o feito de que eu nunca realmente deixar de chamar a min mesmo é fundamental 1111 00:49:20,620 --> 00:49:23,050 debilidade aquí deste programa. 1112 00:49:23,050 --> 00:49:25,090 Entón onde estamos indo con todo isto? 1113 00:49:25,090 --> 00:49:26,230 Ben, o que está realmente a suceder? 1114 00:49:26,230 --> 00:49:30,010 Cando eu chamo a función de incremento, como estabamos facendo nestes exemplos, 1115 00:49:30,010 --> 00:49:33,290 Eu teño un valor como unha que eu pasar dentro 1116 00:49:33,290 --> 00:49:35,820 Eu pasar unha copia do número un. 1117 00:49:35,820 --> 00:49:37,080 Entón sucede o seguinte. 1118 00:49:37,080 --> 00:49:40,390 Entón imos para o exemplo de incremento. 1119 00:49:40,390 --> 00:49:44,230 E este cara por aquí. 1120 00:49:44,230 --> 00:49:46,800 Entón aquí é o que está realmente a suceder. 1121 00:49:46,800 --> 00:49:50,770 Cando liguei incremento, e eu pasar x, pictoricamente o que é 1122 00:49:50,770 --> 00:49:53,660 pasando aquí é esta - 1123 00:49:53,660 --> 00:50:00,240 se eu tivera o valor dun almacenados aquí, 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 Si, iso é me botando fóra aquí. 1126 00:50:04,010 --> 00:50:06,750 Entón, imos chamar este incremento. 1127 00:50:06,750 --> 00:50:09,420 E nós non sabemos o que esta función próximo vai ser. 1128 00:50:09,420 --> 00:50:14,270 Entón o que está realmente a suceder aquí en algún lugar no principal, eu teño un anaco de 1129 00:50:14,270 --> 00:50:16,670 memoria que almacena o número 1. 1130 00:50:16,670 --> 00:50:19,730 Cando eu chamo incremento, está a usar outro anaco de memoria, pero agora eu 1131 00:50:19,730 --> 00:50:20,840 ten a copia de 1. 1132 00:50:20,840 --> 00:50:25,480 Cando incrementar ese valor, este torna-se 2 - horrible escrito no 1133 00:50:25,480 --> 00:50:26,420 pantalla aquí. 1134 00:50:26,420 --> 00:50:30,550 Pero entón, o que pasa logo retorna incremento? 1135 00:50:30,550 --> 00:50:34,610 Esta memoria só queda trasladado ao seu sistema operativo, o que significa que todos os 1136 00:50:34,610 --> 00:50:37,470 que fixo non é nada útil. 1137 00:50:37,470 --> 00:50:43,460 O que foi orixinalmente contido no principal aínda é realmente alí. 1138 00:50:43,460 --> 00:50:44,650 >> Entón onde estamos indo con iso? 1139 00:50:44,650 --> 00:50:49,400 Ben, acontece que na memoria que ten esta de volta para atrás secuencia de 1140 00:50:49,400 --> 00:50:50,940 máis que pode pór cousas dentro 1141 00:50:50,940 --> 00:50:53,760 E ocorre que xa vimos algo que implica a colocación de 1142 00:50:53,760 --> 00:50:55,100 as cousas de volta para atrás, cara atrás, cara atrás. 1143 00:50:55,100 --> 00:51:00,170 ¿Que é unha cadea, en base a unha semana e agora de dúas semanas? 1144 00:51:00,170 --> 00:51:01,840 Entón, é só unha colección de personaxes. 1145 00:51:01,840 --> 00:51:05,290 Entón non é que así como pode poñer números na memoria, do mesmo xeito que pode 1146 00:51:05,290 --> 00:51:06,900 poñer personaxes na memoria. 1147 00:51:06,900 --> 00:51:09,810 E cando comezamos a poñer personaxes na memoria de volta para atrás para volver ao 1148 00:51:09,810 --> 00:51:12,800 cara atrás, verifícase que o uso máis simple das cousas como un loop ou 1149 00:51:12,800 --> 00:51:14,510 un loop while, podemos iterar - 1150 00:51:14,510 --> 00:51:17,130 de esquerda a dereita sobre os carácteres dunha cadea - 1151 00:51:17,130 --> 00:51:20,720 e comezar Masaxes-os en personaxes completamente diferentes. 1152 00:51:20,720 --> 00:51:25,550 Un pode facer B. B pode facer C. Así que, finalmente, podemos tomar unha 1153 00:51:25,550 --> 00:51:28,830 Frase en inglés que realmente ten sentido e converter cada un dos 1154 00:51:28,830 --> 00:51:32,440 letras unha a unha, camiñando a través da memoria do noso ordenador para a esquerda 1155 00:51:32,440 --> 00:51:34,300 dereito á verdade cifrar. 1156 00:51:34,300 --> 00:51:36,590 >> Polo tanto, imos ter a nosa pausa de cinco minutos aquí, e cando volvemos, imos 1157 00:51:36,590 --> 00:51:39,060 iniciar este proceso de codificación de información. 1158 00:51:41,640 --> 00:51:43,180 >> Todo ben. 1159 00:51:43,180 --> 00:51:48,440 Entón, antes de mergullo en algúns cifrado e esas cousas chamadas de matrices, deixe-me 1160 00:51:48,440 --> 00:51:51,610 pausa para todas as preguntas, porque eu sinto como se eu realmente tipo de confusa algúns dos 1161 00:51:51,610 --> 00:51:52,230 estes temas. 1162 00:51:52,230 --> 00:51:53,940 Entón imos corrixir agora, se pudermos. 1163 00:51:53,940 --> 00:51:56,480 Entón, nós só conversas sobre valores de retorno. 1164 00:51:56,480 --> 00:51:58,630 Nós conversas sobre argumentos. 1165 00:51:58,630 --> 00:52:02,330 E falamos sobre esta noción, que nós imos voltar a nas próximas semanas 1166 00:52:02,330 --> 00:52:07,140 vir, ver a memoria como unha morea deles apilados 1167 00:52:07,140 --> 00:52:08,540 bandexas, por así dicir. 1168 00:52:08,540 --> 00:52:13,460 Desde abaixo, de tal forma que cada bandexa que será colocado na pila representa 1169 00:52:13,460 --> 00:52:15,160 unha función que está a ser chamado. 1170 00:52:17,970 --> 00:52:20,300 Algunha pregunta? 1171 00:52:20,300 --> 00:52:22,890 Así como sobre - déixeme tentar facer unha pregunta. 1172 00:52:22,890 --> 00:52:25,520 Eu manteño romper iso, pero agora é - vós xa todos vimos a cara do neno. 1173 00:52:25,520 --> 00:52:27,020 Entón, nós imos voltar a iso. 1174 00:52:27,020 --> 00:52:29,700 >> Entón deixe-me facer unha pregunta aquí. 1175 00:52:29,700 --> 00:52:34,810 Deixe-me simplificar iso volve ao que era antes de algúns dos nosos máis cedo Q & A. 1176 00:52:34,810 --> 00:52:41,730 E o feito de que o incremento ten paréntese aberto, número int, pechada 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: Un argumento. 1181 00:52:47,870 --> 00:52:50,732 Ok, pero o que é un argumento? 1182 00:52:50,732 --> 00:52:51,620 [Inaudível] 1183 00:52:51,620 --> 00:52:52,500 DAVID J. Malan: Sentímolo, pero o que é iso? 1184 00:52:52,500 --> 00:52:53,150 Speaker 3: Algo que pasa dentro 1185 00:52:53,150 --> 00:52:53,570 DAVID J. Malan: Okay. 1186 00:52:53,570 --> 00:52:54,780 Entón, algo que pasa dentro 1187 00:52:54,780 --> 00:52:56,560 E, máis xeralmente, é só a entrada. 1188 00:52:56,560 --> 00:52:59,860 Se está escribindo unha función e finalidade desa función na vida é facer 1189 00:52:59,860 --> 00:53:03,290 algo un pouco diferente cada vez que usalo, entón a única forma de 1190 00:53:03,290 --> 00:53:07,710 que isto ocorre realmente parece ser o de proporcionar-lo con entrada de forma que 1191 00:53:07,710 --> 00:53:10,180 pode facer algo diferente que a entrada de cada vez. 1192 00:53:10,180 --> 00:53:13,590 >> Entón, ten que especificar dúas cousas cando leva unha función entradas. 1193 00:53:13,590 --> 00:53:17,240 Debe especificar o nome que quere dar para que a entrada, só para 1194 00:53:17,240 --> 00:53:20,790 súa propia conveniencia para que poida consultala-lo na función que 1195 00:53:20,790 --> 00:53:23,610 se está escribindo, como eu fixen aquí en liña 32. 1196 00:53:23,610 --> 00:53:27,840 Pero tamén precisa especificar o tipo porque C é unha linguaxe de programación 1197 00:53:27,840 --> 00:53:28,840 que só esixe 1198 00:53:28,840 --> 00:53:31,810 que se quere unha variable, ten que dicir ao ordenador o 1199 00:53:31,810 --> 00:53:32,790 tipo de datos que é, 1200 00:53:32,790 --> 00:53:35,540 en gran parte, para que saiba cantos bits para 1201 00:53:35,540 --> 00:53:37,230 reservar para esta variable. 1202 00:53:37,230 --> 00:53:38,600 Porque pode ser seis - 1203 00:53:38,600 --> 00:53:39,990 Sentímolo, iso non vai ser seis. 1204 00:53:39,990 --> 00:53:41,050 Pode ser 16. 1205 00:53:41,050 --> 00:53:41,630 Pode ser 8. 1206 00:53:41,630 --> 00:53:44,410 Pode ser de 32, ata 64. 1207 00:53:44,410 --> 00:53:45,820 Pero o ordenador precisa saber. 1208 00:53:45,820 --> 00:53:49,110 Agora, a int no lado esquerdo representa o que, por outra banda? 1209 00:53:52,825 --> 00:53:53,780 [Inaudível] 1210 00:53:53,780 --> 00:53:54,570 DAVID J. Malan: ¿Que é iso? 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 función e, máis especificamente, o 1213 00:53:57,920 --> 00:53:59,755 tipo da súa saída. 1214 00:53:59,755 --> 00:54:00,220 Dereito. 1215 00:54:00,220 --> 00:54:04,220 Así, mentres que o único entre parénteses representa a súa entrada, se o houbera, o 1216 00:54:04,220 --> 00:54:06,640 cousa á esquerda representa a súa saída. 1217 00:54:06,640 --> 00:54:10,560 E, neste caso, o incremento aparentemente retorna un int. 1218 00:54:10,560 --> 00:54:14,590 E así int é o tipo de retorno desta función. 1219 00:54:14,590 --> 00:54:16,090 >> O que significa volver? 1220 00:54:16,090 --> 00:54:19,810 Literalmente, usa a palabra chave return. 1221 00:54:19,810 --> 00:54:24,640 E entón, se o que está volvendo para a dereita da palabra clave é unha 1222 00:54:24,640 --> 00:54:28,340 enteiro, entón iso é realmente consistente co que prometeron. 1223 00:54:28,340 --> 00:54:31,110 Non podería facer algo así - 1224 00:54:31,110 --> 00:54:32,280 Ola mundo, - 1225 00:54:32,280 --> 00:54:33,500 porque esa é unha cadea. 1226 00:54:33,500 --> 00:54:35,440 Obviamente, non é un número enteiro. 1227 00:54:35,440 --> 00:54:40,450 Así, en breve, a carga é realmente en nós, o programador, para ser específico como 1228 00:54:40,450 --> 00:54:44,730 ao que estamos volvendo e, a continuación, realmente ir sobre a devolver. 1229 00:54:44,730 --> 00:54:49,030 E despois de facer un pouco máis claro o contexto - 1230 00:54:49,030 --> 00:54:50,080 alí está el de novo. 1231 00:54:50,080 --> 00:54:51,060 O contexto - 1232 00:54:51,060 --> 00:54:52,830 gran sorpresa en só un momento. 1233 00:54:52,830 --> 00:54:57,720 O contexto aquí agora é que a memoria do ordenador e, de novo, unha 1234 00:54:57,720 --> 00:54:59,070 Gigabyte, dous gigabytes, o que sexa. 1235 00:54:59,070 --> 00:54:59,630 Quizais sexa máis. 1236 00:54:59,630 --> 00:55:00,540 Quizais sexa menos. 1237 00:55:00,540 --> 00:55:03,750 Pero o ordenador velo como tendo distintas seccións. 1238 00:55:03,750 --> 00:55:04,860 Algo vai alí en baixo. 1239 00:55:04,860 --> 00:55:06,020 Outra cousa vai alí enriba. 1240 00:55:06,020 --> 00:55:07,540 Cousas distintas vai no medio. 1241 00:55:07,540 --> 00:55:09,300 E hoxe, só comezar a contar esta historia. 1242 00:55:09,300 --> 00:55:11,130 >> Pero imos volver a ese tempo rematou. 1243 00:55:11,130 --> 00:55:15,000 Polo momento, a única lembranza que realmente importa é o segmento de texto 1244 00:55:15,000 --> 00:55:17,160 pois que só representa os ceros e uns 1245 00:55:17,160 --> 00:55:18,460 Clang que emite. 1246 00:55:18,460 --> 00:55:21,570 Entón, cando executar un comando no teclado como a.out, ou dobre 1247 00:55:21,570 --> 00:55:25,350 facer clic nun icono en Mac OS ou Windows, o programa está cargado dende o disco duro 1248 00:55:25,350 --> 00:55:26,930 dirixir na RAM. 1249 00:55:26,930 --> 00:55:30,850 E se está estatelou na parte superior da RAM do seu ordenador, por así dicir. 1250 00:55:30,850 --> 00:55:35,470 Agora, con todo, como o programa comeza a ser executado e principal é chamado no 1251 00:55:35,470 --> 00:55:39,240 programa que escribiu ou o programa Microsoft ou Apple escribiu, calquera dos seus 1252 00:55:39,240 --> 00:55:42,930 variables locais acaban alí no fondo da memoria do seu ordenador. 1253 00:55:42,930 --> 00:55:46,490 Pero se principal chámase outra función que si ten variables ou 1254 00:55:46,490 --> 00:55:48,340 argumentos, eles acaban por riba. 1255 00:55:48,340 --> 00:55:50,670 E se esa función chámase algo, eles acaban por riba dela, 1256 00:55:50,670 --> 00:55:51,840 enriba del, por riba del. 1257 00:55:51,840 --> 00:55:56,100 E só unha vez unha función de execución é feita é que a pila de taboleiros, así 1258 00:55:56,100 --> 00:55:58,320 para falar, comeza a estar máis e máis. 1259 00:55:58,320 --> 00:56:03,370 E iso é o que entón, en poucas palabras, explica por que, cando chamar cubo - 1260 00:56:03,370 --> 00:56:04,660 ou chamar incremento - 1261 00:56:04,660 --> 00:56:06,490 está pasando nunha copia do valor. 1262 00:56:06,490 --> 00:56:09,840 E o que iso significa pictoricamente é que está literalmente escrito o 1263 00:56:09,840 --> 00:56:14,540 número 1 na outra banda da memoria, cambiando 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 dun 8, no caso do cubo - 1266 00:56:17,450 --> 00:56:21,450 e, a continuación, que a memoria tirar fóra, logo que o incremento ou o cubo 1267 00:56:21,450 --> 00:56:23,410 función devolve. 1268 00:56:23,410 --> 00:56:24,267 >> Pregunta. 1269 00:56:24,267 --> 00:56:25,517 [Inaudível] 1270 00:56:28,090 --> 00:56:29,970 DAVID J. Malan: Onde - variables globais son almacenados en que é 1271 00:56:29,970 --> 00:56:32,960 actualmente chamado os datos inicializados ou datos non inicializados. 1272 00:56:32,960 --> 00:56:35,900 A diferenza é, se ten unha variable global, e lle atribúe 1273 00:56:35,900 --> 00:56:39,530 inmediatamente un valor co signo igual, el acaba na cima alí. 1274 00:56:39,530 --> 00:56:43,390 E se acaba de dicir int x coma e sen valor, acaba un pouco 1275 00:56:43,390 --> 00:56:46,670 inferior en RAM simplemente por convención. 1276 00:56:46,670 --> 00:56:49,308 Outras cuestións. 1277 00:56:49,308 --> 00:56:49,750 Todo ben. 1278 00:56:49,750 --> 00:56:53,040 >> Polo tanto, esta imaxe vai volver como temos máis poderoso co que podemos facer 1279 00:56:53,040 --> 00:56:53,830 co ordenador. 1280 00:56:53,830 --> 00:56:58,790 Pero, por agora, imos ter unha breve introdución á criptografía, un tipo específico de 1281 00:56:58,790 --> 00:57:01,910 cifrado que non resolve todos os problemas do mundo, pero non resolve 1282 00:57:01,910 --> 00:57:02,480 algúns deles. 1283 00:57:02,480 --> 00:57:06,090 Neste caso aquí, temos unha cousa chamada criptografía de clave secreta. 1284 00:57:06,090 --> 00:57:10,430 E cifrado de clave secreta, como o nome suxire, deriva a súa seguridade 1285 00:57:10,430 --> 00:57:11,330 a partir dun segredo. 1286 00:57:11,330 --> 00:57:14,720 Así, por exemplo, se está de volta na escola e está pasando unha 1287 00:57:14,720 --> 00:57:18,040 carta de amor pouco segredo para o neno ou a nena que está esmagando - se 1288 00:57:18,040 --> 00:57:20,820 quería pasar isto a través da audiencia, probablemente non ía escribir 1289 00:57:20,820 --> 00:57:24,120 tal nota en inglés ou calquera que sexa a súa lingua nativa e, en vez diso, 1290 00:57:24,120 --> 00:57:25,800 Pode criptografía-lo. 1291 00:57:25,800 --> 00:57:27,820 Ou pode só enviar-lles unha mensaxe de texto nestes días. 1292 00:57:27,820 --> 00:57:30,310 Pero realmente pode pasar-lles unha nota ao longo da clase. 1293 00:57:30,310 --> 00:57:33,820 E facelo de forma segura, de tal forma que os seus amigos e do profesor 1294 00:57:33,820 --> 00:57:36,820 non sei o que está escribindo, pode chegar a unha moi sinxelo 1295 00:57:36,820 --> 00:57:37,800 algoritmo - 1296 00:57:37,800 --> 00:57:39,290 mozo que pode ser - 1297 00:57:39,290 --> 00:57:40,780 só para embaralhar as palabras. 1298 00:57:40,780 --> 00:57:44,390 Entón, en vez de escribir un, podes escribir B. En vez de B, podes escribir 1299 00:57:44,390 --> 00:57:46,670 C. No canto de C, pode escribir D, e así por diante. 1300 00:57:46,670 --> 00:57:50,020 Ou pode vir con unha tradución máis sofisticado de cartas 1301 00:57:50,020 --> 00:57:51,300 de letras diferentes. 1302 00:57:51,300 --> 00:57:55,440 Pero o problema é o neno ou nena a quen está enviando esta nota que 1303 00:57:55,440 --> 00:57:56,850 saber algo. 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, que é o que o mapeamento entre as e BS e Cs e Ds? 1307 00:58:04,620 --> 00:58:08,780 É só a adición de un, por así dicir, para cada unha das cartas para ir 1308 00:58:08,780 --> 00:58:09,730 A cara B, de B a C? 1309 00:58:09,730 --> 00:58:11,350 O que é máis complexa do que a? 1310 00:58:11,350 --> 00:58:16,450 Así, vostede ea súa paixón é preciso ter esa información en segredo. 1311 00:58:16,450 --> 00:58:18,170 Pero hai un tipo de catch-22 aquí. 1312 00:58:18,170 --> 00:58:20,760 Se esta é a primeira vez que está enviando esta carta de amor a través do 1313 00:58:20,760 --> 00:58:25,590 clase, como é que o neno ou a nena vai saber o que o segredo é? 1314 00:58:25,590 --> 00:58:28,450 Así clave secreta de cifrado non resolve todos os problemas do mundo. 1315 00:58:28,450 --> 00:58:30,490 E non hai, en realidade, unha relación que imos volver a dirección 1316 00:58:30,490 --> 00:58:31,370 final do semestre. 1317 00:58:31,370 --> 00:58:35,970 >> Do mesmo xeito, non teñen ningún de nós probablemente xa enviou un - 1318 00:58:35,970 --> 00:58:39,453 Do mesmo xeito, non a maioría de nós coñece a alguén que traballa, por exemplo, a 1319 00:58:39,453 --> 00:58:40,300 Amazon.com. 1320 00:58:40,300 --> 00:58:43,130 E, con todo, moitos de nós probablemente xa comprou cousas na Amazon.com. 1321 00:58:43,130 --> 00:58:45,670 E nós fomos ensino a supoñer que estes e-commerce 1322 00:58:45,670 --> 00:58:47,060 transaccións son seguras. 1323 00:58:47,060 --> 00:58:47,210 Non? 1324 00:58:47,210 --> 00:58:49,310 A URL probablemente di https. 1325 00:58:49,310 --> 00:58:51,590 Hai quizais un pouco parvo icona de cadeado en algún lugar. 1326 00:58:51,590 --> 00:58:54,680 Hai algún tipo de criptografía de protexer a súa información de tarxeta de crédito 1327 00:58:54,680 --> 00:58:56,980 entre vostede e Amazon.com. 1328 00:58:56,980 --> 00:59:00,410 E, con todo, a criptografía implica coñecer algún segredo, e aínda así eu non 1329 00:59:00,410 --> 00:59:03,330 Coñece alguén en Amazon, e eu certamente non dispostos calquera tipo de 1330 00:59:03,330 --> 00:59:07,350 segredo con alguén na Amazonia, como é o meu ordenador ou o meu navegador facendo iso? 1331 00:59:07,350 --> 00:59:10,100 Ben, acontece que hai outros tipos de criptografía de un total que resolven 1332 00:59:10,100 --> 00:59:10,740 este problema. 1333 00:59:10,740 --> 00:59:13,610 Pero por hoxe, imos nos centrarse na simple, onde pode organizar en 1334 00:59:13,610 --> 00:59:18,480 avanzar para saber algún segredo, como máis dun ou algún cartografía entre as e Bs 1335 00:59:18,480 --> 00:59:20,710 >> E o proceso de cifrado implica xeralmente a este. 1336 00:59:20,710 --> 00:59:23,550 Ten algún texto simple, representado aquí na esquerda. 1337 00:59:23,550 --> 00:59:26,260 Executa-lo a través de algún tipo de algoritmo ou procedemento 1338 00:59:26,260 --> 00:59:27,670 para cifrar. 1339 00:59:27,670 --> 00:59:31,390 Quizais sexa só un se fai B, B se fai C. E entón acabar con 1340 00:59:31,390 --> 00:59:32,260 texto cifrado. 1341 00:59:32,260 --> 00:59:36,450 Mentres tanto, unha vez que a súa paixón recibe a nota secreta, el ou ela ten para despois 1342 00:59:36,450 --> 00:59:39,950 decifra-lo por xeralmente revertendo ese algoritmo para obter 1343 00:59:39,950 --> 00:59:41,640 apoiar o texto simple. 1344 00:59:41,640 --> 00:59:43,860 Agora hai encarnações físicas deste. 1345 00:59:43,860 --> 00:59:46,720 Por exemplo, isto é un anel descodificador pouco segredo. 1346 00:59:46,720 --> 00:59:50,060 E este é un anel no sentido de que non hai dous mostradores aquí. 1347 00:59:50,060 --> 00:59:53,630 Na periferia fóra desta cousa, hai letras de A a Z, 1348 00:59:53,630 --> 00:59:55,110 aínda están en orde aleatoria. 1349 00:59:55,110 --> 00:59:58,410 E no interior, hai realmente algúns números, tales que, con esta 1350 00:59:58,410 --> 01:00:02,940 anel, pode converter o tipo de fóra, pero non dentro da, a fin de aliñar 1351 01:00:02,940 --> 01:00:04,110 números con letras. 1352 01:00:04,110 --> 01:00:08,290 E no clip que está a piques de ver - algúns dos cales pode ver 24/7 1353 01:00:08,290 --> 01:00:11,120 en torno á tempada de Nadal dun filme chamado Unha Historia de Nadal. 1354 01:00:11,120 --> 01:00:16,050 Vai ver que Ralphie pouco estaba tan ansioso para descubrir o que pequeno orfo 1355 01:00:16,050 --> 01:00:19,810 Mensaxe secreta de Annie foi a el que fora comunicado, creo que, no 1356 01:00:19,810 --> 01:00:22,810 forma de mensaxes numéricos nunha caixa de serie. 1357 01:00:22,810 --> 01:00:26,760 E tiña que acumular todas as tarxetas pequenos que viñeron 1358 01:00:26,760 --> 01:00:27,480 na caixa de cereal. 1359 01:00:27,480 --> 01:00:28,320 Tiña que envialos dentro 1360 01:00:28,320 --> 01:00:31,060 Tiña que volver o anel decodificar secreto, de modo que pode finalmente descubrir 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ón, eu darlle este pequeno clip da Historia de Nadal para motivar pset 2 e 1364 01:00:39,790 --> 01:00:42,340 nosa discusión, nun momento, de matrices. 1365 01:00:42,340 --> 01:00:43,773 Polo tanto, temos aquí Ralphie. 1366 01:00:43,773 --> 01:00:44,126 >> [REPRODUCIÓN] 1367 01:00:44,126 --> 01:00:47,470 -Ser-lo coñecer a toda a xente que Ralph Parker é nomeado 1368 01:00:47,470 --> 01:00:50,690 membro da Orphan Annie Pouco Secret Circle e ten dereito a todos 1369 01:00:50,690 --> 01:00:53,500 os honores e beneficios que se producen ao mesmo. 1370 01:00:53,500 --> 01:00:56,040 -Asinado, Little Orphan Annie. 1371 01:00:56,040 --> 01:00:58,730 Referendado, Pierre André! 1372 01:00:58,730 --> 01:01:00,150 En pintura! 1373 01:01:00,150 --> 01:01:02,910 Honores e beneficios, xa á idade de nove. 1374 01:01:09,970 --> 01:01:10,730 Imos, imos adiante. 1375 01:01:10,730 --> 01:01:15,000 Eu non teño de jazz que preto de contrabandistas e piratas. 1376 01:01:15,000 --> 01:01:17,624 Escoita-noite de mañá para a aventura de conclusión do The Black 1377 01:01:17,624 --> 01:01:19,710 Barco de pirata. 1378 01:01:19,710 --> 01:01:23,380 Agora é hora de mensaxe secreta de Annie por vostedes, membros 1379 01:01:23,380 --> 01:01:25,670 do Círculo Secreto. 1380 01:01:25,670 --> 01:01:30,260 Lembre, os nenos, só membros do segredo Circle Annie pode descodificar 1381 01:01:30,260 --> 01:01:31,660 Mensaxe secreta de Annie. 1382 01:01:31,660 --> 01:01:36,230 Lembre, Annie está dependendo de ti. 1383 01:01:36,230 --> 01:01:38,720 Define as súas patas para B2. 1384 01:01:38,720 --> 01:01:41,040 Aquí é a mensaxe. 1385 01:01:41,040 --> 01:01:42,470 12, 11 - 1386 01:01:42,470 --> 01:01:46,000 -Eu estou na miña primeira reunión secreta. 1387 01:01:46,000 --> 01:01:49,440 -14, 11, 18, 16 - 1388 01:01:49,440 --> 01:01:51,700 -Pierre estaba noite gran voz. 1389 01:01:51,700 --> 01:01:54,890 Eu podería dicir que a mensaxe 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 Esta é unha mensaxe de Annie se. 1392 01:01:58,590 --> 01:01:59,840 Lembre, non diga a ninguén. 1393 01:02:04,570 --> 01:02:08,750 -90 Segundos despois, eu estou na sala só na casa onde un neno de nove anos 1394 01:02:08,750 --> 01:02:12,980 podería sentar privacidade e desencriptación. 1395 01:02:12,980 --> 01:02:17,130 Aha, B. Eu fun para o outro. 1396 01:02:17,130 --> 01:02:20,330 E. A primeira palabra é ser. 1397 01:02:20,330 --> 01:02:22,670 S. Estaba vindo máis fácil agora. 1398 01:02:22,670 --> 01:02:24,590 U. 1399 01:02:24,590 --> 01:02:26,510 -Oh, imos alí, Ralphie. 1400 01:02:26,510 --> 01:02:28,430 Eu teño que ir. 1401 01:02:28,430 --> 01:02:30,350 -Eu vou estar ben para abaixo, ma. 1402 01:02:30,350 --> 01:02:33,720 -Gee Whiz. 1403 01:02:33,720 --> 01:02:38,270 -T, O. Asegúrese se. 1404 01:02:38,270 --> 01:02:40,000 Asegúrese de que? 1405 01:02:40,000 --> 01:02:42,105 Cal foi Little Orphan Annie está intentando dicir? 1406 01:02:42,105 --> 01:02:43,095 Asegúrese de que? 1407 01:02:43,095 --> 01:02:43,590 -Ralphie! 1408 01:02:43,590 --> 01:02:44,580 Randy ten que ir. 1409 01:02:44,580 --> 01:02:45,570 Quere facer o favor de saír? 1410 01:02:45,570 --> 01:02:46,560 -Todo ben, ma. 1411 01:02:46,560 --> 01:02:48,540 Eu estarei fóra. 1412 01:02:48,540 --> 01:02:50,580 -Eu estaba quedando máis preto agora. 1413 01:02:50,580 --> 01:02:52,550 A tensión era terrible. 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 en equilibrio. 1416 01:02:56,315 --> 01:02:56,790 -Ralphie! 1417 01:02:56,790 --> 01:02:59,165 Randy ten que ir. 1418 01:02:59,165 --> 01:03:02,310 -Eu vou estar ben para fóra, polo amor de Deus. 1419 01:03:02,310 --> 01:03:04,000 -A nosa, case alí. 1420 01:03:04,000 --> 01:03:05,180 Meus dedos voaron. 1421 01:03:05,180 --> 01:03:07,150 Miña mente era unha trampa de aceiro. 1422 01:03:07,150 --> 01:03:08,790 Todos os poros vibrar. 1423 01:03:08,790 --> 01:03:10,040 Era case claro. 1424 01:03:10,040 --> 01:03:13,400 Si, si, si, si. 1425 01:03:13,400 --> 01:03:18,960 -Asegúrese de beber o seu Ovomaltine. 1426 01:03:18,960 --> 01:03:20,210 Ovomaltine? 1427 01:03:24,010 --> 01:03:25,260 Un comercial miserable? 1428 01:03:28,200 --> 01:03:29,640 Fillo de puta. 1429 01:03:29,640 --> 01:03:33,340 [REPRODUCIÓN FIN] 1430 01:03:33,340 --> 01:03:36,040 >> DAVID J. Malan: Polo tanto, temos de cifrado. 1431 01:03:36,040 --> 01:03:39,670 Así como un ordenador pode ir sobre a implementación ou 1432 01:03:39,670 --> 01:03:40,950 representando cousas como esta? 1433 01:03:40,950 --> 01:03:44,430 Ben, necesitamos unha forma de nos expresar un pouco máis flexible do que 1434 01:03:44,430 --> 01:03:46,420 nosas variables, ata agora, teñen 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 Tivemos coches alegóricos e dobres e algúns outros. 1438 01:03:50,790 --> 01:03:55,050 Pero esas son pezas individuais de memoria que realmente non nos permiten 1439 01:03:55,050 --> 01:03:58,010 expresar cousas como palabras e frases e oracións. 1440 01:03:58,010 --> 01:04:00,200 En realidade, nós temos chamado cordas tales cousas. 1441 01:04:00,200 --> 01:04:03,650 Pero prometeu que iso é realmente só unha simplificación na CS50 1442 01:04:03,650 --> 01:04:07,020 biblioteca que estamos pretendendo pelar. 1443 01:04:07,020 --> 01:04:08,970 >> E así imos comezar a facelo aquí. 1444 01:04:08,970 --> 01:04:11,130 Deixe-me ir adiante e abrir un ficheiro - 1445 01:04:11,130 --> 01:04:13,770 todos estes arquivos están dispoñibles on-line como de costume - 1446 01:04:13,770 --> 01:04:19,120 array.c chamado para resolver un problema relacionado con cordas, pero que traza un 1447 01:04:19,120 --> 01:04:23,040 foto aquí de como podemos utilizar unha cousa chamada matriz. 1448 01:04:23,040 --> 01:04:25,530 Unha matriz é un tipo de datos. 1449 01:04:25,530 --> 01:04:31,320 É un tipo de variable, de tipo, que ten varios tipos de datos máis pequenos 1450 01:04:31,320 --> 01:04:34,150 dentro dela de costas cara atrás, cara atrás. 1451 01:04:34,150 --> 01:04:37,700 Así, por exemplo, se quere escribir un pequeno programa que lle dá o seu 1452 01:04:37,700 --> 01:04:42,110 cuestionario media para un curso como 50, que ten dúas probas, podería moi facilmente 1453 01:04:42,110 --> 01:04:45,170 escribir este programa - baseado mesmo en algúns dos materiais da semana pasada - 1454 01:04:45,170 --> 01:04:47,770 usando GetInt e un par de variables. 1455 01:04:47,770 --> 01:04:51,920 Int quiz1, int quiz2, e é moi sinxelo. 1456 01:04:51,920 --> 01:04:55,930 É quizais 10, 20 liñas de código, max, para aplicar un programa que pide ao 1457 01:04:55,930 --> 01:05:01,170 usuario para dúas puntuacións do cuestionario e calcúlase a súa media, engadindo- 1458 01:05:01,170 --> 01:05:03,850 en conxunto, dividíndose en dous, e logo a impresión dos resultados. 1459 01:05:03,850 --> 01:05:06,380 Nós probablemente podería facelo moi rapidamente agora, despois de 1460 01:05:06,380 --> 01:05:07,510 un determinado número de minutos. 1461 01:05:07,510 --> 01:05:11,005 >> Pero o problema é que supoño que 50 tiña tres ou catro probas. 1462 01:05:11,005 --> 01:05:13,510 Supoña que vostede quería usar o mesmo programa para unha clase que tivo 1463 01:05:13,510 --> 01:05:14,850 probas semanalmente. 1464 01:05:14,850 --> 01:05:16,610 Debería unha clase que ten probas semanalmente. 1465 01:05:16,610 --> 01:05:20,610 Se non hai como 16 ou máis semanas, nun semestre, agora ten 16 variables - 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 Así que comezar a ver esa redundancia, está copiando e colando 1468 01:05:27,560 --> 01:05:31,390 de código, debe comezar a facer desexa que houbese un xeito mellor. 1469 01:05:31,390 --> 01:05:33,930 E, por sorte, porque de matrices, non existe. 1470 01:05:33,930 --> 01:05:34,980 Entón, imos facelo. 1471 01:05:34,980 --> 01:05:38,430 En primeiro lugar, deixe-me presentar unha cousa moi simple que non usei ata agora, 1472 01:05:38,430 --> 01:05:40,140 pero vai ver que, en ocasións, en código. 1473 01:05:40,140 --> 01:05:42,360 Isto é o que é xeralmente chamado de unha constante. 1474 01:05:42,360 --> 01:05:45,790 Entón, é unha constante no sentido de que este valor nunca cambia. 1475 01:05:45,790 --> 01:05:49,210 A convención humana ao crear unha constante é usar todo o capital 1476 01:05:49,210 --> 01:05:51,940 letras, só para que realmente destaca no seu código. 1477 01:05:51,940 --> 01:05:55,960 E a palabra clave que usa en C # é definir. 1478 01:05:55,960 --> 01:06:00,250 Entón, se di # define, entón, un espazo, entón a palabra que quere empregar para 1479 01:06:00,250 --> 01:06:03,260 nome da constante, e, a continuación, o valor da constante. 1480 01:06:03,260 --> 01:06:06,180 Entón aviso, iso é distinto de asignar algo a unha variable. 1481 01:06:06,180 --> 01:06:07,020 Non hai signo igual. 1482 01:06:07,020 --> 01:06:08,240 Non hai ningún punto e coma. 1483 01:06:08,240 --> 01:06:11,410 Isto é o que é xeralmente coñecido como un pre-procesador de directiva, pero sobre 1484 01:06:11,410 --> 01:06:12,210 que noutro momento. 1485 01:06:12,210 --> 01:06:18,540 >> De momento, iso crea un valor inmutable chamado cuestionarios cuxo real 1486 01:06:18,540 --> 01:06:19,940 valor numérico é 2. 1487 01:06:19,940 --> 01:06:24,020 Entón, en calquera lugar que ve probas, cuestionarios, probas ao longo deste arquivo, que é 1488 01:06:24,020 --> 01:06:25,410 só o número 2. 1489 01:06:25,410 --> 01:06:28,100 Agora, se eu ollar para inicio Agora, imos ver como funciona isto. 1490 01:06:28,100 --> 01:06:29,500 Na primeira, el parece un pouco enigmática. 1491 01:06:29,500 --> 01:06:31,340 Pero é todo a partir dunha semana. 1492 01:06:31,340 --> 01:06:32,710 Peza ao usuario notas. 1493 01:06:32,710 --> 01:06:33,630 Como podemos facer iso? 1494 01:06:33,630 --> 01:06:35,470 Ben, en liña 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 unha boia, pero non só un único flotador. 1497 01:06:40,960 --> 01:06:44,620 Estou declarando, en vez diso, unha matriz de valores de punto flotante. 1498 01:06:44,620 --> 01:06:49,100 Esta variable vai ser chamado de notas, como implicado aquí. 1499 01:06:49,100 --> 01:06:53,080 Pero a única peza de nova sintaxe, entón son estes corchetes, o feito 1500 01:06:53,080 --> 01:06:59,350 que eu dixen notas float e, a continuación, soporte aberto e, a continuación, un número. 1501 01:06:59,350 --> 01:07:02,460 Aviso previo, se este é unha constante, é dicir, tal como fixemos iso. 1502 01:07:02,460 --> 01:07:06,890 Isto significa ordenador hey, dáme dous coches alegóricos, e imos chamar colectivamente 1503 01:07:06,890 --> 01:07:08,220 los graos. 1504 01:07:08,220 --> 01:07:11,920 Isto está en contraste con un proceso moito máis tediosas como este. 1505 01:07:11,920 --> 01:07:15,850 Classe1 flotar, flotar grade2, e así por diante. 1506 01:07:15,850 --> 01:07:20,010 Así, unha matriz que nos permite implementar esta idea, pero moito menos messily, en 1507 01:07:20,010 --> 01:07:24,630 de xeito que podemos escribir unha liña de código, en vez de, digamos, 16 a un 16 1508 01:07:24,630 --> 01:07:25,740 semestre semana. 1509 01:07:25,740 --> 01:07:29,950 Entón, eu non quería ríxido código 2 porque se pensar sobre iso agora 1510 01:07:29,950 --> 01:07:34,160 loxicamente - supoño que o próximo ano CS50 cambios 3 quizzes vez. 1511 01:07:34,160 --> 01:07:35,510 E eu tiña o número 2 aquí. 1512 01:07:35,510 --> 01:07:36,600 Eu tiven o número 2 aquí. 1513 01:07:36,600 --> 01:07:37,580 Eu tiven o número 2 aquí. 1514 01:07:37,580 --> 01:07:38,560 Eu tiven o número 2 aquí. 1515 01:07:38,560 --> 01:07:43,180 Tórnase moi tedioso e moi fácil de romper e cambiar accidentalmente 1516 01:07:43,180 --> 01:07:47,690 un valor para 3 e perder algún outro valor de 2. 1517 01:07:47,690 --> 01:07:52,460 Entón, eu estou indo a lugar abstracto iso adiante e utilizar esa constante que, como o seu 1518 01:07:52,460 --> 01:07:54,120 nome suxire, nunca cambia. 1519 01:07:54,120 --> 01:07:57,710 E agora, non importa se temos diferentes cuestionarios este ano ou o próximo, eu 1520 01:07:57,710 --> 01:08:01,210 só temos que cambiar isto nun só lugar, aquí enriba. 1521 01:08:01,210 --> 01:08:02,720 >> Entón, iso é todo o que é constante. 1522 01:08:02,720 --> 01:08:08,680 Mentres tanto, o novo recurso conceptual que dunha matriz. 1523 01:08:08,680 --> 01:08:14,660 Así, os corchetes me dar esta flota moitos e me deixa colectivamente 1524 01:08:14,660 --> 01:08:16,630 chamalos de notas aquí. 1525 01:08:16,630 --> 01:08:17,990 Entón agora imos ver o que eu vou facer. 1526 01:08:17,990 --> 01:08:20,359 Aquí, na liña 24 é o inicio dun lazo. 1527 01:08:20,359 --> 01:08:22,260 Isto é realmente nada extravagante. 1528 01:08:22,260 --> 01:08:25,060 É só usar cuestionarios en vez de un número codificado. 1529 01:08:25,060 --> 01:08:27,790 Pero non hai nada intelectualmente diferente alí desde a semana pasada. 1530 01:08:27,790 --> 01:08:29,040 Este é só printf. 1531 01:08:29,040 --> 01:08:35,490 Entón printf ("quiz número% d de% d"), porque eu só quero imprimir me dar cuestionario 1532 01:08:35,490 --> 01:08:38,050 un número de dous e, a continuación, dous a dous. 1533 01:08:38,050 --> 01:08:39,850 Polo tanto, esta é puramente unha cousa estética. 1534 01:08:39,850 --> 01:08:42,500 Pero a parte interesante é agora na liña 27. 1535 01:08:42,500 --> 01:08:48,310 Co fin de cubrir un dos dous marcadores de posición cun punto flotante 1536 01:08:48,310 --> 01:08:51,029 valor, que novamente usar corchetes. 1537 01:08:51,029 --> 01:08:55,620 Neste caso, eu estou usando i porque este loop comezou con i igualando 1538 01:08:55,620 --> 01:08:57,560 que o valor que, ao parecer? 1539 01:08:57,560 --> 01:08:58,279 0. 1540 01:08:58,279 --> 01:09:01,350 >> Así, na primeira iteração do loop, é coma se eu 1541 01:09:01,350 --> 01:09:02,689 escribiu isto no código. 1542 01:09:02,689 --> 01:09:05,580 Pero na segunda iteração do loop, é coma se eu 1543 01:09:05,580 --> 01:09:07,750 escribiu isto no meu código. 1544 01:09:07,750 --> 01:09:10,750 Pero o feito de que eu estou usando unha variable é perfecto, porque, como o nome 1545 01:09:10,750 --> 01:09:14,300 suxire, está variando o seu valor cada iteração. 1546 01:09:14,300 --> 01:09:17,370 Entón, eu estou cubrindo esta matriz un punto de cada vez. 1547 01:09:17,370 --> 01:09:18,910 O que esta matriz parece? 1548 01:09:18,910 --> 01:09:21,430 Ben, a razón Eu tirei este rectángulo super sinxelo na pantalla aquí 1549 01:09:21,430 --> 01:09:23,350 antes era por este motivo. 1550 01:09:23,350 --> 01:09:27,279 Unha matriz é só unha peza de memoria seguido por outro anaco de memoria, 1551 01:09:27,279 --> 01:09:30,109 seguido por outro bloque de memoria, e así por diante. 1552 01:09:30,109 --> 01:09:35,260 Entón, se a miña matriz é de tamaño 2, neste caso aquí, todo o que eu estaría facendo por 1553 01:09:35,260 --> 01:09:37,590 escribindo na puntuación meus quiz, como aquí. 1554 01:09:37,590 --> 01:09:39,430 Eu teño 100 en un regalo. 1555 01:09:39,430 --> 01:09:42,020 E entón eu teño un 99 en un regalo. 1556 01:09:42,020 --> 01:09:46,040 Entón, esa memoria non pode ser usado incluso porque eu só preguntei o 1557 01:09:46,040 --> 01:09:48,689 ordenador para unha matriz de tamaño 2. 1558 01:09:48,689 --> 01:09:50,180 Estas prazas aínda están alí. 1559 01:09:50,180 --> 01:09:50,340 Non? 1560 01:09:50,340 --> 01:09:52,500 Aínda ten dous gigabytes de memoria RAM, aínda se está só 1561 01:09:52,500 --> 01:09:53,979 pedindo dous coches alegóricos. 1562 01:09:53,979 --> 01:09:58,710 Así, a idea detrás de matrices é que o ordenador só ten un anaco da memoria 1563 01:09:58,710 --> 01:10:03,230 e despois reparte pequenos anacos de costas cara atrás, cara atrás. 1564 01:10:03,230 --> 01:10:04,740 E para que é todo unha matriz é. 1565 01:10:04,740 --> 01:10:09,080 É unha peza contiguo de memoria, dentro do cal pode pór as cousas. 1566 01:10:09,080 --> 01:10:12,400 >> Agora isto acontecer para despois facer só algúns aritmética chat. 1567 01:10:12,400 --> 01:10:16,170 Se rolar por aquí, este é o lugar onde eu entón iterar sobre o array. 1568 01:10:16,170 --> 01:10:19,410 Eu veño co sumatorio de todos os valores na matriz. 1569 01:10:19,410 --> 01:10:22,390 E entón eu uso a función round aquí para realmente facer o 1570 01:10:22,390 --> 01:10:23,940 Resumindo dividido por probas. 1571 01:10:23,940 --> 01:10:27,450 Pero deixe-me acenar a miña man no que, como especie de aritmética suficiente por agora. 1572 01:10:27,450 --> 01:10:30,010 Pero todo o que está facendo para min, en última análise é o cálculo dunha media. 1573 01:10:30,010 --> 01:10:33,640 Entón, primeira proba máis segundo cuestionario, dividido por 2, e logo imprimir 1574 01:10:33,640 --> 01:10:34,700 como un int. 1575 01:10:34,700 --> 01:10:39,030 >> Pero imos transición agora un exemplo diferente, chamado string1, 1576 01:10:39,030 --> 01:10:42,370 que pinta un cadro similar, pero usando cordas. 1577 01:10:42,370 --> 01:10:45,550 Deixe-me ir adiante e simplificar este só por un momento. 1578 01:10:45,550 --> 01:10:48,340 E perdoa o retroceso para agora. 1579 01:10:48,340 --> 01:10:52,280 Obsérvese na liña 19 deste exemplo, eu recibín unha cadea de usuario. 1580 01:10:52,280 --> 01:10:55,780 Pero teña en conta o que eu estou facendo o próximo liñas de 22 en diante. 1581 01:10:55,780 --> 01:11:00,260 En realidade, estou repetindo a partir de i-se - e este é un novo truco - 1582 01:11:00,260 --> 01:11:02,730 strlen lonxitude da corda,. 1583 01:11:02,730 --> 01:11:07,010 Esta é unha función que vén co C que se pasar unha corda, el di 1584 01:11:07,010 --> 01:11:08,950 cantos personaxes están en que secuencia. 1585 01:11:08,950 --> 01:11:09,440 Isto é todo. 1586 01:11:09,440 --> 01:11:12,520 O feito de que é strlen en vez de lonxitude da corda é só porque é 1587 01:11:12,520 --> 01:11:13,040 máis sucinta. 1588 01:11:13,040 --> 01:11:17,100 30 anos, as persoas gustaban de escribir cousas da forma máis sucinta posible. 1589 01:11:17,100 --> 01:11:19,080 Entón, nós temos mantido esta convención aquí. 1590 01:11:19,080 --> 01:11:21,730 i + + significa só incrementar i en cada iteração. 1591 01:11:21,730 --> 01:11:24,310 E agora entender iso, o que é realmente interesante. 1592 01:11:24,310 --> 01:11:28,730 Así, na liña 24, digo ordenador, dáme un personaxe, oito 1593 01:11:28,730 --> 01:11:30,770 bits, e chamalo c. 1594 01:11:30,770 --> 01:11:35,370 Pero o que é iso no lado dereito dicindo? 1595 01:11:35,370 --> 01:11:38,150 En inglés, o que iso supón? 1596 01:11:38,150 --> 01:11:40,070 [Inaudível] 1597 01:11:40,070 --> 01:11:40,490 DAVID J. Malan: Exactamente. 1598 01:11:40,490 --> 01:11:42,390 Dáme o primeiro carácter da matriz. 1599 01:11:42,390 --> 01:11:45,400 Ou, máis xeralmente, dáme o carácter i-th na matriz. 1600 01:11:45,400 --> 01:11:48,230 E entender que é importante agora que, como científicos da computación, estamos, en realidade, 1601 01:11:48,230 --> 01:11:49,330 contador de 0. 1602 01:11:49,330 --> 01:11:51,290 Non ten criterio agora para comezar a facer iso. 1603 01:11:51,290 --> 01:11:54,580 Agora tes que comportarse de acordo coas expectativas do equipo e 1604 01:11:54,580 --> 01:11:58,010 contar a partir de cero, porque [0] vai ser o primeiro 1605 01:11:58,010 --> 01:11:59,670 carácter nunha cadea. 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 así por diante. 1608 01:12:03,610 --> 01:12:08,840 Polo tanto, este programa, se recompila-lo - é dicir, de novo, string1. 1609 01:12:08,840 --> 01:12:11,040 >> Entón faga string1. 1610 01:12:11,040 --> 01:12:16,730 E agora eu corro string1 na miña xanela de terminal. 1611 01:12:16,730 --> 01:12:19,180 El está esperando por entrada, entón eu vou escribir, por exemplo, David. 1612 01:12:19,180 --> 01:12:20,080 Intro. 1613 01:12:20,080 --> 01:12:23,350 E agora ela imprime DAVID todo en liñas diferentes, porque 1614 01:12:23,350 --> 01:12:24,430 entender o que estou facendo. 1615 01:12:24,430 --> 01:12:27,510 Estou imprimindo un carácter de cada vez. 1616 01:12:27,510 --> 01:12:29,100 Agora, non vou entrar en detalles hoxe sobre iso. 1617 01:12:29,100 --> 01:12:31,610 Pero eu apaguei hai pouco esta verificación aquí. 1618 01:12:31,610 --> 01:12:36,310 Acontece que o usuario está comportándose mal, contraditorio, ou só 1619 01:12:36,310 --> 01:12:41,780 confuso, realmente pode deixar de dar unha secuencia de tempo. 1620 01:12:41,780 --> 01:12:43,640 Se bater na tecla equivocada no teclado, pode dar 1621 01:12:43,640 --> 01:12:44,390 ningunha secuencia en todo. 1622 01:12:44,390 --> 01:12:47,790 Ou se é malicioso, podes probar pegar no valor dun gigabyte dun 1623 01:12:47,790 --> 01:12:49,380 Ensaio para cubrir esa secuencia. 1624 01:12:49,380 --> 01:12:52,060 E se o ordenador ficar sen memoria, verifícase que imos 1625 01:12:52,060 --> 01:12:54,310 para volver este valor especial chamado null. 1626 01:12:54,310 --> 01:12:57,550 Entón, por agora, só sei que hai ese valor especial chamado nula de que 1627 01:12:57,550 --> 01:13:01,000 nos permitirá comprobar cando estamos fóra de memoria, entre outras cousas. 1628 01:13:01,000 --> 01:13:07,330 >> Pero se eu abrir agora string2, notar unha diferenza aquí. 1629 01:13:07,330 --> 01:13:09,760 Teña en conta unha diferenza aquí con string2. 1630 01:13:09,760 --> 01:13:13,260 Con string2, este loop é un pouco diferente. 1631 01:13:13,260 --> 01:13:16,350 Deixe-me borrar os nulos, para que poidamos falar sobre iso outra hora. 1632 01:13:16,350 --> 01:13:18,460 Pero o que é diferente sobre o lazo se esta vez? 1633 01:13:21,580 --> 01:13:23,160 E podo volver para o exemplo anterior. 1634 01:13:23,160 --> 01:13:24,800 Entón esta é a versión dous. 1635 01:13:24,800 --> 01:13:27,020 Esta é unha versión. 1636 01:13:27,020 --> 01:13:31,935 Un, dous, un, dous. 1637 01:13:35,030 --> 01:13:38,240 Así, a chamada strlen é onde? 1638 01:13:38,240 --> 01:13:40,420 É a primeira parte do loop. 1639 01:13:40,420 --> 01:13:43,060 Todos os pensamentos acerca de porque eu estou facendo isto? 1640 01:13:43,060 --> 01:13:43,690 Si 1641 01:13:43,690 --> 01:13:46,010 [Inaudível] 1642 01:13:46,010 --> 01:13:47,630 DAVID J. Malan: Entón non chamar a función en cada momento. 1643 01:13:47,630 --> 01:13:48,040 Exactamente. 1644 01:13:48,040 --> 01:13:50,350 Lembre-se de lazos que son super sinxelo, xa que tipo de 1645 01:13:50,350 --> 01:13:52,180 comprender que esta é a inicialización, o 1646 01:13:52,180 --> 01:13:53,330 condición, e da actualización. 1647 01:13:53,330 --> 01:13:55,430 O problema é que a condición ocorre en cada 1648 01:13:55,430 --> 01:13:56,600 iteração do loop. 1649 01:13:56,600 --> 01:13:59,930 E así, neste exemplo aquí, o que é malo sobre o feito 1650 01:13:59,930 --> 01:14:03,500 que esta é a miña condición? 1651 01:14:03,500 --> 01:14:05,920 Está chamando strlen novo e de novo e de novo. 1652 01:14:05,920 --> 01:14:08,990 Pero unha vez que eu escriba en David, a lonxitude da corda que é cinco. 1653 01:14:08,990 --> 01:14:11,560 E iso non vai cambiar en cada iteração do loop, porque o 1654 01:14:11,560 --> 01:14:15,560 cadea é aínda D-A-V-I-D. Polo tanto, esta é unha información que vai facer un 1655 01:14:15,560 --> 01:14:19,650 idea cada vez máis importante coñecida como unha decisión de proxecto, onde - só non 1656 01:14:19,650 --> 01:14:21,640 facer o ordenador facer un traballo innecesario. 1657 01:14:21,640 --> 01:14:25,630 >> Agora, como unha previa pset 2, pset 2 na edición estándar é 1658 01:14:25,630 --> 01:14:28,850 vai desafia-lo para realmente implementar un número de cifras, algúns 1659 01:14:28,850 --> 01:14:32,650 número de algoritmos de cifrado, de modo que pode cifrar e descifrar 1660 01:14:32,650 --> 01:14:35,530 mensaxes secretas, así como o Ralphie un alí decodificar. 1661 01:14:35,530 --> 01:14:38,720 Na edición de hacker de pset 2, imos ir un pouco máis lonxe. 1662 01:14:38,720 --> 01:14:42,010 Nós imos entregar-lle un ficheiro dun sistema informático que contén un real 1663 01:14:42,010 --> 01:14:45,690 chea de nomes de usuario e contrasinais cifradas reais, eo desafío 1664 01:14:45,690 --> 01:14:49,110 para a edición de hacker vai ser para romper os contrasinais e figura 1665 01:14:49,110 --> 01:14:53,060 o que o cifrado ou o segredo foi usado para realmente 1666 01:14:53,060 --> 01:14:55,080 xerar as claves. 1667 01:14:55,080 --> 01:14:58,360 E nós imos facelo empregando un novo recurso aquí C que eu vou dar 1668 01:14:58,360 --> 01:15:02,200 só unha demo de, coñecido como liña de comando argumentos. 1669 01:15:02,200 --> 01:15:05,930 >> Entón non é que, como algúns de vostedes poden ver na sección ou nos libros de texto, 1670 01:15:05,930 --> 01:15:09,850 Inicio nin sempre ten que ser nula entre parénteses. 1671 01:15:09,850 --> 01:15:14,060 Acontece que principal tamén pode ser escrito así, con dous argumentos, 1672 01:15:14,060 --> 01:15:19,690 argc e argv, onde argc é o número de palabras que escribas logo 1673 01:15:19,690 --> 01:15:21,940 o nome do programa na liña de comandos. 1674 01:15:21,940 --> 01:15:24,550 E argv son as palabras reais. 1675 01:15:24,550 --> 01:15:29,470 E, como os corchetes alí suxerir, argv é, aparentemente, un array. 1676 01:15:29,470 --> 01:15:33,720 Vai ser unha secuencia, tras unha serie despois dunha serie na memoria. 1677 01:15:33,720 --> 01:15:36,170 Entón, o que nós imos ser capaces de facer, comezando con pset 2, é 1678 01:15:36,170 --> 01:15:37,310 algo así. 1679 01:15:37,310 --> 01:15:42,450 Se eu fai argv1, que é un exemplo que vai voltar a luns, e realizar 1680 01:15:42,450 --> 01:15:45,180 ela, entenderá que non parece facer nada aínda. 1681 01:15:45,180 --> 01:15:47,050 El só imprime o seu propio nome. 1682 01:15:47,050 --> 01:15:53,220 Pero se eu dixer adeus clase, aviso que este programa aparentemente itera 1683 01:15:53,220 --> 01:15:57,030 sobre cada unha das palabras que foron escritas no prompt. 1684 01:15:57,030 --> 01:16:02,050 E os medios polos que imos ter acceso a palabras que o usuario ten 1685 01:16:02,050 --> 01:16:06,780 ingresaran no prompt é cambiando principal, a partir deste fin 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 así vai nacer argumentos de liña de comandos. 1688 01:16:13,700 --> 01:16:17,210 E unha vez que realmente sofisticado con iso, vai ser capaz de escribir 1689 01:16:17,210 --> 01:16:21,370 programas realmente trippy, como este aquí, que vai enriba e alén 1690 01:16:21,370 --> 01:16:25,520 algunhas das características que temos feito ata agora, pero todos moi poderoso. 1691 01:16:25,520 --> 01:16:27,330 >> Entón, imos deixar isto con iso na pantalla. 1692 01:16:27,330 --> 01:16:29,160 E nós imos velo o luns.