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です。