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