>> [موسیقی]
داگ لوید: بسیار خوب.
نوع یک موضوع عجیب و غریب، درست است؟
اعداد سحر و جادو.
چه DOE منظور او وقتی که او صحبت کردن در مورد اعداد سحر و جادو؟
خب، برخی از برنامه های که ما در CS50 نوشته ام
تا کنون برخی عجیب و غریب داشته اند تعداد نوع آنها در پرتاب می شود.
شاید به دلایل ما نمی در حال حاضر به طور کامل درک کنید.
برای مثال، در مشکل ماریو، ما ارتفاع این هرم در 23 رساند.
ما به صراحت گفت: نمی توانید به بالاتر از 23.
>> اما چه 23 چیست؟
خوب، اگر شما خواندن تنظیمات دقت، شما
ممکن است دیده می شود که دلیل ما آن را در 23 پوش
این دلیل است که ارتفاع استاندارد از یک پنجره ترمینال 24 است.
و به این ترتیب اگر ما هرم بلندتر از آن است،
آن ممکن است این چیز عجیب و غریب انجام که در آن اجرا می شود روی صفحه نمایش.
و شما می دانید، چه که به معنای در زمینه، درست است؟
>> آیا معنای 23 بلافاصله آشکار به کسی که در برنامه های خود را به نظر می رسد
و شاید یک مختلف اندازه پنجره ترمینال؟
احتمالا نه.
آن را مانند به نظر می رسد، OK.
خب، چرا، این فقط کمتر از 23 است؟
به طور کلی، این نوع از یک عادت بد در واقع
به ثابت را به کد خود را.
در انجام این کار، هنگامی که شما در واقع انجام ارسال یک ثابت را به کد خود را،
آن را گاهی اوقات به عنوان مراجعه کننده با استفاده از اعداد سحر و جادو، چیزی است که
ما به طور کلی می خواهم به تلاش و جلوگیری از.
>> به عنوان مثال، اجازه دهید یک نگاه در این تابع ساده است.
بدیهی است هیچ اطلاعات وجود دارد نوع در C به نام کارت یا عرشه.
پس فقط با من داشته باشد.
این یک کمی از این شبه مخلوط در اینجا.
این یک تابع به نام است مقابله کارت که ظاهرا
طول می کشد یک طبقه را به عنوان پارامتر، و خروجی به من یک کارت تک.
>> و من انجام کاری که در آن من در اینجا یک حلقه است که 0-52 اجرا می شود،
و من برخورد یک کارت.
خب، ما سحر و جادو کردم تعداد در اینجا، درست است.
آیا میدانید چه تعداد سحر و جادو است.
و یا مهمتر از آن، شما انجام ببینید که چه مشکل این است که اینجا هستید؟
به خصوص اگر این فقط یک تابع است
در فایل خود را در یک پوشه ای که حاوی
یک دسته از مختلف فایل های، که هر کدام
می کند چیز دیگری که به یک دسته کارت.
شاید آن را شافل، و یا معاملات دست از پنج کارت به جای یک کارت تک.
>> آیا شما آنچه را ببینید مشکل در اینجا می تواند؟
هنوز تعداد سحر و جادو شما را ببینید من را به کد تزریق کرده اید؟
آن را 52، درست است.
>> مانند، به طور مستقیم شما احتمالا می دانید، OK.
مانند عرشه استاندارد از کارت شامل 52 کارت است.
اما در برنامه های ما، آن را فقط نوع شناور در اطراف وجود دارد.
آن را مانند همه ناگهانی یک 52 وجود دارد.
>> یکی از راه های حل این مشکل این است که برای انجام این کار.
ما بسیار به صراحت در حال حاضر فریاد اندازه عرشه 52.
آن را می دهد و آن را بصری کمی بیشتر به این معنی که در حلقه for
بعد از ما پس از آن می گویند، من کمتر از اندازه عرشه است.
این فقط به نظر می رسد بهتر از گفتن 52.
در حال حاضر این کار در واقع مشکل را حل.
آن را به برخی از نمادین به این معنی که به ثابت است.
اما آن را در واقع نوعی از معرفی یکی دیگر از مشکل
که ممکن است بلافاصله آشکار.
حتی اگر این متغیر اعلام globally--
آیا شما آنچه در آن یاد یعنی زمانی که ما اعلام می کنیم
یک متغیر در سطح جهانی در مقابل محلی؟
حتی اگر ما یک متغیر در سطح جهانی، اگر وجود دارد
تابع دیگر در مجموعه ما را از توابع
که در برخورد با دستکاری کارت که سهوا تغییر اندازه عرشه،
یا آن را افزایش می دهد آن را توسط 1 یا آن را توسط 1 کاهش می یابد.
که می تواند ایجاد مشکل نماید، درست است؟
به خصوص اگر ما در حال برخورد با یک مجموعه از کارت های که در آن برروی آن بکشید عرشه کامل
مورد نیاز است.
اگر اندازه عرشه کاهش یافته است 1، برای مثال، برای 51،
ما در واقع نمی برروی آن بکشید تمام کارت احتمالا.
ما در حال ترک یکی از آنها را.
و شاید که ارزش می تواند پیش بینی و یا سوء استفاده توسط یک بازیگر بد است.
>> C فراهم می کند آنچه به نام دستور پیش پردازنده که
همچنین یک ماکرو برای نام ایجاد ثابت نمادین است.
و در واقع، شما در حال حاضر دیده می شود یک دستور پیش پردازنده،
حتی اگر شما آن شنیده نشد به نام که با کد: #include.
این یک مثال دیگر از یک ماکرو است و یا بخشنامه پیش پردازنده.
>> راه را برای ایجاد ثابت نمادین، و یا دادن یک نام به یک ثابت
به طوری که آن را تا بیش به این معنی که، به شرح زیر است.
# تعریف، نام، جایگزینی.
واقعا مهم کنار اینجا واقعا سریع است.
آیا یک نقطه و ویرگول در قرار داده نشده پایان #defines خود را.
پس از آن # تعریف، نام، جایگزینی است.
>> هنگامی که برنامه خود را وارد شده است، چه واقع اتفاق می افتد
کامپایلر اگر رفتن است به طریق کد خود را به
و جایگزین هر نمونه از کلمه "نام" با هر آنچه شما
قرار دادن به عنوان جایگزینی.
همین قیاس، اگر # شامل مرتب سازی بر اساس از شبیه به کپی و چسباندن،
پس از آن # تعریف مرتب سازی بر اساس به پیدا کردن و جایگزینی،
اگر شما تا کنون که از ویژگی های در استفاده می شود برنامه پردازش کلمه، برای مثال.
>> بنابراین برای مثال، اگر من # تعریف PI به عنوان 3.14159265،
اگر شما بهتر ریاضی هستید تمایل شما به طور ناگهانی و
3.14159265 پرواز را ببینید در اطراف در کد خود را،
شما احتمالا می دانید آن را در مورد PI صحبت کردن.
اما شاید ما می توانیم آن را به یک را کمی معنای نمادین بیشتر است.
و ما می توانید به جای # تعریف می گویند PI که لقمه از شماره
که من قصد دارم به نگه داشتن خواندن بیش از بیش.
>> و چه اتفاقی خواهد افتاد پس از آن در زمان کامپایل است زمانی که برنامه
وارد شده، اولین چیزی که خواهد افتاد آن است آن را از طریق رفتن
و آن را در هر زمان جایگزین آن را می بیند P سرمایه، سرمایه من،
آن را به معنای واقعی کلمه را جایگزین آن را با 3.14 و غیره، به طوری که شما
لازم نیست که به نوع آن در هر زمان در حالی که برنامه های خود را هنوز هم
دارای قابلیت های که شما انتظار می رود، چرا که شما در حال کار
با دستکاری، ضرب، تقسیم، هر چه که توسط Pi است.
>> شما به این محدود نمی تعویض فقط برای شماره.
به عنوان مثال، من می توانم # تعریف البته به عنوان CS50 رشته.
در این مورد، زمانی که برنامه وارد شده است،
# تعریف را از طریق رفتن کد، جایگزین هر زمان
آن را "البته" می بیند با CS50 رشته.
>> شما اینجا هستید متوجه خواهید شد همچنین که من بارها
همه # تعریف من تعریف نمادین ثابت، پس به صحبت می کنند،
همیشه در همه کلاه.
این یک قرارداد است.
این مورد نیاز است.
دلیل به طور کلی مردم استفاده خواهد تمام مراکز زمانی که آنها #defining
فقط به آن را واقعا روشن است که این عنصر خاص از کد من
ثابت تعریف شده است.
اگر آن را با حروف کوچک بود، آن را ممکن است ممکن است آن را با یک متغیر اشتباه گرفته شود.
و این احتمالا به یک چیز خوبی است.
>> بنابراین این خاص راه حل خیلی بهتر است
از هر کدام از آنهایی که قبلی.
اگر من # تعریف اول اندازه 52، پس از آن اکنون استفاده من از 52، و یا اندازه عرشه در اینجا،
بسیاری بیشتر بصری و خیلی امن تر است.
شما می توانید یک ثابت دستکاری نیست.
شما نمی توانید بگویید 52 به علاوه به علاوه.
که نمی آن را تبدیل به 53.
شما می توانید 52 به چیزی تغییر نمی کند.
>> شما می توانید یک متغیر تغییر که ارزش 52،
که برای اولین بار ثابت ما را قبل از.
و شما می توانید افزایش که متغیر به 53.
اما نمی توان گفت 52 به علاوه به علاوه و که ناگهان به نوبه خود 52 به 53.
52 همیشه 52.
و بنابراین شما نمی توانید سهوا تغییر اندازه عرشه در اینجا با دستکاری آن،
>> یکی دیگر از طرف خوب اثر این است هر چند
که شما آگاه هستند که نمی همه کشورها در سراسر جهان
استفاده از یک دسته کارت از اندازه 52؟
به عنوان مثال، آن را واقعا مشترک آلمان به استفاده از یک اندازه عرشه از 32،
که در آن آنها نوار برخی از کارت های ارزش پایین تر است.
و در این مورد، من به پورت مجموعه من می خواستم
از توابع است که با برخورد دستکاری کارت به آلمان است.
من می توانم در وهله اول ما نشان داد، باید به و جایگزین
همه موارد از 52 در کد من با 32.
>> اما در اینجا، اگر من # تعریف اندازه عرشه 32 در بالا بسیار از کد من،
اگر من نیاز به آن را تغییر دهید، من می توانم فقط بروید و تغییر آن یک چیز است.
کامپایل مجدد کد من، و همه از ناگهان آن را منتشر طریق.
در واقع، ما می توانید عرشه تغییر اندازه به هر مقدار ما می خواهیم.
>> آیا من می توانم شما را در یک علاقه بازی وانت اندازه عرشه؟
>> من داگ لوید هستم.
و این CS50.