[MUZYKI] DOUG LLOYD: Wszystko w porządku. Niby dziwny temat, prawda? Numery magii. Co miał na myśli, gdy łania, że ​​jest mówić o magii liczb? Oraz niektóre programy że mamy napisane w CS50 do tej pory nie miałem jakiś dziwny numery rodzaj rzucone w nich. Być może ze względu na nie robimy całkowicie rozumiem teraz. Na przykład, w problemu Mario, że ograniczona wysokość piramidy w 23. Wyraźnie powiedział ci nie może iść wyżej niż 23. Ale co oznacza 23 oznacza? Cóż, jeśli czytasz spec, ostrożnie, ci mógłby zauważyć, że Powodem, że zamknięto go w 23 Jest tak, ponieważ wysokości standardowej w oknie terminala wynosi 24. I tak, jeśli mamy Piramida być wyższy niż, może to zrobić, to dziwne rzeczy gdzie spływa z ekranu. I wiesz, co robi to oznacza, że ​​w kontekście, prawda? Jest sens 23 oczywiste do kogoś, kto patrzy na swojego programu a może ma inny Rozmiar okno terminalu? Prawdopodobnie nie. Wydaje się, że, OK. A dlaczego jest to tylko mniej niż 23? Ogólnie rzecz biorąc, jest to swego rodzaju złego nawyku rzeczywistości napisać stałe w kodzie. W ten sposób, gdy faktycznie Napisać do stałej do kodu, Czasami jest dalej za pomocą magiczne liczby, które jest czymś na ogół chcą spróbować uniknąć. Na przykład, rzućmy okiem w tym prostej funkcji tutaj. Oczywiście nie ma danych wpisz C o nazwie karty lub taras. Więc po prostu pokrywa się ze mną. To trochę pseudokod mieszane tutaj. Jest to funkcja o nazwie radzić sobie kartę, która najwidoczniej bierze talię jako parametru, a Wyjście wola do mnie jedna karta. I robię coś tu, gdzie ja mają pętlę, która biegnie od 0 do 52, a ja sobie karty. Cóż, mamy magię Numer tutaj, w prawo. Czy widzisz to, co magiczna liczba? Lub, co ważniejsze, prawda zobaczyć, co problem jest tutaj? Szczególnie, jeśli to jest tylko jedna funkcja w swoim pliku w Folder zawiera kilka różnych plików, z których każda robi coś innego do talii kart. Może to tasuje je, lub zajmuje rękę z pięciu kart zamiast jednej karty. Czy widzisz, co się Problemem może być tutaj? Czy widzisz magiczna liczba Mam wstrzykiwany do kodu? Jest to 52, w prawo. Jak, intuicyjnie zapewne wiesz, OK. Podobnie jak w standardowym pokładzie Karty zawiera 52 kart. Ale w naszym programie, to tylko rodzaj krąży tam. To tak, jakby nagle istnieje 52. Jednym ze sposobów, aby rozwiązać ten problem Problem polega na tym, aby to zrobić. Jesteśmy bardzo wyraźnie teraz wołając wielkości pokładu jako 52. Daje to trochę bardziej intuicyjny co oznacza, gdy w pętli for później my wtedy powiedzieć, że jest mniejszy niż rozmiar pokładu. To po prostu wydaje się lepszy, niż mówiąc 52. Teraz to ma właściwie rozwiązać problem. To daje pewne symboliczne oznacza na stałe. Ale to nie rodzaj rzeczywistości przedstawić inny problem że może nie być od razu widoczne. Nawet jeśli ta zmienna deklaruje globally-- wspominasz, co to Oznacza kiedy deklarujemy zmienną globalnie kontra lokalnie? Nawet jeśli zadeklarować zmienną na całym świecie, co będzie, jeśli nie ma inna funkcja w nasz pakiet funkcji które zajmują się manipulacji karty że przypadkowo zmienia rozmiar pokładu, lub zwiększa go 1 lub zmniejsza się o 1. To może oznaczać kłopoty, prawda? Zwłaszcza, jeśli mamy do czynienia z zestawem tasowanie kart, gdzie całą talię jest wymagane. Jeśli rozmiar talii jest zmniejszony od 1, na przykład, 51, nie jesteśmy właściwie tasowanie wszystkie karty ewentualnie. Wyjeżdżamy z nich na zewnątrz. I ta wartość może być może należnej lub wykorzystana przez złego aktora. C zapewnia to, co się nazywa dyrektywy preprocesora, które jest również nazywany makrofotografii tworzenie stałych symbolicznych. I faktycznie, już mam widziałem dyrektywy preprocesora, nawet jeśli jej nie słyszał nazywa, że ​​z #include. Jest to kolejny przykład makra lub dyrektywa preprocesora. Sposobem na stworzenie stałych symbolicznych, lub podając nazwę na stałe tak, że ma bardziej oznacza się następująco. #define, nazwisko, wymiana. Naprawdę ważne bok tutaj naprawdę szybkie. Nie postawić średnik na koniec waszych #defines. Więc to #define, nazwisko, wymiana. Gdy program jest kompilowany, co faktycznie się dzieje to kompilator, jeśli będzie przejść przez kod i zastąpić wszystkie wystąpienia słowo "imię" z Cokolwiek umieścić jako zamiennik. Analogicznie, jeśli #include jest rodzajem z podobna do kopiowania i wklejania, następnie #define jest rodzajem podobna do wyszukiwania i zamiany, jeśli kiedykolwiek używałeś tej funkcji w sposób edytor tekstu, na przykład. Tak na przykład, jeśli #define pi jako 3,14159265, jeśli jesteś lepszy matematycznie pochylona i nagle zobacz 3,14159265 latanie wokół w kodzie, to zapewne wiesz, że mówi o pi. Ale może uda nam się nadać mu małe znaczenie bardziej symboliczny. I możemy zamiast powiedzieć #define pi w tym ustami pełnymi numerami że nie będę trzymać czytanie w kółko. A co się stanie potem na kompilacji jest, gdy program jest kompilowane, pierwszą rzeczą, która stanie się to będzie przejść przez i zastąpi ona za każdym razem, widzi kapitałowej P, kapitału I, będzie to dosłownie zastąpić go 3,14 i tak dalej, tak, że nie trzeba wpisywać go za każdym razem, gdy twój program wciąż posiada funkcje, które Cię spodziewać, bo pracujesz manipulacyjne, mnożenie, podziału, cokolwiek to jest, przez pi. Nie jest do tego ograniczony zastąpienie tylko liczby. Na przykład, mogę #define Oczywiście jak CS50 smyczkowy. W tym przypadku, gdy program jest kompilowany, #define będzie przejść przez Kod, wymienić za każdym razem, widzi "kurs" z CS50 smyczkowy. Zauważysz tutaj również, że ja często #define całe zdefiniowane symboliczne Stałe, że tak powiem, zawsze są wielkimi literami. Jest to konwencja. To nie jest wymagane. Powodem zwykle ludzie będą używać wszystkie stolice, gdy są #defining jest tylko, aby to naprawdę jasne, że ten konkretny element mojego kodu jest zdefiniowane stałe. Jeśli to było małe, możliwe jest, że to może być mylony ze zmienną. I to jest chyba nie jest dobrą rzeczą do zrobienia. Więc ten szczególny Rozwiązanie to jest o wiele lepsza od jednego z poprzednich. Jeśli pierwszy raz #define rozmiar talia 52, a następnie teraz moje użycie 52 lub wielkości pokładu tutaj, jest o wiele bardziej intuicyjny i dużo bezpieczniejsze. Nie można manipulować stałą. Nie można powiedzieć, 52 oraz plusem. To nie będzie przekonwertować go do 53. Nie można zmienić 52 do czegoś. Możesz zmienić zmienną którego wartość wynosi 52, która pierwsza poprawka mieliśmy wcześniej. I można zwiększyć zmienna do 53. Ale nie można powiedzieć, 52 plusa plus i mają, że nagle obrócić 52 do 53. 52 jest zawsze 52. A więc nie można przypadkowo zmienić Rozmiar tutaj manipulując jej pokład, Kolejna dobra strona Efektem tego jest jednak, że jesteś świadomy, że nie wszystkie kraje na całym świecie użyć talię kart o rozmiarze 52? Na przykład, jest to bardzo powszechne w Niemcy użyć wielkości pokładu 32, gdzie usuwają niektóre dolnych wartości karty. I w tym przypadku, chciał portu Mój apartament funkcji, które zajmują się Manipulacja karty do Niemiec. Mogłem w pierwszej instancji, że pokazał, trzeba iść i wymienić wszystkie instancje 52 w kodzie z 32. Ale tutaj, jeśli #define rozmiar talii jako 32 na samym początku mojego kodu, czy muszę go zmienić, mogę tylko iść i zmienić tej jednej rzeczy. Rekompilacji mój kod, a wszystkie nagle to rozchodzi. W rzeczywistości, możemy zmienić talię Rozmiar na dowolną wartość, którą chcemy. Czy mogę cię zainteresowanie Gra od wielkości pokładu pickup? Jestem Doug Lloyd. I to jest CS50.