[Музички] Даг LLOYD: Во ред. Вид на чудно прашање, нели? Магија броеви. Што срна тој значи кога тој е Станува збор за магија броеви? Па, некои од програмите дека ние сме напишани во CS50 досега имале некои чудни броеви вид на фрлени во нив. Можеби поради причини ние не целосно да се разбере токму сега. На пример, во проблемот Марио, ние ограничени на висината на пирамидата во 23. Ние експлицитно го рече не може да одат повисоко од 23. Но, што значи 23 значи? Па, ако го прочитате спец внимателно, Може да се види дека Причината поради која го ограничени на 23 е затоа што на стандардна височина на прозорецот на терминалот е 24. И така ако имаме пирамида биде повисока од тоа, тоа може да го направите ова чудно нешто каде што работи надвор од екранот. А ти знаеш, она што го прави што значи во контекст, нели? Е значењето на 23 веднаш очигледно да некој кој гледа во вашата програма а можеби и има различен Големина на прозорецот на терминалот? Најверојатно не. Ми се чини дека, во ред. Па, зошто тоа само помалку од 23 е? Во принцип, тоа е вид на една лоша навика, всушност, да се напише константи во вашиот код. При тоа, кога ќе се всушност го направи напишете константа во вашиот код, тоа е понекогаш се нарекува користење магија броеви, што е нешто ние генерално сакаат да се обиде и да се избегне. На пример, ајде да ги разгледаме во оваа едноставна функција овде. Очигледно нема податоци тип во C наречен картичка или палуба. Па само го носат со мене. Тоа е малку pseudocode меша овде. Ова е во функција се нарекува справи картичка, која очигледно зема палубата како параметар, и ќе испечати до мене една картичка. И јас го правам нешто тука каде што сум има циклус кој трае 0-52, и јас се справи една карта. Па, ние го добивме на магијата број во тука, нели. Дали ви се види она што е магичната бројка? Или уште поважно, да се направи да видиме што е проблемот тука? Особено ако ова е само една функција во свој датотека во папката што ги содржи еден куп на различни датотеки, од кои секоја прави уште нешто да се шпил карти. Можеби тоа ги меша, или се занимава со рака на пет картички, наместо на една картичка. Дали ви се види она што го Проблемот може да биде тука? Дали ви се види магичната бројка Сум се вбризгува во код? Тоа е 52, во право. Како, интуитивно што веројатно знаете, ОК. Како стандарден шпил картички содржи 52 карти. Но, во нашата програма, тоа е само вид на лебдат наоколу во таму. Тоа е како одеднаш има 52. Еден начин да се реши ова Проблемот е во тоа да го направите тоа. Ние сме многу експлицитно сега повикувајќи се на големината на палубата како 52. Тој им дава на тоа малку повеќе интуитивна што значи кога во за телефонска линија подоцна тогаш ние се каже, јас е помала од големината на палубата. Тоа само се чини подобро од велејќи 52. Сега ова всушност не го поправат проблемот. Тоа не им даде некои симболични значење на константна. Но тоа не се вид на, всушност, воведе друг проблем кои не може да бидат веднаш видливи. Дури и ако оваа променлива е прогласена globally-- дали се сеќавате што е тоа значи кога ќе се изјасни променлива глобално наспроти локално? Дури и ако се декларирате променлива на глобално ниво, што ако има друга функција во нашиот пакет на функции кои се занимаваат со манипулација картичка дека ненамерно ја променува големината палубата, или тоа се зголемува за 1 или падне за 1. Тоа би можело да претставува проблем, нели? Особено ако ние не се занимаваат со сет од карти, каде што довлечкаа целосна палубата потребно е. Ако големината палуба се намалува од 1, на пример, до 51, ние не сме, всушност, се довлечкаа сите карти веројатно. Тргнуваме еден од нив и надвор. И таа вредност, можеби би можеле да бидат предвиде или експлоатирани од лош актер. Ц обезбедува она што се нарекува Директива препроцесори, кој Исто така е наречен макро за создавање на симболички константи. И всушност, веќе сте го види директивата препроцесори, дури и ако не сте го чуле вика дека со # Include. Тоа е уште еден пример на макро или директива препроцесори. Начин да се создаде симболички константи, или давање на име на постојана така што таа има повеќе што значи, е како што следува. #define, име, замена. Навистина важно настрана тука навистина брзо. Не се стави запирка во На крајот на вашата #defines. Така, тоа е #define, име, замена. Кога се составува својата програма, што всушност се случува е компајлер ако оди да одат преку вашиот код и да ја замени секоја инстанца на зборот "име", со што и да стави како замена. Аналогно на тоа, ако # Include е вид на сличен копирање и вметнување, тогаш #define е вид на слични да се најде и да го замени, ако некогаш сте се користи за таа функција во програма за обработка на текст, на пример. Така на пример, ако јас #define пи како 3.14159265, ако сте подобри математички косо и вие одеднаш види 3.14159265 летање наоколу во вашиот код, што веројатно знаат дека тоа е збор за пи. Но, можеби и ние може да го даде малку повеќе симболично значење. И ние може да се каже, наместо #define пи како што залак на броеви дека јас не одам да се задржи читање одново и одново. И она што ќе се случи потоа во компајлирате време е кога на програмата е состави, првото нешто што ќе се случи е дека ќе одат преку и тоа ќе се замени во секое време го гледа главниот град П, капитал I, Тоа буквално ќе го замени со 3.14 и така натаму, така што ќе не мора да ја внесете секоја време, додека на својата програма уште има можноста да се очекуваат, бидејќи си работат со манипулативни, множење, поделба, што и да е од пи. Вие не се ограничени на овој замена за само бројки. На пример, би можел #define Се разбира, како стринг CS50. Во овој случај, кога Програмата е составена, #define ќе поминат низ код, го замени секој пат го гледа "се разбира" со низа CS50. Ќе забележите овде исто така, дека јас често #define сите мои дефинирани симболична константи, така да се каже, се секогаш во сите големи букви. Тоа е конвенцијата. Тоа не е потребно. Причината генерално луѓето ќе ги користат сите престолнини кога тие се #defining е само за да се направи тоа навистина јасно дека ова особено елемент на мојот код е дефинирана константа. Ако тоа е со мали букви, можно е дека тоа би можело да се мешаат со променлива. И тоа е веројатно не е добра работа да се направи. Па ова особено Решението е многу подобро од било кој од претходните. Ако јас прв #define големина палубата 52, а потоа сега мојата употреба на 52, или големината на палубата тука, е многу повеќе интуитивна и многу побезбедно. Вие не може да манипулира со константа. Вие не може да се каже, плус 52 плус. Тоа не се случува да го претвори во 53. Вие не може да се промени од 52 до нешто. Можете да го промените променлива чија вредност е 52, кој беше прв фикс имавме порано. И можете да се зголеми таа променлива до 53. Но вие не може да се каже и плус 52 плус имаат тоа одеднаш се претвори во 52 53. 52 е секогаш 52. И така да не може ненамерно да се промени Големина на палубата тука со тоа манипулирање, Уште една добра страна Ефектот на ова иако е Дали сте свесни дека тоа не сите земји во светот користете шпил карти со големина 52? На пример, тоа е навистина честа појава во Германија ќе користиме големина шпил од 32, каде што се отстранува некои на долниот картички вредност. И во овој случај, јас сакаше да се порт мојот пакет на функции кои се занимаваат со манипулација картичка во Германија. Можев во првиот пример ние покажа, треба да се оди и да се замени сите случаи на 52 во мојот код со 32. Но, еве, ако јас #define големина палуба како 32 во самиот врв на мојот код, ако треба да го промени тоа, можам да само одат и да го промени тоа една работа. Прекомпајлирате мојот код, и сите Одеднаш го пропагира преку. Всушност, можеме да го промениме палуба големина на секоја вредност што го сакаме. Можам да ве интересира во игра на големината палубата пикап? Јас сум Даг Лојд. И ова е CS50.