1 00:00:00,000 --> 00:00:02,350 >> [Музички] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Даг LLOYD: Во ред. 4 00:00:06,360 --> 00:00:07,770 Вид на чудно прашање, нели? 5 00:00:07,770 --> 00:00:09,050 Магија броеви. 6 00:00:09,050 --> 00:00:12,012 Што срна тој значи кога тој е Станува збор за магија броеви? 7 00:00:12,012 --> 00:00:14,220 Па, некои од програмите дека ние сме напишани во CS50 8 00:00:14,220 --> 00:00:16,660 досега имале некои чудни броеви вид на фрлени во нив. 9 00:00:16,660 --> 00:00:19,680 Можеби поради причини ние не целосно да се разбере токму сега. 10 00:00:19,680 --> 00:00:23,950 На пример, во проблемот Марио, ние ограничени на висината на пирамидата во 23. 11 00:00:23,950 --> 00:00:26,880 Ние експлицитно го рече не може да одат повисоко од 23. 12 00:00:26,880 --> 00:00:28,702 >> Но, што значи 23 значи? 13 00:00:28,702 --> 00:00:30,410 Па, ако го прочитате спец внимателно, 14 00:00:30,410 --> 00:00:32,493 Може да се види дека Причината поради која го ограничени на 23 15 00:00:32,493 --> 00:00:36,160 е затоа што на стандардна височина на прозорецот на терминалот е 24. 16 00:00:36,160 --> 00:00:38,860 И така ако имаме пирамида биде повисока од тоа, 17 00:00:38,860 --> 00:00:41,290 тоа може да го направите ова чудно нешто каде што работи надвор од екранот. 18 00:00:41,290 --> 00:00:45,140 А ти знаеш, она што го прави што значи во контекст, нели? 19 00:00:45,140 --> 00:00:48,880 >> Е значењето на 23 веднаш очигледно да некој кој гледа во вашата програма 20 00:00:48,880 --> 00:00:51,550 а можеби и има различен Големина на прозорецот на терминалот? 21 00:00:51,550 --> 00:00:52,330 Најверојатно не. 22 00:00:52,330 --> 00:00:53,080 Ми се чини дека, во ред. 23 00:00:53,080 --> 00:00:55,005 Па, зошто тоа само помалку од 23 е? 24 00:00:55,005 --> 00:00:56,880 Во принцип, тоа е вид на една лоша навика, всушност, 25 00:00:56,880 --> 00:00:58,940 да се напише константи во вашиот код. 26 00:00:58,940 --> 00:01:02,190 При тоа, кога ќе се всушност го направи напишете константа во вашиот код, 27 00:01:02,190 --> 00:01:05,630 тоа е понекогаш се нарекува користење магија броеви, што е нешто 28 00:01:05,630 --> 00:01:08,030 ние генерално сакаат да се обиде и да се избегне. 29 00:01:08,030 --> 00:01:12,830 >> На пример, ајде да ги разгледаме во оваа едноставна функција овде. 30 00:01:12,830 --> 00:01:15,726 Очигледно нема податоци тип во C наречен картичка или палуба. 31 00:01:15,726 --> 00:01:16,600 Па само го носат со мене. 32 00:01:16,600 --> 00:01:18,910 Тоа е малку pseudocode меша овде. 33 00:01:18,910 --> 00:01:21,050 Ова е во функција се нарекува справи картичка, која очигледно 34 00:01:21,050 --> 00:01:26,570 зема палубата како параметар, и ќе испечати до мене една картичка. 35 00:01:26,570 --> 00:01:30,990 >> И јас го правам нешто тука каде што сум има циклус кој трае 0-52, 36 00:01:30,990 --> 00:01:33,394 и јас се справи една карта. 37 00:01:33,394 --> 00:01:35,310 Па, ние го добивме на магијата број во тука, нели. 38 00:01:35,310 --> 00:01:38,790 Дали ви се види она што е магичната бројка? 39 00:01:38,790 --> 00:01:42,280 Или уште поважно, да се направи да видиме што е проблемот тука? 40 00:01:42,280 --> 00:01:44,310 Особено ако ова е само една функција 41 00:01:44,310 --> 00:01:48,030 во свој датотека во папката што ги содржи 42 00:01:48,030 --> 00:01:49,970 еден куп на различни датотеки, од кои секоја 43 00:01:49,970 --> 00:01:51,670 прави уште нешто да се шпил карти. 44 00:01:51,670 --> 00:01:57,310 Можеби тоа ги меша, или се занимава со рака на пет картички, наместо на една картичка. 45 00:01:57,310 --> 00:01:59,420 >> Дали ви се види она што го Проблемот може да биде тука? 46 00:01:59,420 --> 00:02:03,220 Дали ви се види магичната бројка Сум се вбризгува во код? 47 00:02:03,220 --> 00:02:04,390 Тоа е 52, во право. 48 00:02:04,390 --> 00:02:06,440 >> Како, интуитивно што веројатно знаете, ОК. 49 00:02:06,440 --> 00:02:09,740 Како стандарден шпил картички содржи 52 карти. 50 00:02:09,740 --> 00:02:12,570 Но, во нашата програма, тоа е само вид на лебдат наоколу во таму. 51 00:02:12,570 --> 00:02:15,280 Тоа е како одеднаш има 52. 52 00:02:15,280 --> 00:02:18,290 >> Еден начин да се реши ова Проблемот е во тоа да го направите тоа. 53 00:02:18,290 --> 00:02:22,724 Ние сме многу експлицитно сега повикувајќи се на големината на палубата како 52. 54 00:02:22,724 --> 00:02:25,390 Тој им дава на тоа малку повеќе интуитивна што значи кога во за телефонска линија 55 00:02:25,390 --> 00:02:28,650 подоцна тогаш ние се каже, јас е помала од големината на палубата. 56 00:02:28,650 --> 00:02:32,666 Тоа само се чини подобро од велејќи 52. 57 00:02:32,666 --> 00:02:34,290 Сега ова всушност не го поправат проблемот. 58 00:02:34,290 --> 00:02:38,460 Тоа не им даде некои симболични значење на константна. 59 00:02:38,460 --> 00:02:40,820 Но тоа не се вид на, всушност, воведе друг проблем 60 00:02:40,820 --> 00:02:43,770 кои не може да бидат веднаш видливи. 61 00:02:43,770 --> 00:02:45,859 Дури и ако оваа променлива е прогласена globally-- 62 00:02:45,859 --> 00:02:47,650 дали се сеќавате што е тоа значи кога ќе се изјасни 63 00:02:47,650 --> 00:02:50,500 променлива глобално наспроти локално? 64 00:02:50,500 --> 00:02:53,340 Дури и ако се декларирате променлива на глобално ниво, што ако има 65 00:02:53,340 --> 00:02:55,500 друга функција во нашиот пакет на функции 66 00:02:55,500 --> 00:02:59,750 кои се занимаваат со манипулација картичка дека ненамерно ја променува големината палубата, 67 00:02:59,750 --> 00:03:02,727 или тоа се зголемува за 1 или падне за 1. 68 00:03:02,727 --> 00:03:04,060 Тоа би можело да претставува проблем, нели? 69 00:03:04,060 --> 00:03:08,261 Особено ако ние не се занимаваат со сет од карти, каде што довлечкаа целосна палубата 70 00:03:08,261 --> 00:03:08,760 потребно е. 71 00:03:08,760 --> 00:03:12,804 Ако големината палуба се намалува од 1, на пример, до 51, 72 00:03:12,804 --> 00:03:14,970 ние не сме, всушност, се довлечкаа сите карти веројатно. 73 00:03:14,970 --> 00:03:16,500 Тргнуваме еден од нив и надвор. 74 00:03:16,500 --> 00:03:21,680 И таа вредност, можеби би можеле да бидат предвиде или експлоатирани од лош актер. 75 00:03:21,680 --> 00:03:24,920 >> Ц обезбедува она што се нарекува Директива препроцесори, кој 76 00:03:24,920 --> 00:03:27,764 Исто така е наречен макро за создавање на симболички константи. 77 00:03:27,764 --> 00:03:30,180 И всушност, веќе сте го види директивата препроцесори, 78 00:03:30,180 --> 00:03:32,916 дури и ако не сте го чуле вика дека со # Include. 79 00:03:32,916 --> 00:03:37,150 Тоа е уште еден пример на макро или директива препроцесори. 80 00:03:37,150 --> 00:03:41,290 >> Начин да се создаде симболички константи, или давање на име на постојана 81 00:03:41,290 --> 00:03:43,740 така што таа има повеќе што значи, е како што следува. 82 00:03:43,740 --> 00:03:47,030 #define, име, замена. 83 00:03:47,030 --> 00:03:49,140 Навистина важно настрана тука навистина брзо. 84 00:03:49,140 --> 00:03:54,180 Не се стави запирка во На крајот на вашата #defines. 85 00:03:54,180 --> 00:03:57,310 Така, тоа е #define, име, замена. 86 00:03:57,310 --> 00:03:59,540 >> Кога се составува својата програма, што всушност се случува 87 00:03:59,540 --> 00:04:01,740 е компајлер ако оди да одат преку вашиот код 88 00:04:01,740 --> 00:04:06,770 и да ја замени секоја инстанца на зборот "име", со што и да 89 00:04:06,770 --> 00:04:08,860 стави како замена. 90 00:04:08,860 --> 00:04:13,060 Аналогно на тоа, ако # Include е вид на сличен копирање и вметнување, 91 00:04:13,060 --> 00:04:15,700 тогаш #define е вид на слични да се најде и да го замени, 92 00:04:15,700 --> 00:04:19,180 ако некогаш сте се користи за таа функција во програма за обработка на текст, на пример. 93 00:04:19,180 --> 00:04:26,345 >> Така на пример, ако јас #define пи како 3.14159265, 94 00:04:26,345 --> 00:04:28,720 ако сте подобри математички косо и вие одеднаш 95 00:04:28,720 --> 00:04:31,640 види 3.14159265 летање наоколу во вашиот код, 96 00:04:31,640 --> 00:04:33,517 што веројатно знаат дека тоа е збор за пи. 97 00:04:33,517 --> 00:04:35,850 Но, можеби и ние може да го даде малку повеќе симболично значење. 98 00:04:35,850 --> 00:04:39,850 И ние може да се каже, наместо #define пи како што залак на броеви 99 00:04:39,850 --> 00:04:42,110 дека јас не одам да се задржи читање одново и одново. 100 00:04:42,110 --> 00:04:45,560 >> И она што ќе се случи потоа во компајлирате време е кога на програмата е 101 00:04:45,560 --> 00:04:48,530 состави, првото нешто што ќе се случи е дека ќе одат преку 102 00:04:48,530 --> 00:04:51,520 и тоа ќе се замени во секое време го гледа главниот град П, капитал I, 103 00:04:51,520 --> 00:04:55,610 Тоа буквално ќе го замени со 3.14 и така натаму, така што ќе 104 00:04:55,610 --> 00:04:58,090 не мора да ја внесете секоја време, додека на својата програма уште 105 00:04:58,090 --> 00:05:00,631 има можноста да се очекуваат, бидејќи си работат 106 00:05:00,631 --> 00:05:05,090 со манипулативни, множење, поделба, што и да е од пи. 107 00:05:05,090 --> 00:05:08,230 >> Вие не се ограничени на овој замена за само бројки. 108 00:05:08,230 --> 00:05:12,279 На пример, би можел #define Се разбира, како стринг CS50. 109 00:05:12,279 --> 00:05:14,070 Во овој случај, кога Програмата е составена, 110 00:05:14,070 --> 00:05:16,236 #define ќе поминат низ код, го замени секој пат 111 00:05:16,236 --> 00:05:19,900 го гледа "се разбира" со низа CS50. 112 00:05:19,900 --> 00:05:21,720 >> Ќе забележите овде исто така, дека јас често 113 00:05:21,720 --> 00:05:26,090 #define сите мои дефинирани симболична константи, така да се каже, 114 00:05:26,090 --> 00:05:28,130 се секогаш во сите големи букви. 115 00:05:28,130 --> 00:05:28,960 Тоа е конвенцијата. 116 00:05:28,960 --> 00:05:30,170 Тоа не е потребно. 117 00:05:30,170 --> 00:05:33,900 Причината генерално луѓето ќе ги користат сите престолнини кога тие се #defining 118 00:05:33,900 --> 00:05:37,590 е само за да се направи тоа навистина јасно дека ова особено елемент на мојот код 119 00:05:37,590 --> 00:05:38,820 е дефинирана константа. 120 00:05:38,820 --> 00:05:43,730 Ако тоа е со мали букви, можно е дека тоа би можело да се мешаат со променлива. 121 00:05:43,730 --> 00:05:46,120 И тоа е веројатно не е добра работа да се направи. 122 00:05:46,120 --> 00:05:48,910 >> Па ова особено Решението е многу подобро 123 00:05:48,910 --> 00:05:50,550 од било кој од претходните. 124 00:05:50,550 --> 00:05:59,950 Ако јас прв #define големина палубата 52, а потоа сега мојата употреба на 52, или големината на палубата тука, 125 00:05:59,950 --> 00:06:01,850 е многу повеќе интуитивна и многу побезбедно. 126 00:06:01,850 --> 00:06:03,280 Вие не може да манипулира со константа. 127 00:06:03,280 --> 00:06:05,259 Вие не може да се каже, плус 52 плус. 128 00:06:05,259 --> 00:06:06,800 Тоа не се случува да го претвори во 53. 129 00:06:06,800 --> 00:06:09,390 Вие не може да се промени од 52 до нешто. 130 00:06:09,390 --> 00:06:12,470 >> Можете да го промените променлива чија вредност е 52, 131 00:06:12,470 --> 00:06:14,870 кој беше прв фикс имавме порано. 132 00:06:14,870 --> 00:06:17,000 И можете да се зголеми таа променлива до 53. 133 00:06:17,000 --> 00:06:21,100 Но вие не може да се каже и плус 52 плус имаат тоа одеднаш се претвори во 52 53. 134 00:06:21,100 --> 00:06:23,350 52 е секогаш 52. 135 00:06:23,350 --> 00:06:28,860 И така да не може ненамерно да се промени Големина на палубата тука со тоа манипулирање, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Уште една добра страна Ефектот на ова иако е 138 00:06:32,390 --> 00:06:38,310 Дали сте свесни дека тоа не сите земји во светот 139 00:06:38,310 --> 00:06:40,690 користете шпил карти со големина 52? 140 00:06:40,690 --> 00:06:45,630 На пример, тоа е навистина честа појава во Германија ќе користиме големина шпил од 32, 141 00:06:45,630 --> 00:06:48,020 каде што се отстранува некои на долниот картички вредност. 142 00:06:48,020 --> 00:06:50,960 И во овој случај, јас сакаше да се порт мојот пакет 143 00:06:50,960 --> 00:06:55,390 на функции кои се занимаваат со манипулација картичка во Германија. 144 00:06:55,390 --> 00:06:59,440 Можев во првиот пример ние покажа, треба да се оди и да се замени 145 00:06:59,440 --> 00:07:03,570 сите случаи на 52 во мојот код со 32. 146 00:07:03,570 --> 00:07:07,940 >> Но, еве, ако јас #define големина палуба како 32 во самиот врв на мојот код, 147 00:07:07,940 --> 00:07:11,730 ако треба да го промени тоа, можам да само одат и да го промени тоа една работа. 148 00:07:11,730 --> 00:07:15,010 Прекомпајлирате мојот код, и сите Одеднаш го пропагира преку. 149 00:07:15,010 --> 00:07:18,850 Всушност, можеме да го промениме палуба големина на секоја вредност што го сакаме. 150 00:07:18,850 --> 00:07:22,500 >> Можам да ве интересира во игра на големината палубата пикап? 151 00:07:22,500 --> 00:07:23,430 >> Јас сум Даг Лојд. 152 00:07:23,430 --> 00:07:25,840 И ова е CS50. 153 00:07:25,840 --> 00:07:27,772