[Mūzikas atskaņošanai] Doug LLOYD: Nu labi. Veida dīvaini tēmu, vai ne? Burvju numuri. Ko stirna viņš domā, kad viņš ir runājot par burvju numuru? Nu, dažas programmas ka mēs esam rakstīts CS50 līdz šim ir bijusi daži dīvaini numuri veida izmet tiem. Varbūt dēļ mums nav pilnībā izprast tieši tagad. Tā, piemēram, Mario problēmas, mēs nepārsniedzamā augstumu piramīdas 23. Mēs skaidri teica tevi nevar iet augstāk par 23. Bet ko tas nozīmē 23? Nu, ja jūs lasīt spec uzmanīgi, jūs varētu būt redzējis, ka Iemesls, kāpēc mēs ierobežots to 23 ir tāpēc, ka standarta augstuma no termināļa logā ir 24. Un tā, ja mums ir piramīda būt garāks nekā, tas varētu darīt šo dīvaini kur tas iet pie ekrāna. Un jūs zināt, ko dara tas nozīmē, ka kontekstā, vai ne? Ir nozīme 23 uzreiz skaidrs kādam, kurš izskatās pēc jūsu programmā un varbūt ir atšķirīgs izmērs termināla logu? Visticamāk ne. Šķiet, piemēram, OK. Nu, kāpēc tas ir tikai mazāk nekā 23? Vispār, tas ir sava veida slikts ieradums faktiski uzrakstīt konstantes jūsu kodu. To darot, kad jūs faktiski darīt uzrakstīt konstanti savā kodu, tas ir dažreiz sauc par izmantojot burvju numurus, kas ir kaut kas mēs parasti vēlamies, lai mēģinātu izvairīties. Piemēram, pieņemsim to apskatīt Šī vienkāršā funkcija šeit. Acīmredzot tur nav datu tips C sauc karti vai klāja. Tik tikko sedz ar mani. Tas ir mazliet pseudocode sajauc šeit. Šī ir funkcija, ko sauc Nodarbojamies karti, kas acīmredzot kavu, jo tā parametrs, un griba izeja man vienu karti. Un es esmu dara kaut ko šeit, kur es ir cilpa, kas iet no 0 līdz 52, un es galā karti. Nu, mēs esam ieguvuši burvju numurs šeit, pa labi. Vai jūs redzat, ko burvju numurs ir? Vai ir vēl svarīgāk, vai ne redzēt, kāda ir problēma šeit? It īpaši, ja tas ir tikai viena funkcija savā failu programmā mape, kas satur ķekars atšķirīgs failus, katrs no kuriem tas cita lieta kārtis. Varbūt tas sajauks viņiem, vai arī nodarbojas ar roku no piecām kārtīm, nevis vienu karti. Vai jūs redzat to, ko Problēma varētu būt šeit? Vai jūs redzat burvju numuru Esmu ievada kodu? Tas ir 52, pa labi. Tāpat, intuitīvi jūs droši vien zināt, OK. Tāpat kā standarta klājā kārtis ir 52 kārtis. Bet mūsu programmā, tas ir tikai veida peldošs ap tur. Tas ir tāpat kā visi pēkšņi tur ir 52. Viens veids, kā atrisināt šo Problēma ir tā, lai to paveiktu. Mēs esam ļoti skaidri tagad nosaucot to klāja izmērs kā 52. Tas dod to nedaudz vairāk intuitīvu kas nozīmē, kad uz cilpas vēlāk mēs tad sakām, i ir mazāks nekā klāja izmēru. Tā tikai šķiet labāk nekā pasakot 52. Tagad tas faktiski noteikt problēmu. Tas dod dažus simbolisks nozīmē ar konstanti. Bet tas veida faktiski ieviest citu problēmu kas, iespējams, nav uzreiz skaidrs. Pat ja šis mainīgais ir deklarēta globally-- Vai jūs atceraties, ko tā nozīmē, kad mēs paziņojam mainīgs globāli pret lokāli? Pat ja mēs deklarēt mainīgo globāli, kas notiks, ja tur ir citu funkciju Mūsu komplekts funkciju kas nodarbojas ar karti manipulācijām ka nejauši mainās klāja lielumu, vai tas palielina to ar 1 vai samazinās to ar 1. Tas varētu izskaidrot problēmas, vai ne? It īpaši, ja mums ir darīšana ar komplektu Karšu kur shuffling pilnu klājs ir nepieciešams. Ja klāja lielums ir samazinājies ar 1, piemēram, 51, mēs faktiski nav shuffling visas kārtis iespējams. Mēs esam atstājot vienu no tiem ārā. Un šī vērtība, iespējams, varētu būt paredzams vai ekspluatē sliktu aktieris. C nodrošina to, ko sauc par apstrādātāju direktīva, kas sauc arī makro izveidojot simbolisku konstantes. Un patiesībā, jūs esat jau redzējis Preprocessor direktīvu, pat ja neesat dzirdējuši to sauc ka ar # Ietvert. Tas ir vēl viens piemērs makro vai apstrādātāju direktīva. Veids, kā izveidot simboliskas konstantes, vai sniedzot nosaukumu nemainīga tā, ka tā ir vairāk nozīmē, ir šāds. # define, nosaukums, nomaiņa. Patiešām svarīgi malā šeit tiešām ātri. Nelieciet semikolu at beigas jūsu #defines. Tātad, tas ir # define, nosaukums, nomaiņa. Kad jūsu programma ir sastādīta, kas patiesībā notiek ir kompilators ja notiek iet caur savu kodu un aizstāt katru gadījumu vārdu "nosaukums" ar ko jūs likts kā nomaiņu. Analogi, ja #include ir sava no līdzīga kopējot un ielīmējot, tad # define ir sava veida līdzīgi atrast un aizstāt, ja jūs esat kādreiz izmanto šo funkciju tekstapstrādes programma, piemēram. Tā, piemēram, ja es # define pi kā 3.14159265, ja jūs labāk matemātiski slīpi un jūs pēkšņi skatīt 3.14159265 peld ap jūsu kodu, Jūs droši vien zināt, tas runā par pi. Bet varbūt mēs varam arī tā nedaudz vairāk simboliska nozīme. Un mēs varam, nevis teikt # define pi kā šī kumoss numuru ka es neesmu gatavojas glabāt lasījums vairāk un vairāk. Un kas notiks pēc tam sastādīt laiks ir tad, kad programma ir apkopoti, pirmā lieta, kas notiks tas iet cauri un tas aizstās ikreiz tas redz kapitāla P, kapitāla I, tas būs burtiski aizstāt ar 3.14 un tā tālāk, lai jūs nav rakstīt to katru laiks, kamēr jūsu programma vēl ir funkcionalitāte, kas jums sagaida, ka jūs strādājat ar manipulējot, reizinot, dalot, kāds tas ir ar pi. Jūs esat ne tikai šo aizstāšana tikai numuriem. Piemēram, es varētu # define Protams, kā stīgu CS50. Šajā gadījumā, ja Programma tiek apkopota, # define dosies cauri kods, nomainiet katru reizi tā uzskata "kursu" ar stīgu CS50. Jūs pamanīsiet šeit arī to, ka I bieži # define visa mana noteikts simbolisks konstantes, tā sakot, vienmēr visos cepures. Tas ir konvencija. Tas nav vajadzīgs. Iemesls parasti cilvēki izmantos visi Capitals kad viņi #defining ir tikai, lai tas tiešām skaidrs, ka Tas īpaši manu kodu elements ir noteikta nemainīga. Ja tas bija mazie, tas ir iespējams, ka tas varētu sajaukt ar mainīgo. Un tas ir iespējams, nav laba lieta, ko darīt. Tātad šo konkrēto risinājums ir daudz labāks nekā jebkurā no iepriekšējiem. Ja es pirmais # define klāja izmērs 52, tad tagad mans izmantošana 52 vai klāja izmēru šeit, ir daudz intuitīvāks un daudz drošāku. Jūs nevarat manipulēt konstants. Jūs nevarat teikt, 52 plus plus. Tas nav gatavojas, lai pārvērstu to 53. Jūs nevarat mainīt 52 uz kaut ko. Jūs varat mainīt mainīgo kura vērtība ir 52, kas bija pirmais fix mums bija pirms tam. Un jūs varētu palielināt ka mainīgais līdz 53. Bet jūs nevarat teikt 52 plus plus un ir, ka pēkšņi savukārt 52 uz 53. 52 vienmēr ir 52. Un lai jūs nevar nejauši mainīt klāja izmērs šeit, manipulējot to, Vēl viena laba puse efekts šo, lai gan ir ka tu esi informēts, ka nav visas valstis visā pasaulē izmantot kārtis lieluma 52? Piemēram, tas ir patiešām bieži sastopama Vācija izmantot klāja izmēru 32, kur viņi izsvītro kādu no zemākas vērtības kartēm. Un šajā gadījumā, es gribēju ostā mana suite Funkciju, kas nodarbojas ar card manipulācija uz Vāciju. Es varētu pirmajā instancē mums parādīja, ir iet un aizstāt Visi gadījumi 52 manā kodu ar 32. Bet šeit, ja es # define klājs izmērs kā 32. Tajā pašā augšā uz manu kodu, ja man ir nepieciešams, lai mainītu to, es varu tikai iet un mainīt, ka viena lieta. Recompile manu kodu, un visi pēkšņi tā izplatās cauri. Patiesībā, mēs varam mainīt klāja lielums uz jebkuru vērtību mēs gribam. Vai es tevi interesi par spēle klāja izmēra pikaps? Es esmu Doug Lloyd. Un tas ir CS50.