1 00:00:00,000 --> 00:00:02,350 >> [MÜZİK OYUN] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Doug LLOYD: Pekala. 4 00:00:06,360 --> 00:00:07,770 Garip bir konu Tür, değil mi? 5 00:00:07,770 --> 00:00:09,050 Sihirli numaralar. 6 00:00:09,050 --> 00:00:12,012 O geldiğinde o ne anlama doe Sihirli numaralar bahsediyoruz? 7 00:00:12,012 --> 00:00:14,220 Eh, bazı programlar Biz CS50 yazılı ettik 8 00:00:14,220 --> 00:00:16,660 Bugüne kadar bazı garip oldu sayılar tür onlara atılmış. 9 00:00:16,660 --> 00:00:19,680 Belki nedenlerden dolayı biz değiliz Tamamen şimdi anlıyorum. 10 00:00:19,680 --> 00:00:23,950 Örneğin, Mario probleminde, biz 23 ° piramidin yüksekliği başlıklı. 11 00:00:23,950 --> 00:00:26,880 Biz açıkça seni dedi daha yüksek 23 gidemez. 12 00:00:26,880 --> 00:00:28,702 >> Ama 23 ne demek? 13 00:00:28,702 --> 00:00:30,410 Peki, sen okursanız dikkatle sizi spec 14 00:00:30,410 --> 00:00:32,493 gördük olabilir Neden biz 23 de o şapkalı 15 00:00:32,493 --> 00:00:36,160 standart yüksekliği nedeniyle Bir terminal penceresi 24 olduğunu. 16 00:00:36,160 --> 00:00:38,860 Ve biz eğer öyleyse piramit daha uzun olması, 17 00:00:38,860 --> 00:00:41,290 Bu garip şey olabilir nerede ekran kapalı çalışır. 18 00:00:41,290 --> 00:00:45,140 Bildiğiniz Ve ne yapar bu hak, bağlam demek? 19 00:00:45,140 --> 00:00:48,880 >> 23 hemen açık anlamı şudur Birine kim programınıza bakar 20 00:00:48,880 --> 00:00:51,550 ve belki de farklı bir vardır boyut Terminal penceresi? 21 00:00:51,550 --> 00:00:52,330 Muhtemelen değil. 22 00:00:52,330 --> 00:00:53,080 Tamam, gibi görünüyor. 23 00:00:53,080 --> 00:00:55,005 Peki, neden sadece daha az 23 den mi? 24 00:00:55,005 --> 00:00:56,880 Genel olarak, bu tür Kötü bir alışkanlık aslında 25 00:00:56,880 --> 00:00:58,940 senin koduna sabitleri yazmak için. 26 00:00:58,940 --> 00:01:02,190 Aslında ne zaman, bunu yaparken de senin koduna bir sabit yazma, 27 00:01:02,190 --> 00:01:05,630 kullandığını olarak anılacaktır bazen oluyor Sihirli sayılar, bir şey 28 00:01:05,630 --> 00:01:08,030 genellikle denemek ve önlemek istiyor. 29 00:01:08,030 --> 00:01:12,830 >> Örneğin, bir göz atalım Burada bu basit fonksiyonuna. 30 00:01:12,830 --> 00:01:15,726 Açıkçası hiçbir veri yoktur C tipi kartı veya güverte denir. 31 00:01:15,726 --> 00:01:16,600 Yani sadece benimle ayı. 32 00:01:16,600 --> 00:01:18,910 Bu biraz var sözde kod burada karıştırıldı. 33 00:01:18,910 --> 00:01:21,050 Bu adı verilen bir fonksiyonudur görünüşte kart başa 34 00:01:21,050 --> 00:01:26,570 parametresi olarak bir güverte alır ve Bana irade çıktı tek bir kart. 35 00:01:26,570 --> 00:01:30,990 >> Ve ben burada nerede bir şey yapıyorum , 0'dan 52'ye çalışan bir döngü var 36 00:01:30,990 --> 00:01:33,394 ve ben bir kart anlaşma. 37 00:01:33,394 --> 00:01:35,310 Evet, biz bir sihirli var Burada sayı, doğru. 38 00:01:35,310 --> 00:01:38,790 Eğer sihirli sayı ne olduğunu görüyor musun? 39 00:01:38,790 --> 00:01:42,280 Ya da daha önemlisi, do you Sorun burada ne olduğunu görüyor musun? 40 00:01:42,280 --> 00:01:44,310 Özellikle eğer bu Sadece bir fonksiyonudur 41 00:01:44,310 --> 00:01:48,030 Bir kendi dosyasında içeren klasörü 42 00:01:48,030 --> 00:01:49,970 Farklı bir demet dosyaları, her biri 43 00:01:49,970 --> 00:01:51,670 bir iskambil destesi başka bir şey yok. 44 00:01:51,670 --> 00:01:57,310 Belki de onları karıştırır, ya bir el fiyatları beş kart yerine tek bir kart. 45 00:01:57,310 --> 00:01:59,420 >> Ne görüyorsun Burada sorun olabilir? 46 00:01:59,420 --> 00:02:03,220 Eğer sihirli sayı görüyor musunuz Ben kod enjekte ettik? 47 00:02:03,220 --> 00:02:04,390 Bu doğru, 52 değil. 48 00:02:04,390 --> 00:02:06,440 >> Gibi, sezgisel muhtemelen biliyorum, tamam. 49 00:02:06,440 --> 00:02:09,740 Standart bir güverte gibi Kartlar 52 kart bulunur. 50 00:02:09,740 --> 00:02:12,570 Ama programda, bu sadece tür orada etrafında yüzen. 51 00:02:12,570 --> 00:02:15,280 Birdenbire bir 52 var gibi. 52 00:02:15,280 --> 00:02:18,290 >> Bu sorunu çözmek için bir yolu Sorun, bu yapmaktır. 53 00:02:18,290 --> 00:02:22,724 Biz şimdi çok açıkça konum 52 olarak güverte boyutunu arıyor. 54 00:02:22,724 --> 00:02:25,390 O biraz daha sezgisel verir zaman döngü için anlam 55 00:02:25,390 --> 00:02:28,650 biz o zaman, i say sonra Güverte boyutundan daha azdır. 56 00:02:28,650 --> 00:02:32,666 Sadece 52 diyerek daha iyi görünüyor. 57 00:02:32,666 --> 00:02:34,290 Şimdi bu aslında sorunu çözmek değil. 58 00:02:34,290 --> 00:02:38,460 Bazı sembolik veriyor sabiti anlam. 59 00:02:38,460 --> 00:02:40,820 Ama bu tür aslında yok Başka bir problem tanıtmak 60 00:02:40,820 --> 00:02:43,770 Bu hemen belli olmayabilir. 61 00:02:43,770 --> 00:02:45,859 Hatta bu değişken ise globally-- ilan edilir 62 00:02:45,859 --> 00:02:47,650 Bunu ne hatırlamak do Biz ilan zaman anlamına gelir 63 00:02:47,650 --> 00:02:50,500 küresel yerel karşı değişken? 64 00:02:50,500 --> 00:02:53,340 Biz bir değişken bildirmek bile küresel ne varsa 65 00:02:53,340 --> 00:02:55,500 Başka bir işlevi fonksiyonların bizim paketi 66 00:02:55,500 --> 00:02:59,750 Kart manipülasyonu ile bu anlaşma Bu yanlışlıkla, güverte boyutunu değiştirir 67 00:02:59,750 --> 00:03:02,727 ya da bunu artırır 1 veya 1 azaltır. 68 00:03:02,727 --> 00:03:04,060 Bu doğru, sorun büyü olabilir? 69 00:03:04,060 --> 00:03:08,261 Biz bir dizi ile uğraşıyoruz Özellikle kartların tam deste karıştırma nerede 70 00:03:08,261 --> 00:03:08,760 gerekli. 71 00:03:08,760 --> 00:03:12,804 Güverte boyutu azaltılması durumunda, 1 ile, örneğin, 51, 72 00:03:12,804 --> 00:03:14,970 biz aslında karıştırma değil muhtemelen tüm kartları. 73 00:03:14,970 --> 00:03:16,500 Biz onlardan birini gidiyoruz. 74 00:03:16,500 --> 00:03:21,680 Ve bu değer belki olabilir tahmin ya da kötü bir aktör tarafından istismar. 75 00:03:21,680 --> 00:03:24,920 >> C denen sağlar önişlemci direktifi, hangi 76 00:03:24,920 --> 00:03:27,764 Ayrıca makro denir sembolik sabitleri oluşturma. 77 00:03:27,764 --> 00:03:30,180 Ve aslında, zaten var Bir önişlemci direktifi görüldü, 78 00:03:30,180 --> 00:03:32,916 Bunu duymamış bile #include o çağırdı. 79 00:03:32,916 --> 00:03:37,150 Bir makro başka bir örnek veya önişlemci direktifi. 80 00:03:37,150 --> 00:03:41,290 >> Yol sembolik sabitler oluşturmak için, veya sabit bir isim vererek 81 00:03:41,290 --> 00:03:43,740 daha sahip olacak şekilde yani, aşağıdaki gibidir. 82 00:03:43,740 --> 00:03:47,030 #define, isim, yedek. 83 00:03:47,030 --> 00:03:49,140 Kenara gerçekten önemli Burada gerçekten hızlı. 84 00:03:49,140 --> 00:03:54,180 Noktalı virgül koymayın senin #DEFINEs sonu. 85 00:03:54,180 --> 00:03:57,310 Yani #define, isim, yedek var. 86 00:03:57,310 --> 00:03:59,540 >> Programınız derlenmiş olduğunda, aslında ne olur 87 00:03:59,540 --> 00:04:01,740 gidiş derleyici kodunuza geçmesi 88 00:04:01,740 --> 00:04:06,770 ve her örneği yerine ne olursa olsun ile kelime "ad" sen 89 00:04:06,770 --> 00:04:08,860 yerine koymak. 90 00:04:08,860 --> 00:04:13,060 Benzer şekilde, #include ise sıralama bir kopyalama ve yapıştırma benzer, 91 00:04:13,060 --> 00:04:15,700 Daha sonra #define tür olduğunu bulmak ve değiştirmek için benzer, 92 00:04:15,700 --> 00:04:19,180 Hiç bu özellik kullandıysanız kelime işlemci programı, örneğin. 93 00:04:19,180 --> 00:04:26,345 >> Örneğin, eğer Yani 3.14159265 olarak pi #define, 94 00:04:26,345 --> 00:04:28,720 daha iyi matematiksel iseniz eğimli ve aniden 95 00:04:28,720 --> 00:04:31,640 3.14159265 uçan bakın etrafında kodunuzu, 96 00:04:31,640 --> 00:04:33,517 Eğer muhtemelen pi bahsediyor biliyorum. 97 00:04:33,517 --> 00:04:35,850 Ama belki bunu bir verebilir Biraz daha sembolik anlamı. 98 00:04:35,850 --> 00:04:39,850 Ve biz bunun yerine #define söyleyebiliriz sayı olduğu lokma olarak pi 99 00:04:39,850 --> 00:04:42,110 Ben tutmak için gitmiyorum olduğunu tekrar tekrar okuma. 100 00:04:42,110 --> 00:04:45,560 >> Ve ne o zaman ne olacak Program olduğunda derleme zamanı 101 00:04:45,560 --> 00:04:48,530 derlenmiş, ilk şey olur o geçmesi olacaktır 102 00:04:48,530 --> 00:04:51,520 ve her zaman yerini alacak bu sermaye P, sermaye I görür 103 00:04:51,520 --> 00:04:55,610 kelimenin tam anlamıyla ile değiştirin edeceğiz 3.14 ve böylece, böylece 104 00:04:55,610 --> 00:04:58,090 Her yazmanız gerekmez zaman hala program sırasında 105 00:04:58,090 --> 00:05:00,631 işlevselliğe sahiptir size Eğer çalışıyorsanız, çünkü bekliyoruz 106 00:05:00,631 --> 00:05:05,090 manipülasyonu ile çarpılması, o pi tarafından ne olursa olsun, bölünmesi. 107 00:05:05,090 --> 00:05:08,230 >> Buna bunlarla sınırlı değildir Sadece numaralar için ikame. 108 00:05:08,230 --> 00:05:12,279 Örneğin, #define olabilir Dize CS50 olarak ders. 109 00:05:12,279 --> 00:05:14,070 Bu durumda, ne Program derlenmiştir, 110 00:05:14,070 --> 00:05:16,236 #define yoluyla gidecek Kod, her zaman yerine 111 00:05:16,236 --> 00:05:19,900 bu dize CS50 ile "dersi" görür. 112 00:05:19,900 --> 00:05:21,720 >> Burada fark edeceksiniz Ayrıca ben o sık sık 113 00:05:21,720 --> 00:05:26,090 #define tüm sembolik tanımlanmış sabitler, bu yüzden, konuşmak için 114 00:05:26,090 --> 00:05:28,130 Tüm kapaklar her zaman vardır. 115 00:05:28,130 --> 00:05:28,960 Bu bir kongre var. 116 00:05:28,960 --> 00:05:30,170 Bu gerekli değil. 117 00:05:30,170 --> 00:05:33,900 Nedeni genellikle insanlar kullanacak Tüm başkentleri onlar #defining ediyoruz 118 00:05:33,900 --> 00:05:37,590 Sadece o gerçekten net yapmak olduğunu Benim bu kod belirli unsuru 119 00:05:37,590 --> 00:05:38,820 tanımlanmış bir sabittir. 120 00:05:38,820 --> 00:05:43,730 O küçük olsaydı, o mümkün Bir değişken karışık olabilir. 121 00:05:43,730 --> 00:05:46,120 Ve bu muhtemelen iyi bir şey yapmak için değil. 122 00:05:46,120 --> 00:05:48,910 >> Yani bu özel çözüm çok daha iyidir 123 00:05:48,910 --> 00:05:50,550 önceki olanlardan birini daha. 124 00:05:50,550 --> 00:05:59,950 Ben ilk #define güverte boyutu 52, daha sonra ise Şimdi burada 52 ya da güverte boyutu benim kullanımı 125 00:05:59,950 --> 00:06:01,850 çok daha sezgisel ve daha bir çok güvenlidir. 126 00:06:01,850 --> 00:06:03,280 Bir sabit manipüle edemez. 127 00:06:03,280 --> 00:06:05,259 Sen 52 artı artı diyemeyiz. 128 00:06:05,259 --> 00:06:06,800 Yani 53 dönüştürmek için gitmiyor. 129 00:06:06,800 --> 00:06:09,390 Sen bir şey 52 değiştiremezsiniz. 130 00:06:09,390 --> 00:06:12,470 >> Bir değişkeni değiştirebilirsiniz , değeri 52 ise, 131 00:06:12,470 --> 00:06:14,870 hangi Daha önce vardı ilk düzeltme oldu. 132 00:06:14,870 --> 00:06:17,000 Ve artabileceğini 53'e bu değişken. 133 00:06:17,000 --> 00:06:21,100 Ama 52 artı artı ve diyemeyiz aniden 53 içine 52 açmanızı var. 134 00:06:21,100 --> 00:06:23,350 52 daima 52 olduğunu. 135 00:06:23,350 --> 00:06:28,860 Ve böylece yanlışlıkla değiştiremezsiniz Burada manipüle ederek güverte boyutu, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Bir başka iyi tarafı Bu olsa etkisidir 138 00:06:32,390 --> 00:06:38,310 Bu farkında olduğunuzu değil Dünyada tüm ülkelerin 139 00:06:38,310 --> 00:06:40,690 büyüklüğü 52 kartlık bir deste kullanılır? 140 00:06:40,690 --> 00:06:45,630 Örneğin, gerçekten yaygın Almanya, 32 güverte boyutunu kullanmak için 141 00:06:45,630 --> 00:06:48,020 bazı atmak nerede düşük bir değer kartları. 142 00:06:48,020 --> 00:06:50,960 Ve bu durumda, I port benim paketi istedim 143 00:06:50,960 --> 00:06:55,390 başa fonksiyonların Almanya'ya kart manipülasyon. 144 00:06:55,390 --> 00:06:59,440 Ben ilk etapta olabilir biz gösterdi, gidip değiştirmek zorunda 145 00:06:59,440 --> 00:07:03,570 32 ile benim kod içinde 52 tüm örneklerini. 146 00:07:03,570 --> 00:07:07,940 >> Ama burada, ben #define eğer güverte boyutu benim kod çok üstünde 32 olarak, 147 00:07:07,940 --> 00:07:11,730 Ben bunu değiştirmek gerekiyorsa, I can sadece gidip bu bir şeyi değiştirmez. 148 00:07:11,730 --> 00:07:15,010 Benim kod yeniden derleyin ve tüm ani içinden yayar. 149 00:07:15,010 --> 00:07:18,850 Aslında, biz güverte değiştirebilir İstediğimiz herhangi bir değere boyutu. 150 00:07:18,850 --> 00:07:22,500 >> Ben edebilir miyim güverte boyutu kamyonetin oyun? 151 00:07:22,500 --> 00:07:23,430 >> Ben Doug Lloyd değilim. 152 00:07:23,430 --> 00:07:25,840 Bu CS50 olup. 153 00:07:25,840 --> 00:07:27,772