DOUG LLOYD：あなたが開始すると 機能と協力して、
別のものになっしようとしています 理解することは非常に重要、
どの変数のスコープの概念です。
だから、スコープがあります 変数の特徴
それが機能するから定義します その変数にアクセスすることができます。
>> C言語で二つの主要なスコープがありますが、 ローカル変数とグローバル変数。
さて、ローカル変数はできるだけ 関数内でアクセスされます
ここでそれらが作成されています。
これらは、他のすべてのアクセスできません あなたのプログラムに存在する機能、
でのみ機能 それが作成されました。
上のグローバル変数、 一方、アクセスすることができます
プログラムの任意の機能による。
そして、その理由は、 彼らは内部に作成されていないため、
いずれかの特定の機能の。
私たちは外でそれらを宣言 機能のすべてが
すべての機能がどこに知っていることを意味し それがあり、それにアクセスして操作することができます。
>> これまでのコースで、あなたはかなりしました 多くの排他的に取り組んでき
ローカル変数と。
ここでは非常に、非常にの例を示します。 シンプル主な機能と非常に簡単な
私たちが書いている追加機能。
この場合、xはその 私は緑色ました
局所性を強調表示したり、 その変数のスコープ、
トリプル関数に対してローカルです。
主は、すべてのXを参照することはできません。
それはそれが何であるかを知りません。
なし機能は、実際には、我々の場合 ここで追加機能を持っていました、
xに参照することができます。
>> 同様に、私はきた結果 青色、本体のみに対してローカルです。
本体のみでは何を知っています 変数の結果です。
トリプルはそれを使用することはできません。
>> 今私が述べたように、 グローバル変数が存在します。
あなたはその変数を宣言すると 任意の関数の外に、
内のすべての機能 プログラムは、それを参照することができます。
したがって、この場合、私はで強調表示されました 緑のグローバル変数の宣言。
この場合、 変数が宣言されています
ちょうどに、グローバルと呼ばれています それについて非常に明確です。
これは、float型のものです。
そして、私はそれ値0.5050割り当てます。
>> あなたは主にとのそれに気付くでしょう トリプル、私は世界的に参照することができるしています。
そして実際に、私はプログラムを介して行けば トリプルとして示し、メイン1コール、
3によりグローバルトリプル乗算、どの 1.5何かにその値を設定し、
1.51またはそのような何か、と その後、主はまた、値を出力します
グローバルの。
0.5050を印刷しないように主は、それを グローバル3倍、1.51を出力します。
だから、ときに注意が必要になってきました あなたはグローバル変数で作業しています。
彼らは非常に柔軟でいる間 情報を渡すことができること
周りのすべてのように 関数は、それを使用することができ、
それはまた、いくつかを持つことができ 危険な結果
一つの機能が変更された場合 変数値
あなたはそれが変更されることを期待する前に。
>> なぜ、この区別は重要ですか？
なぜ我々はいくつかの変数かどうかを気にしません ローカルであり、他はグローバルで？
まあ、ほとんどの部分は、ローカル変数 C言語で値渡しと呼ばれるものです
我々は、関数呼び出しを行うとき。
どういう意味ですか？
>> まあ、変数が渡されたとき 価値によって、呼び出し先は、どの
関数を別の言い方であります その変数を受信して​​いること
それは実際に、入力として渡されます その変数自体を受信しません。
それ自身を受け取ります で動作するようにそのコピー。
これは本当に重要な違いです。
私達はちょうど秒前見ました グローバル変数とのこと、
私たちは、グローバルを操作する場合 一つの関数内の変数、効果
その中で一つの機能を搭載します 他のすべての機能に至ります。
>> しかし、ローカル変数と、 それは本当ではありません。
各関数ときに、それを 入力として変数を受け取ります
これらの変数のコピーを受け取り、 れていない変数そのもの。
だからの副作用は何ですか？
それはつまり、変数に 呼び出し元、関数
関数呼び出しを行うことです あなたはそれを上書きしない限り変わりません。
>> たとえば、次のコードで fooがまったく変更されません。
int型のfooは4に等しく、トリプル呼び出し FOOの、トリプルの内側に、
我々はそのfooが期待されるだろう 3を掛けたと返され、
しかし、実際には効果がありません。
>> ここでは、しかし、非常に微妙な違い。
これは、私たちが望む効果を持っています。
あなたはなぜ見ていますか？
私たちは、主に今回のfooをオーバーライドしています。
>> だからint型fooが4は、fooが等しい等しく トリプルFOO、我々はその呼び出しを行うと、
トリプル自身のコピーを取得します FOOの、4の独自のコピー。
これは、4回3を返すと言い、または何でも 変数が3倍に渡されます。
そして、我々はリターンを割り当てます 再びfooにトリプルの値。
だから、これは実際にはFOOを上書きします。
これが行う唯一の方法であります ローカル変数を使用してこの。
だから今、私たちは別のものを追加した場合 ここでのコードの行
メインの終わりに 、fooの値をプリントアウト
それは実際には12をプリントアウトであろう。
>> 変数のスコープは、一般的です 問題のあまりありません
あなたのすべてに名前を付ける場合 変数の異なるものを。
しかし、それは厄介なのようなものを得ることができます 同じ変数名の場合
複数の機能で表示され、 これは何回も実行されます。
あなたは今までで動作しない場合 現実の世界場所
あなたは、共同で作業しています 異なるチームでのプログラムや人々
同じことを書くために協力しています プログラムまたはプログラムの同じセット、
彼らは頻繁に変数を再利用します 名前、特に一般的なもの
ように、X、Y、I、J、などが挙げられます。
>> しかし、変数がある場合 同じ名前、スコープの問題
解析には少しトリッキーを得ることができます。
たとえば、あなたが知っています 何がプリントアウトされます
この特定のプログラムの最後に？
分を取ります。
ビデオを一時停止し、読ん このプログラムを通じて。
あなたは、一番上の私たちに見ることができます 関数宣言を持っています
インクリメントと呼ばれる機能のため。
この関数は、単一かかります パラメータ、我々は、xを呼び出し整数。
そして、それは整数を出力します。
それが先頭に戻り値の型です。
>> その後、我々は、行のカップルを持っている主な そのうちの最後の、メインのコードの
print文です。
そして、それがここで質問です、覚えておいてください。
何が実際にあることを行っています この関数の最後に印刷されましたか？
そして、我々は実際に持っています 以下の増分の定義。
>> だから、時間がかかるステップスルー コー​​ドは、物事をトレースします。
あなたがで印刷されるかを知っていますか この特定のプログラムの終わり？
>> 大丈夫。
うまくいけば、あなたは数秒を撮影しました この1つを試してみて、解析します。
それでは、一緒にそれをやってみましょう。
>> だから私は、増分のうち交差しました そこに上部の宣言。
それは気晴らしのようなものでした。
これは、独自の変数ではありません。
これは、独自のスコープを持っていません。
それはちょうど機能です 目的のためにそう宣言、
何構文解析しようとしているの このプログラムで起こって、
我々としてもそれを回避する可能性があります。
>> 今、私たちは、この場合には持っています この問題はトリッキーである理由
我々は内のローカル変数を持っているので、 メインと増分、それらの各々の両方
Xと呼ばれています。
そしてもちろん、この問題の核心は、 xが変更されますどのアウトSUSSしようとしています
そして、それはどのように変更を取得しません。
だから私はすべてのインスタンスを着色しました それがメイン赤にローカルのxの。
そして、私はすべてのインスタンスの着色しました Xそれは青インクリメントするローカルです。
>> その3行目のお知らせ メインの、yは増分に等しいです
X、その増分はされていません メインのx、または赤色のxを可決しました。
それは、そのコピーを渡さなっています。
そして、それだけで動作するように起こっています それのコピー、青のx。
あなたは数学的にしている場合 傾斜、あなたがかもしれません
代わりにXサブとしてこれについて考えています 増分のためのメインとサブのx iに対するメートル。
しかし、それは同じ考えです。
Xサブメートル、またはXの赤 前のスライドで、
local--された変数があります そのむしろxのインスタンスです
主にローカルであり、xサブI、または 前のスライドで青変数、
そのxのインスタンスがあります 増分に対してローカルです。
>> だから、あなたは何を把握することができました この関数は、最後に印刷されましたか？
私はダグロイドだが、これはCS50です。