1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 道格·勞埃德:當你開始 使用函數, 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 這是float類型。 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 >> 那麼,當一個變量傳遞 按價值計算,被叫方,這 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 詮釋FOO等於4,請致電三 FOO的,三重裡面, 73 00:03:55,450 --> 00:03:58,850 我們可以預料,富會 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,當我們打這通電話, 80 00:04:16,899 --> 00:04:21,680 三重獲得自己的副本 中富,其自身的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 這個函數只有一個 參數,一個整數,我們稱之為的X. 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 是一個print語句。 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 當然,這個問題的關鍵是 試圖蘇斯哪些x被改變 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,該增量是不是被 通過主要的X,或紅色的X。 134 00:07:00,800 --> 00:07:03,320 它獲得通過它的一個副本。 135 00:07:03,320 --> 00:07:06,987 而且它一定會一起工作 它的副本,藍色的X. 136 00:07:06,987 --> 00:07:08,820 如果你數學 斜,你可能 137 00:07:08,820 --> 00:07:14,230 已經不是想到了這一點為x分 M代表主×副我為增量。 138 00:07:14,230 --> 00:07:15,700 但它同樣的想法。 139 00:07:15,700 --> 00:07:18,999 ×副m或紅色X的 在上一張幻燈片, 140 00:07:18,999 --> 00:07:21,790 是是local--變量 為x寧可實例 141 00:07:21,790 --> 00:07:26,900 是本地的主,並且x子i或所述 藍色的變量上一張幻燈片, 142 00:07:26,900 --> 00:07:30,760 是x的實例中的 本地遞增。 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