>> [MÜZİK OYUN]
Doug LLOYD: Pekala.
Garip bir konu Tür, değil mi?
Sihirli numaralar.
O geldiğinde o ne anlama doe Sihirli numaralar bahsediyoruz?
Eh, bazı programlar Biz CS50 yazılı ettik
Bugüne kadar bazı garip oldu sayılar tür onlara atılmış.
Belki nedenlerden dolayı biz değiliz Tamamen şimdi anlıyorum.
Örneğin, Mario probleminde, biz 23 ° piramidin yüksekliği başlıklı.
Biz açıkça seni dedi daha yüksek 23 gidemez.
>> Ama 23 ne demek?
Peki, sen okursanız dikkatle sizi spec
gördük olabilir Neden biz 23 de o şapkalı
standart yüksekliği nedeniyle Bir terminal penceresi 24 olduğunu.
Ve biz eğer öyleyse piramit daha uzun olması,
Bu garip şey olabilir nerede ekran kapalı çalışır.
Bildiğiniz Ve ne yapar bu hak, bağlam demek?
>> 23 hemen açık anlamı şudur Birine kim programınıza bakar
ve belki de farklı bir vardır boyut Terminal penceresi?
Muhtemelen değil.
Tamam, gibi görünüyor.
Peki, neden sadece daha az 23 den mi?
Genel olarak, bu tür Kötü bir alışkanlık aslında
senin koduna sabitleri yazmak için.
Aslında ne zaman, bunu yaparken de senin koduna bir sabit yazma,
kullandığını olarak anılacaktır bazen oluyor Sihirli sayılar, bir şey
genellikle denemek ve önlemek istiyor.
>> Örneğin, bir göz atalım Burada bu basit fonksiyonuna.
Açıkçası hiçbir veri yoktur C tipi kartı veya güverte denir.
Yani sadece benimle ayı.
Bu biraz var sözde kod burada karıştırıldı.
Bu adı verilen bir fonksiyonudur görünüşte kart başa
parametresi olarak bir güverte alır ve Bana irade çıktı tek bir kart.
>> Ve ben burada nerede bir şey yapıyorum , 0'dan 52'ye çalışan bir döngü var
ve ben bir kart anlaşma.
Evet, biz bir sihirli var Burada sayı, doğru.
Eğer sihirli sayı ne olduğunu görüyor musun?
Ya da daha önemlisi, do you Sorun burada ne olduğunu görüyor musun?
Özellikle eğer bu Sadece bir fonksiyonudur
Bir kendi dosyasında içeren klasörü
Farklı bir demet dosyaları, her biri
bir iskambil destesi başka bir şey yok.
Belki de onları karıştırır, ya bir el fiyatları beş kart yerine tek bir kart.
>> Ne görüyorsun Burada sorun olabilir?
Eğer sihirli sayı görüyor musunuz Ben kod enjekte ettik?
Bu doğru, 52 değil.
>> Gibi, sezgisel muhtemelen biliyorum, tamam.
Standart bir güverte gibi Kartlar 52 kart bulunur.
Ama programda, bu sadece tür orada etrafında yüzen.
Birdenbire bir 52 var gibi.
>> Bu sorunu çözmek için bir yolu Sorun, bu yapmaktır.
Biz şimdi çok açıkça konum 52 olarak güverte boyutunu arıyor.
O biraz daha sezgisel verir zaman döngü için anlam
biz o zaman, i say sonra Güverte boyutundan daha azdır.
Sadece 52 diyerek daha iyi görünüyor.
Şimdi bu aslında sorunu çözmek değil.
Bazı sembolik veriyor sabiti anlam.
Ama bu tür aslında yok Başka bir problem tanıtmak
Bu hemen belli olmayabilir.
Hatta bu değişken ise globally-- ilan edilir
Bunu ne hatırlamak do Biz ilan zaman anlamına gelir
küresel yerel karşı değişken?
Biz bir değişken bildirmek bile küresel ne varsa
Başka bir işlevi fonksiyonların bizim paketi
Kart manipülasyonu ile bu anlaşma Bu yanlışlıkla, güverte boyutunu değiştirir
ya da bunu artırır 1 veya 1 azaltır.
Bu doğru, sorun büyü olabilir?
Biz bir dizi ile uğraşıyoruz Özellikle kartların tam deste karıştırma nerede
gerekli.
Güverte boyutu azaltılması durumunda, 1 ile, örneğin, 51,
biz aslında karıştırma değil muhtemelen tüm kartları.
Biz onlardan birini gidiyoruz.
Ve bu değer belki olabilir tahmin ya da kötü bir aktör tarafından istismar.
>> C denen sağlar önişlemci direktifi, hangi
Ayrıca makro denir sembolik sabitleri oluşturma.
Ve aslında, zaten var Bir önişlemci direktifi görüldü,
Bunu duymamış bile #include o çağırdı.
Bir makro başka bir örnek veya önişlemci direktifi.
>> Yol sembolik sabitler oluşturmak için, veya sabit bir isim vererek
daha sahip olacak şekilde yani, aşağıdaki gibidir.
#define, isim, yedek.
Kenara gerçekten önemli Burada gerçekten hızlı.
Noktalı virgül koymayın senin #DEFINEs sonu.
Yani #define, isim, yedek var.
>> Programınız derlenmiş olduğunda, aslında ne olur
gidiş derleyici kodunuza geçmesi
ve her örneği yerine ne olursa olsun ile kelime "ad" sen
yerine koymak.
Benzer şekilde, #include ise sıralama bir kopyalama ve yapıştırma benzer,
Daha sonra #define tür olduğunu bulmak ve değiştirmek için benzer,
Hiç bu özellik kullandıysanız kelime işlemci programı, örneğin.
>> Örneğin, eğer Yani 3.14159265 olarak pi #define,
daha iyi matematiksel iseniz eğimli ve aniden
3.14159265 uçan bakın etrafında kodunuzu,
Eğer muhtemelen pi bahsediyor biliyorum.
Ama belki bunu bir verebilir Biraz daha sembolik anlamı.
Ve biz bunun yerine #define söyleyebiliriz sayı olduğu lokma olarak pi
Ben tutmak için gitmiyorum olduğunu tekrar tekrar okuma.
>> Ve ne o zaman ne olacak Program olduğunda derleme zamanı
derlenmiş, ilk şey olur o geçmesi olacaktır
ve her zaman yerini alacak bu sermaye P, sermaye I görür
kelimenin tam anlamıyla ile değiştirin edeceğiz 3.14 ve böylece, böylece
Her yazmanız gerekmez zaman hala program sırasında
işlevselliğe sahiptir size Eğer çalışıyorsanız, çünkü bekliyoruz
manipülasyonu ile çarpılması, o pi tarafından ne olursa olsun, bölünmesi.
>> Buna bunlarla sınırlı değildir Sadece numaralar için ikame.
Örneğin, #define olabilir Dize CS50 olarak ders.
Bu durumda, ne Program derlenmiştir,
#define yoluyla gidecek Kod, her zaman yerine
bu dize CS50 ile "dersi" görür.
>> Burada fark edeceksiniz Ayrıca ben o sık sık
#define tüm sembolik tanımlanmış sabitler, bu yüzden, konuşmak için
Tüm kapaklar her zaman vardır.
Bu bir kongre var.
Bu gerekli değil.
Nedeni genellikle insanlar kullanacak Tüm başkentleri onlar #defining ediyoruz
Sadece o gerçekten net yapmak olduğunu Benim bu kod belirli unsuru
tanımlanmış bir sabittir.
O küçük olsaydı, o mümkün Bir değişken karışık olabilir.
Ve bu muhtemelen iyi bir şey yapmak için değil.
>> Yani bu özel çözüm çok daha iyidir
önceki olanlardan birini daha.
Ben ilk #define güverte boyutu 52, daha sonra ise Şimdi burada 52 ya da güverte boyutu benim kullanımı
çok daha sezgisel ve daha bir çok güvenlidir.
Bir sabit manipüle edemez.
Sen 52 artı artı diyemeyiz.
Yani 53 dönüştürmek için gitmiyor.
Sen bir şey 52 değiştiremezsiniz.
>> Bir değişkeni değiştirebilirsiniz , değeri 52 ise,
hangi Daha önce vardı ilk düzeltme oldu.
Ve artabileceğini 53'e bu değişken.
Ama 52 artı artı ve diyemeyiz aniden 53 içine 52 açmanızı var.
52 daima 52 olduğunu.
Ve böylece yanlışlıkla değiştiremezsiniz Burada manipüle ederek güverte boyutu,
>> Bir başka iyi tarafı Bu olsa etkisidir
Bu farkında olduğunuzu değil Dünyada tüm ülkelerin
büyüklüğü 52 kartlık bir deste kullanılır?
Örneğin, gerçekten yaygın Almanya, 32 güverte boyutunu kullanmak için
bazı atmak nerede düşük bir değer kartları.
Ve bu durumda, I port benim paketi istedim
başa fonksiyonların Almanya'ya kart manipülasyon.
Ben ilk etapta olabilir biz gösterdi, gidip değiştirmek zorunda
32 ile benim kod içinde 52 tüm örneklerini.
>> Ama burada, ben #define eğer güverte boyutu benim kod çok üstünde 32 olarak,
Ben bunu değiştirmek gerekiyorsa, I can sadece gidip bu bir şeyi değiştirmez.
Benim kod yeniden derleyin ve tüm ani içinden yayar.
Aslında, biz güverte değiştirebilir İstediğimiz herhangi bir değere boyutu.
>> Ben edebilir miyim güverte boyutu kamyonetin oyun?
>> Ben Doug Lloyd değilim.
Bu CS50 olup.