[Гуляе музыка] Даг Lloyd: Добра. Выгляд дзіўнай тэмы, праўда? Магічныя колькасці. Што ён меў на ўвазе самка, калі ён казаць аб магічных лікаў? Ну, некаторыя з праграм што мы напісалі ў CS50 да гэтага часу былі некаторыя дзіўныя лік выгляд кінулі ў іх. Магчыма, па прычынах, мы не цалкам зразумець прама цяпер. Напрыклад, у задачы Марыё, мы абмежаваны вышыню піраміды на 23. Мы відавочна кажа вам не можа пайсці вышэй, чым 23. Але што значыць 23? Ну, калі вы чытаеце спец ўважліва, вы магчыма, бачылі, што Таму мы абмежаваныя яго на 23 гэта таму, што стандартнай вышыні тэрмінальнага акна 24. І таму, калі ў нас ёсць Піраміда быць вышэй, чым, што, гэта можа зрабіць гэтую рэч дзіўны дзе ён працуе з экрана. І вы ведаеце, што робіць што азначае ў кантэксце, праўда? Ёсць сэнс адразу відаць 23 для каго-небудзь, хто глядзіць на вашай праграме і, магчыма, мае розныя Памер акно тэрмінала? Напэўна, не. Падобна на тое ,, ОК. Ну, чаму гэта крыху менш за 23? Увогуле, гэта свайго роду ад шкоднай звычкі на самай справе напісаць канстанты ў кодзе. Пры гэтым, калі вы на самой справе напісаць канстанту ў вашым кодзе, гэта часам называюць выкарыстаннем магічныя колькасці, якія нешта мы звычайна хочам, каб паспрабаваць пазбегнуць. Напрыклад, давайце зірнем у гэтай простай функцыі тут. Відавочна, што няма дадзеных увядзіце C называецца карту або палубы. Так што церпіце мяне. Гэта крыху псевдокод змешваецца тут. Гэтая функцыя называецца справа, па-відаць, што карты бярэ калоду ў якасці параметру, і выведзе мяне адна карта. І я раблю што-то тут, дзе я ёсць цыкл, які праходзіць ад 0 да 52, і я справу карту. Ну, у нас ёсць магія Колькасць тут, прама. Вы бачыце, што магічнае лік? Ці, што больш важна, ці не так бачыць, што праблема тут? Асабліва, калі гэта проста адна функцыя у сваім уласным файле ў Тэчка, якая змяшчае кучу розных Файлы, кожны з якіх робіць яшчэ адну рэч, каб калода карт. Можа быць, гэта змешвае іх, ці наносіць руку з пяці карт замест адной карце. Вы бачыце, што ў Праблема можа быць тут? Вы бачыце магічнае лік Я ўводзіцца ў кодзе? Гэта 52, правільна. Маўляў, інтуітыўна вы, напэўна, ведаеце, добра. Як стандартнай калодай з карты змяшчае 52 карт. Але ў нашай праграме, то гэта проста выгляд плаваюць вакол там. Гэта як раптам ёсць 52. Адзін са спосабаў вырашыць гэтую праблему Праблема ў тым, каб зрабіць гэта. Мы вельмі відавочна Цяпер заклікаючы памер палубе 52. Гэта дае яму крыху больш зразумелым гэта азначае, калі ў цыкл пазней мы тады сказаць, я менш, чым памер палубы. Гэта толькі здаецца, лепш, чым кажу 52. Зараз гэта на самай справе вырашыць праблему. Гэта дае некаторы сімвалічнае сэнс канстанты. Але гэта на самай справе свайго роду ўвесці яшчэ адну праблему якія не могуць быць адразу. Нават калі гэтая пераменная абвешчаны globally-- вы можаце ўспомніць, што гэта значыць, калі мы заяўляем, пераменная глабальна супраць лакальна? Нават калі мы аб'яўляем зменную ў глабальным маштабе, што, калі ёсць іншая функцыя ў наш набор функцый што здзелка з маніпуляцыяй карты што міжволі змяняе памер палубы, або павялічвае яго 1 або памяншае яго на 1. Гэта можа азначаць праблемы, дакладна? Асабліва, калі мы маем справу з наборам карт, дзе ператасоўкі калоды поўную патрабуецца. Калі памер палубы памяншаецца на 1, напрыклад, да 51, мы на самай справе не шоргаючы усе карты магчыма. Мы выязджаем аднаго з іх. І, што значэнне можа быць, магчыма, або прадказаць эксплуатуюцца дрэнны акцёр. З забяспечвае тое, што называецца Дырэктыва препроцессора, якія таксама называецца макрас стварэнне сімвалічных канстант. І на самай справе, вы ўжо бачыў дырэктыву препроцессора, нават калі вы яшчэ не чулі яго назваць тое, што з #include. Гэта яшчэ адзін прыклад макраса ці дырэктыва препроцессора. Спосаб стварэння сімвалічныя канстанты, ці даваць імя да пастаяннай такім чынам, што яна мае больш азначае, складаецца ў наступным. #define, імя, замена. Сапраўды важна бок тут вельмі хутка. Не стаўце кропку з коскі ў канец вашых #defines. Так што гэта #define, імя, замена. Калі ваша праграма складзена, тое, што адбываецца на самай справе гэта кампілятар, калі адбываецца прайсці праз код і замяніць кожны асобнік слова "імя" з тым, што вы змясціць у якасці замены. Аналагічна, калі #include з'яўляецца свайго роду з падобна на капіяванне і ўстаўка, Затым #define з'яўляецца свайго роду падобна, каб знайсці і замяніць, калі вы калі-небудзь выкарыстоўвалі гэтую функцыю ў праграма для апрацоўкі тэксту, напрыклад. Так, напрыклад, калі #define PI 3.14159265, як, калі вы лепш матэматычна нахільных і вы раптам см 3.14159265 палёт вакол у кодзе, Вы, верагодна, ведаеце, што гэта гаворыць пра пі. Але, можа быць, мы можам даць яму трохі больш сімвалічнае значэнне. І мы можам сказаць, замест #define пі як тое рот лікаў што я не збіраюся трымаць чытаць зноў і зноў. І тое, што адбудзецца потым на Час кампіляцыі, калі праграма складзены, першае, што адбудзецца гэта будзе праходзіць праз і ён будзе замяніць кожны раз, ён бачыць капіталу P, капітал 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.