1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 Даг LLOYD: Како да започнете работа со функции, 3 00:00:07,300 --> 00:00:09,966 Друга работа е што се случува да стане навистина важно да се разбере, 4 00:00:09,966 --> 00:00:12,380 кој е концептот на опсег на променливите. 5 00:00:12,380 --> 00:00:14,490 Така опсегот е карактеристика на променлива 6 00:00:14,490 --> 00:00:18,860 со кој се дефинираат од кои функции таа променлива може да се пристапи. 7 00:00:18,860 --> 00:00:24,595 >> Постојат две основни домет во C, локални променливи и глобални променливи. 8 00:00:24,595 --> 00:00:27,830 Само сега, локални променливи можат да се пристапи во рамките на функциите 9 00:00:27,830 --> 00:00:29,045 во која тие се создадени. 10 00:00:29,045 --> 00:00:32,170 Тие не може да се пристапи од страна на сите други функција која постои во вашата програма, 11 00:00:32,170 --> 00:00:34,184 само функцијата во каде што е снимена. 12 00:00:34,184 --> 00:00:36,350 Глобални променливи, на Од друга страна, може да се пристапи 13 00:00:36,350 --> 00:00:37,719 од која било функција во програмата. 14 00:00:37,719 --> 00:00:40,260 А причина за тоа е затоа што не си се создава во 15 00:00:40,260 --> 00:00:41,441 од која било поединечна функција. 16 00:00:41,441 --> 00:00:43,690 Ние ги декларираат надвор од сите функции, кои 17 00:00:43,690 --> 00:00:48,940 значи дека секоја функција знае каде е тоа и да пристапите и да го манипулираат. 18 00:00:48,940 --> 00:00:52,010 >> Досега во текот сте прилично многу работи исклучиво 19 00:00:52,010 --> 00:00:54,280 со локални променливи. 20 00:00:54,280 --> 00:00:58,320 Еве еден пример на многу, многу едноставна главната функција и многу едноставна 21 00:00:58,320 --> 00:01:00,680 дополнителна функција која сум напишал. 22 00:01:00,680 --> 00:01:03,180 Во овој случај, X, којшто Јас сум само обоена со зелена боја 23 00:01:03,180 --> 00:01:07,400 да се потенцира на локалитетот или опфатот на таа променлива, 24 00:01:07,400 --> 00:01:09,240 е локално до тројна функција. 25 00:01:09,240 --> 00:01:12,300 Главната не може да се однесуваат на x на сите. 26 00:01:12,300 --> 00:01:14,259 Што не знае што е тоа. 27 00:01:14,259 --> 00:01:17,050 Нема друга функција, всушност, ако ние имаше дополнителни функции во тука, 28 00:01:17,050 --> 00:01:19,360 би можеле да се однесуваат на x. 29 00:01:19,360 --> 00:01:23,520 >> Слично на тоа, резултатите што сум сина боја, е локалната само на главните. 30 00:01:23,520 --> 00:01:26,980 Само главните знае што Резултатот е променлива. 31 00:01:26,980 --> 00:01:30,010 трокреветни не можат да го користат. 32 00:01:30,010 --> 00:01:32,580 >> Сега како што споменав, глобални променливи постојат. 33 00:01:32,580 --> 00:01:35,575 Ако се изјасни дека променливата надвор од било која функција, 34 00:01:35,575 --> 00:01:38,290 сите функции во Програмата може да се однесува на него. 35 00:01:38,290 --> 00:01:44,010 Значи во овој случај јас сум нагласени во зелени глобалната променлива декларација. 36 00:01:44,010 --> 00:01:45,830 Во овој случај, променлива да се прогласат 37 00:01:45,830 --> 00:01:48,720 се нарекува глобален, само за да биде исклучително јасни околу тоа. 38 00:01:48,720 --> 00:01:49,720 Тоа е од типот плови. 39 00:01:49,720 --> 00:01:52,940 И јас тоа го доделите вредност 0,5050. 40 00:01:52,940 --> 00:01:58,080 >> Ќе забележите дека во главната и во трокреветни, јас сум во можност да се однесуваат на глобални. 41 00:01:58,080 --> 00:02:03,480 И всушност, ако одам преку програмата како што е наведено, главната првите повици трокреветни, 42 00:02:03,480 --> 00:02:10,440 трокреветни множи глобална страна 3, кој поставува неговата вредност на 1,5-нешто, 43 00:02:10,440 --> 00:02:16,080 1,51 или нешто слично, и а потоа, исто така, главната отпечатоци од вредност 44 00:02:16,080 --> 00:02:16,620 на глобални. 45 00:02:16,620 --> 00:02:24,424 Значи главната нема да печати од 0,5050 тоа, ќе печати од глобалната пати 3, 1.51. 46 00:02:24,424 --> 00:02:27,340 Па имаш да се биде внимателен кога си работат со глобални променливи. 47 00:02:27,340 --> 00:02:30,260 Додека тие се многу флексибилни во да се биде во можност да помине информации 48 00:02:30,260 --> 00:02:32,650 околу, така што секој Функцијата може да го користат, 49 00:02:32,650 --> 00:02:34,580 Таа, исто така може да има некои опасни последици 50 00:02:34,580 --> 00:02:38,770 ако промените една функција на вредноста на променлива 51 00:02:38,770 --> 00:02:42,360 пред да се очекува тоа да се промени. 52 00:02:42,360 --> 00:02:44,200 >> Зошто оваа разлика е важно? 53 00:02:44,200 --> 00:02:48,070 Зошто ни е грижа дали некои променливи се локални и други се глобални? 54 00:02:48,070 --> 00:02:53,880 Па, во најголем дел, локални променливи во C се она што се нарекува усвоен од вредност 55 00:02:53,880 --> 00:02:56,087 кога ќе го направи повик на функција. 56 00:02:56,087 --> 00:02:56,920 Што значи тоа? 57 00:02:56,920 --> 00:03:00,880 >> Па, кога променлива е предадена од вредност, callee, која 58 00:03:00,880 --> 00:03:04,350 е уште еден начин да се каже на функцијата дека е приемот на променлива која 59 00:03:04,350 --> 00:03:08,465 ќе поминуваат во како влог, тоа всушност не добива дека самата променлива. 60 00:03:08,465 --> 00:03:12,490 Тоа добива свој копија од него да се работи со. 61 00:03:12,490 --> 00:03:14,350 Ова е навистина важна разлика. 62 00:03:14,350 --> 00:03:18,250 Ние само видов пред една секунда дека со глобални променливи, 63 00:03:18,250 --> 00:03:23,240 ако се манипулира со глобалната променлива во една функција, ефектот 64 00:03:23,240 --> 00:03:26,390 со тоа, што една функција носи во текот на секоја друга функција. 65 00:03:26,390 --> 00:03:28,920 >> Но со локални променливи, тоа не е точно. 66 00:03:28,920 --> 00:03:32,060 Секоја функција, кога станува добива варијабли како влез 67 00:03:32,060 --> 00:03:36,367 добијат копии од овие променливи, не самите променливи. 68 00:03:36,367 --> 00:03:37,825 Значи она што е пропратен ефект на тоа? 69 00:03:37,825 --> 00:03:40,450 Тоа значи дека на променливата во повикувачот, функцијата која 70 00:03:40,450 --> 00:03:45,600 е правење на повик на функција, е непроменети, освен ако не се вратиш назад. 71 00:03:45,600 --> 00:03:50,420 >> На пример, во овој код foo не се променети. 72 00:03:50,420 --> 00:03:55,450 Int foo е еднакво на 4, јавете се трокреветни на foo, во внатрешноста на трокреветни, 73 00:03:55,450 --> 00:03:58,850 што би се очекувало дека би foo се множи со 3 и се врати, 74 00:03:58,850 --> 00:04:01,450 но има всушност нема никаков ефект. 75 00:04:01,450 --> 00:04:03,460 >> Тука, секако, многу суптилна разлика. 76 00:04:03,460 --> 00:04:06,520 Ова има ефект во смисла што го сакаме. 77 00:04:06,520 --> 00:04:07,730 Гледате ли зошто? 78 00:04:07,730 --> 00:04:11,500 Ние сме исклучително важни foo во главната тоа време. 79 00:04:11,500 --> 00:04:16,899 >> Па int foo е еднакво на 4, foo е еднаква трокреветни foo, кога ќе го направи тој повик, 80 00:04:16,899 --> 00:04:21,680 трокреветни добива свој примерок на foo, свој примерок од 4. 81 00:04:21,680 --> 00:04:27,340 Таа вели дека се вратат 4 пати 3, или што променлива ќе поминуваат во 3 пати. 82 00:04:27,340 --> 00:04:32,109 А потоа ние му ја додели на враќање вредноста на тројно да foo повторно. 83 00:04:32,109 --> 00:04:33,650 Така што ова, всушност, ќе се пребрише foo. 84 00:04:33,650 --> 00:04:35,816 Ова е единствениот начин да се направи ова со локална променлива. 85 00:04:35,816 --> 00:04:38,120 Па сега ако се додаде уште еден линија код овде 86 00:04:38,120 --> 00:04:40,870 на крајот на главна за да се печати вредноста на foo, 87 00:04:40,870 --> 00:04:45,030 тоа всушност ќе се печати од 12. 88 00:04:45,030 --> 00:04:48,600 >> Опсег на променливите е генерално не е премногу голем дел од проблемот 89 00:04:48,600 --> 00:04:51,190 Ако го внесете името на сите ваши променливи различни нешта. 90 00:04:51,190 --> 00:04:54,920 Но, тоа може да се добие вид на непријатни ако истата променлива име 91 00:04:54,920 --> 00:04:58,820 се појавува во повеќе функции, што ќе се случи многу. 92 00:04:58,820 --> 00:05:02,130 Ако некогаш сте се работи во реалниот свет каде 93 00:05:02,130 --> 00:05:06,080 ќе се работи на соработка програми и луѓе во различни тимови 94 00:05:06,080 --> 00:05:11,000 работат заедно за да пишуваат на истиот програма или на истиот сет на програми, 95 00:05:11,000 --> 00:05:13,900 тие често ќе повторна употреба променлива имиња, особено заеднички оние 96 00:05:13,900 --> 00:05:18,020 како и x, y, I, J, и така натаму. 97 00:05:18,020 --> 00:05:20,370 >> Но, кога променливите имаат со истото име, прашањата опсегот 98 00:05:20,370 --> 00:05:23,080 може да се добие малку сложени да ја формира за да се интерпретира. 99 00:05:23,080 --> 00:05:26,790 На пример, дали знаете што ќе бидат отпечатени 100 00:05:26,790 --> 00:05:30,190 на крајот на оваа конкретна програма? 101 00:05:30,190 --> 00:05:31,280 Земете една минута. 102 00:05:31,280 --> 00:05:33,382 Паузирате видеото и прочитајте преку оваа програма. 103 00:05:33,382 --> 00:05:35,590 Можете да го видите на врвот ние имаат декларација функција 104 00:05:35,590 --> 00:05:37,350 за функција наречена прираст. 105 00:05:37,350 --> 00:05:40,800 Таа функција трае една параметар, цел број кој ние го нарекуваме х. 106 00:05:40,800 --> 00:05:42,610 И тоа излези цел број. 107 00:05:42,610 --> 00:05:44,820 Тоа е тип враќање на почетокот. 108 00:05:44,820 --> 00:05:48,140 >> Тогаш имаме главната, неколку редови код во главниот, последниот на кој 109 00:05:48,140 --> 00:05:49,250 е изјава за печатење. 110 00:05:49,250 --> 00:05:51,140 И се сеќавам, тоа е прашањето овде. 111 00:05:51,140 --> 00:05:54,240 Она што навистина се случува да биде печатени на крајот на оваа функција? 112 00:05:54,240 --> 00:05:58,110 И тогаш, всушност имаме дефиниција на прираст подолу. 113 00:05:58,110 --> 00:06:01,760 >> Па се земе една минута, чекор по чекор кодот, се трага работи надвор. 114 00:06:01,760 --> 00:06:08,100 Дали знаете што ќе се печатат во На крајот на оваа конкретна програма? 115 00:06:08,100 --> 00:06:08,600 >> Во ред. 116 00:06:08,600 --> 00:06:11,433 Се надевам, дека сте ги направиле неколку секунди за да се обиде и да се интерпретира ова едно. 117 00:06:11,433 --> 00:06:13,370 Да го сториме тоа заедно. 118 00:06:13,370 --> 00:06:16,022 >> Па јас прецртан прираст е изјава на врвот таму. 119 00:06:16,022 --> 00:06:17,230 Тоа беше вид на забава. 120 00:06:17,230 --> 00:06:18,570 Тоа не е свој променлива. 121 00:06:18,570 --> 00:06:19,879 Тоа не има свој делокруг. 122 00:06:19,879 --> 00:06:21,920 Тоа е само една функција декларација, па заради 123 00:06:21,920 --> 00:06:24,330 се обидува да го анализирам дознаете што има случува во оваа програма, 124 00:06:24,330 --> 00:06:26,660 ние, како може само да го избегнат. 125 00:06:26,660 --> 00:06:29,560 >> Сега имаме во овој случај, причината на овој проблем е незгодно 126 00:06:29,560 --> 00:06:34,030 е затоа што имаме локални променливи во двете главни и зголемување, од кои секоја 127 00:06:34,030 --> 00:06:35,090 е наречен x. 128 00:06:35,090 --> 00:06:39,830 И, се разбира суштината на ова прашање е обидувајќи се да дознаете кои suss х се пресоблекува 129 00:06:39,830 --> 00:06:41,890 и како тоа да се промени. 130 00:06:41,890 --> 00:06:46,900 Па јас обоени секоја инстанца на x тоа е локално до главна црвено. 131 00:06:46,900 --> 00:06:52,040 И јас сум обоени секој случај на x тоа е локален за зголемување сина. 132 00:06:52,040 --> 00:06:55,220 >> Известувањето во таа трета линија на главни, y еднаква прираст 133 00:06:55,220 --> 00:07:00,800 x, дека прираст не е да се биде донесен главната х, или црвениот х. 134 00:07:00,800 --> 00:07:03,320 Тоа е добивање донесе копија од него. 135 00:07:03,320 --> 00:07:06,987 А тоа е само ќе да се работи со дека копија од него, сини х. 136 00:07:06,987 --> 00:07:08,820 Ако сте математички наклонети, можеби ќе 137 00:07:08,820 --> 00:07:14,230 наместо да се помисли на тоа како x под метри од главната и х под i за зголемување. 138 00:07:14,230 --> 00:07:15,700 Но, тоа е истата идеја. 139 00:07:15,700 --> 00:07:18,999 x под м, или црвено Х во претходниот слајд, 140 00:07:18,999 --> 00:07:21,790 се променливи кои се local-- е пример на x, а дека 141 00:07:21,790 --> 00:07:26,900 е локално до главна, а х под I, или сини променливи во претходниот слајд, 142 00:07:26,900 --> 00:07:30,760 се случаи на х дека се локални прираст. 143 00:07:30,760 --> 00:07:36,220 >> Значи, сте биле во можност да дознаам што оваа функција печатени на крајот? 144 00:07:36,220 --> 00:07:39,420 Јас сум Даг Лојд, и ова е CS50. 145 00:07:39,420 --> 00:07:41,542