1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 DOUG 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 これは、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 そして実際に、私はプログラムを介して行けば トリプルとして示し、メイン1コール、 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 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 この関数は、単一かかります パラメータ、我々は、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 うまくいけば、あなたは数秒を撮影しました この1つを試してみて、解析します。 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が変更されますどのアウト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 >> その3行目のお知らせ メインの、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サブとしてこれについて考えています 増分のためのメインとサブのx iに対するメートル。 138 00:07:14,230 --> 00:07:15,700 しかし、それは同じ考えです。 139 00:07:15,700 --> 00:07:18,999 Xサブメートル、または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