DOUG لويد: كما يمكنك البدء العمل مع وظائف،
شيء آخر سوف تصبح المهم حقا أن نفهم،
وهو مفهوم نطاق متغير.
لذلك النطاق هو سمة من متغير
الذي يعرف من الذي ظائف يمكن الوصول إلى هذا المتغير.
>> هناك نوعان من نطاقات الابتدائية في C، المتغيرات المحلية والمتغيرات العالمية.
الآن، يمكن المتغيرات المحلية فقط يمكن الوصول إليها في وظائف
التي تقوم بإنشائها.
لا يمكن الوصول إليها من قبل كل الآخرين وظيفة موجود في البرنامج،
فقط وظيفة في التي أنشئت من أجلها.
المتغيرات العالمية، على ومن ناحية أخرى، يمكن الوصول إليها
أي وظيفة في البرنامج.
والسبب في ذلك هو لأنهم لم يخلق داخل
أي وظيفة معينة.
نعلن لهم خارج جميع الوظائف، والتي
يعني أن كل وظيفة يعرف أين هو، ويمكن الوصول إلى والتلاعب به.
>> حتى الآن في سياق قمت جميلة الكثير تعمل حصرا
مع المتغيرات المحلية.
وإليك مثال على جدا جدا الوظيفة الرئيسية بسيطة وبسيطة جدا
وظيفة إضافية أننا قد كتبت.
في هذه الحالة، والعاشر، والذي لقد الملونة الأخضر فقط
لتسليط الضوء على محلة أو نطاق هذا المتغير،
غير المحلي إلى وظيفة ثلاثية.
الرئيسية لا يمكن الرجوع إلى x على الإطلاق.
أنها لا تعرف ما هو عليه.
أي وظيفة أخرى، في الواقع، إذا كنا كان ظائف إضافية هنا،
يمكن أن تشير إلى x.
>> وبالمثل، ينتج التي لدي اللون الأزرق، غير المحلية فقط لالرئيسي.
فقط الرئيسي يعلم ما نتيجة المتغير.
لا يمكن الثلاثي استخدامها.
>> الآن كما ذكرت، المتغيرات العالمية موجودة.
إذا قمت بتعريف هذا المتغير خارج أي وظيفة،
كل وظائف في يمكن برنامج الرجوع إليه.
حتى في هذه الحالة لقد أبرزت في الأخضر إعلان متغير عمومي.
في هذه الحالة، متغير كائن أعلن
ودعا العالمية، لمجرد أن أن تكون واضحة للغاية حول هذا الموضوع.
هو من النوع المصقول.
وأنا تعيينه قيمة 0.5050.
>> ستلاحظ أنه في الرئيسية وفي ثلاث مرات، وأنا قادرة على الرجوع إلى العالمية.
وفي الواقع، إذا ذهبت من خلال برنامج كما هو مبين، الأولى دعوات الرئيسية ثلاثة أضعاف،
تتكاثر ثلاثية العالمية بنسبة 3، التي يحدد قيمته إلى 1.5 شيئا،
1.51 أو شيء من هذا القبيل، و ثم الرئيسية يطبع أيضا قيمة
من العالمية.
الرئيسية لذلك لن تطبع 0.5050 عليه، سوف تطبع مرات العالمية 3، 1.51.
لذلك عليك أن تكون حذرا عند كنت تعمل مع المتغيرات العالمية.
في حين انهم مرنة جدا في أن تكون قادرة على تمرير المعلومات
حول بحيث كل وظيفة يمكن استخدامها،
كما أنه يمكن أن يكون بعض عواقب وخيمة
إذا كانت التغييرات وظيفة واحدة قيمة متغير
قبل أن نتوقع أن تغييرها.
>> ماذا يهم هذا التمييز؟
لماذا نهتم إذا كانت بعض المتغيرات تكون محلية والبعض الآخر العالمي؟
حسنا، بالنسبة للجزء الاكبر، والمتغيرات المحلية في C هي ما يسمى مرت من حيث القيمة
عندما نجعل استدعاء دالة.
ماذا يعني ذلك؟
>> حسنا، عندما يتم تمرير متغير من حيث القيمة، المستدعى، والذي
هي طريقة أخرى للقول وظيفة الذي يتلقى متغير
يحصل مرت في كمدخل، فإنه في الواقع لا تتلقى هذا المتغير نفسه.
ويستقبل تلقاء نفسها نسخة منه للعمل مع.
هذا هو تمييز مهم حقا.
رأينا فقط منذ الثانية أنه مع المتغيرات العالمية،
إذا كان لنا أن التلاعب العالمية متغير في وظيفة واحدة، وأثر
في تلك الوظيفة واحدة تحمل حتى كل وظيفة أخرى.
>> ولكن مع المتغيرات المحلية، هذا ليس صحيحا.
كل وظيفة عندما يتلقى المتغيرات كمدخل
الحصول على نسخ من هذه المتغيرات، لا متغيرات أنفسهم.
فما هي الآثار الجانبية لذلك؟
وهذا يعني أن المتغير في المتصل، الدالة التي
هو جعل استدعاء دالة، هي دون تغيير إلا إذا تجاوز ذلك.
>> على سبيل المثال، في هذه المدونة لم يتم تغيير فو على الإطلاق.
الباحث فو يساوي 4، استدعاء ثلاثة أضعاف الحداء، داخل ثلاثة أضعاف،
كنا نتوقع من شأنه أن فو أن تضاعفت 3 مرات وعاد،
ولكن هناك في الواقع أي تأثير.
>> على الرغم من هنا، فرق دقيق جدا.
هذا لا يكون له تأثير نريد.
هل ترى لماذا؟
نحن تجاوز فو في الرئيسي هذه المرة.
>> لذلك فو كثافة العمليات يساوي 4، يساوي فو فو الثلاثي، عندما نجعل تلك الدعوة،
الثلاثي يحصل على نسخته الحداء، نسخته 4.
تقول العودة 4 مرات 3، أو أيا كان يحصل تمرير متغير في 3 مرات.
ثم نعلق عودة قيمة ثلاثة أضعاف لفو مرة أخرى.
لذلك هذا الواقع من شأنه أن الكتابة فو.
هذه هي الطريقة الوحيدة للقيام هذا مع المتغير المحلي.
حتى الآن إذا أضفنا أخرى سطر من التعليمات البرمجية هنا
في نهاية الرئيسي ل طباعة قيمة فو،
انها في الواقع طباعة 12.
>> نطاق المتغير بشكل عام ليس كثيرا من مشكلة
إذا قمت بتسمية كل الخاص بك المتغيرات أشياء مختلفة.
لكن يمكن الحصول على نوع من مقرفة إذا كان يحمل نفس الاسم متغير
يظهر في وظائف متعددة، الذي سيحدث الكثير.
إذا كنت من أي وقت مضى نعمل في العالم الحقيقي حيث
كنت تعمل على التعاونية برامج والناس في فرق مختلفة
نعمل معا لكتابة نفسه البرنامج أو نفس مجموعة من البرامج،
في كثير من الأحيان أنها سوف إعادة متغير أسماء، ولا سيما تلك الشائعة
مثل س، ص، ط، ي، وهلم جرا.
>> ولكن عندما المتغيرات و نفس الاسم، وقضايا نطاق
يمكن الحصول على القليل من اصعب إلى تحليل.
على سبيل المثال، هل تعرف ما يمكن طباعتها
في نهاية هذا البرنامج بالذات؟
خذ دقيقة.
إيقاف الفيديو وقراءة من خلال هذا البرنامج.
تستطيع أن ترى في أننا أعلى الصفحة يكون إعلان وظيفة
لدالة تسمى الزيادة.
أن الدالة تأخذ واحدة المعلمة عددا صحيحا التي نسميها س.
وإخراج عدد صحيح.
هذا هو نوع الإرجاع في البداية.
>> ثم لدينا الرئيسي، وزوجين من الخطوط من التعليمات البرمجية في الرئيسية، وآخرها تلك التي
هو بيان الطباعة.
وتذكر، وهذا هو السؤال هنا.
ما هو في الواقع سيكون طبع في نهاية هذه الوظيفة؟
ومن ثم لدينا في الواقع تعريف الزيادة أدناه.
>> حتى تأخذ دقيقة واحدة، خطوة عن طريق رمز، تتبع الامور.
هل تعرف ما سيتم طباعتها في نهاية هذا البرنامج بالذات؟
>> حسنا.
نأمل، كنت قد اتخذت بضع ثوان في محاولة لتحليل هذا واحد.
دعونا نفعل ذلك معا.
>> حتى لقد عبرت من الزيادة في الإعلان في الجزء العلوي هناك.
كان نوع من الهاء.
انها ليست المتغير الخاص بها.
لم يكن لديك نطاقه الخاص.
انها مجرد وظيفة الإعلان، وذلك لأغراض
في محاولة لتحليل ما هو يحدث في هذا البرنامج،
نحن قد كذلك مجرد تجنب ذلك.
>> الآن لدينا في هذه الحالة، سبب هذه المشكلة هو صعب
ولأن لدينا المتغيرات المحلية في على حد سواء الرئيسية وزيادة، كل واحدة منها
ويسمى س.
وبالطبع فإن جوهر هذه القضية هو تحاول suss خارج التي يحصل تغيير س
وكيف يمكن الحصول على تغييره.
حتى لقد الملونة كل حالة من الحالات من العاشر هذا المحلية إلى الأحمر الرئيسي.
ولقد الملونة كل مثيل س هذا المحليين لزيادة الأزرق.
>> لاحظ في هذا الخط الثالث من الرئيسي، ص يساوي الزيادة
س، هذه الزيادة لا يجري مرت س الرئيسي، أو علامة X الحمراء.
يزداد مرت على نسخة منه.
وانه سيكون فقط للعمل مع أن نسخة منه، س الأزرق.
إذا كنت رياضيا ميلا، وكنت قد
قد يعتقد بدلا من ذلك على س الفرعية م للالرئيسي والفرعي س ط للزيادة.
ولكن انها نفس الفكرة.
س الفرعية م، أو الأحمر س في الشريحة السابقة،
هي المتغيرات التي local-- هو مثيل س بدلا من أن
غير المحلي إلى الرئيسية، والأشعة دون ط، أو المتغيرات الزرقاء في الشريحة السابقة،
هي حالات السينية التي تكون محلية لزيادة.
>> لذلك، هل كنت قادرا على معرفة ما هذه الوظيفة المطبوعة في نهاية المطاف؟
أنا دوغ ويد، وهذا هو CS50.