>> [Грає музика]
ДАГ 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.