[Powered by Google Translate] [بخش 4 - راحت تر] [راب Bowden - دانشگاه هاروارد [این CS50 است. - CS50.TV] ما فردا مسابقه، در صورتی که شما بچه ها نمی دانستند که. اساسا در همه چیز شما می توانید در کلاس دیده می شود و یا باید در کلاس دیده می شود. که شامل اشاره گر، حتی اگر آنها به یک موضوع بسیار جدید است. شما حداقل باید درک سطوح بالایی از آنها است. هر چیزی که در کلاس شما باید برای مسابقه را درک رفته بود. پس اگر سوالی دارید و بر روی آنها، شما می توانید آنها را در حال حاضر بپرسید. اما این رفتن به یک جلسه دانشجویی به رهبری که در آن شما بچه ها سوال بپرسید بنابراین امیدوارم مردم سوال. آیا کسی است؟ بله. >> [دانشجو] آیا می توانم شما را بیش از اشاره گرها دوباره؟ من بیش از اشاره گر بروید. تمامی متغیر ها لزوما در حافظه زندگی می کنند، اما معمولا شما را در مورد آن نگران نباشید و شما فقط می گویند X + 2 و y + 3 و کامپایلر خواهد شد که در آن همه چیز در زندگی برای شما. هنگامی که شما در حال خرید و فروش با اشاره گر، در حال حاضر شما به صراحت با استفاده از آن آدرس حافظه است. بنابراین یک متغیر تنها تنها همیشه در یک آدرس واحد را در هر زمان داده شده زندگی می کنند. اگر ما می خواهیم به تعریف یک اشاره گر، چه نوع شبیه؟ من می خواهم به اعلام یک اشاره گر P. چه نوع شکلی است؟ [دانشجوی] اعضای هیات * ص. >> آره. بنابراین اعضای هیات * ص. و چگونه می توانم آن را اشاره به X؟ >> [دانشجو] امپرسند. [Bowden] بنابراین علامت است که به معنای واقعی کلمه به نام آدرس اپراتور است. بنابراین، هنگامی که من می گویم و X آن را به آدرس حافظه متغیر x است. بنابراین در حال حاضر من از اشاره گر P، و در هر نقطه در کد من من می توانم * P استفاده کنید یا من می توانم X و استفاده از آن خواهد بود که دقیقا همان است. (* p). چه انجام شده است؟ چه آن ستاره چیست؟ [دانشجو] این به این معنی ارزش در آن نقطه است. >> آره. بنابراین، اگر ما در آن نگاه کنید، آن می تواند بسیار مفید برای رسم نمودار که این یک جعبه کوچک حافظه برای x، که اتفاق می افتد را به ارزش 4 است، پس ما باید یک جعبه کوچک حافظه برای P و به همین ترتیب نقاط P به X است، بنابراین یک پیکان از P به X کنیم. بنابراین، هنگامی که ما می گویند P * ما گفت: رفتن به جعبه است که P. ستاره است به دنبال فلش و پس از آن به انجام هر کاری که شما با این جعبه می خواهید سمت راست وجود دارد. بنابراین من می توانم بگویم * p = 7؛ و آن را به جعبه است که X و تغییر که به 7. یا من می توانم بگویم اعضای هیات z = * P * 2؛ که گیج کننده است چون آن ستاره، ستاره است. یک ستاره است بصورت غیر مرجع P، ستاره دیگر این است که به ضرب در 2 است. توجه داشته باشید که من می توانستم فقط به عنوان به خوبی P * با X جایگزین. شما می توانید آنها را در راه همان استفاده کنید. و سپس بعد از من می تواند نقطه P را به یک چیز کاملا جدید را داشته باشد. من فقط می توانم بگویم p = &z؛ بنابراین در حال حاضر بدون امتیاز دیگر به X فسفر، آن را به Z. و هر زمان که من P * همان انجام Z است. بنابراین چیزی در این مورد مفید است زمانی که ما شروع به وارد شدن به توابع. این نوع از بی فایده به تعریف یک اشاره گر است که به چیزی و سپس شما فقط آن را غیر مرجع زمانی که شما می توانید با استفاده از این متغیر اصلی برای شروع با. اما هنگامی که شما را به توابع - بنابراین می گویند ما باید برخی از تابع، نوع int صنایع غذایی، طول می کشد که یک اشاره گر است و فقط * p = 6؛ ما قبل از تعویض در حالت روشن را دیدم، شما می توانید یک مبادله موثر و یک تابع جداگانه انجام نمی فقط اعداد صحیح عبور از آنجا که همه چیز در C همیشه با ارزش عبور. حتی زمانی که شما در حال عبور از اشاره گرها در حال عبور با ارزش شما است. این فقط اتفاق می افتد که این ارزش ها، آدرس های حافظه می باشد. بنابراین، هنگامی که من می گویم صنایع غذایی (p)؛ من عبور از اشاره گر به تابع صنایع غذایی و پس از آن صنایع غذایی انجام شده است * p = 6؛ بنابراین در داخل آن تابع، * P هنوز معادل X، اما من می توانم X در داخل آن تابع استفاده نمی کند چرا که آن را در داخل آن تابع scoped نیست. پس * p = (6) تنها راهی که من می توانم یک متغیر محلی از یک تابع دیگر دسترسی داشته باشید. یا، به خوبی، اشاره گرها تنها راهی که من می تواند یک متغیر محلی از یک تابع دیگر دسترسی داشته باشید. [دانشجو] بیایید می گویند شما می خواهید به بازگشت به یک اشاره گر است. شما دقیقا چگونه انجام این کار؟ Bowden [] بازگشت یک اشاره گر را به عنوان چیزی شبیه به y هوشمند = 3، بازگشت و Y؟ >> [دانشجو] آره. [Bowden] باشه. شما باید این کار را انجام دهند هرگز. این بد است. من فکر می کنم من در این اسلاید سخنرانی دیدم شما شروع به دیدن این نمودار تمام حافظه جایی که اینجا شما رو آدرس حافظه 0 و پایین در اینجا شما باید حافظه را آدرس 4 گیگابایت یا 2 تا از 32. بنابراین پس از آن شما و برخی چیزهای برخی چیزهای و سپس پشته خود را به شما و شما رو پشته خود را، که شما فقط شروع به یادگیری در مورد، در حال رشد کردن است. [دانشجو] پشته در بالای پشته است؟ آره. پشته در بالای صفحه است، نه؟ >> [دانشجو] خب، او 0 در بالا قرار داده است. [دانشجو] اوه، او 0 در بالا قرار داده است. >> [دانشجو] اوه، درست است. سلب مسئولیت: در هر نقطه با CS50 شما در حال رفتن به آن را در این راه است. >> [دانشجو] باشه. مسئله این است که زمانی که شما برای اولین بار دیدن پشته، مانند وقتی که شما از پشته شما را از انباشته چیزهایی در بالای یکدیگر فکر می کنم فکر می کنم. بنابراین ما تمایل به این تلنگر را در اطراف پشته در حال رشد است تا مانند یک پشته به طور معمول به جای پشته حلق آویز کردن. >> [دانشجو] انبوه نه از لحاظ فنی رشد تا بیش از حد، هر چند؟ در مورد آنچه که منظور شما رشد می کنند بستگی دارد. پشته و پشته همیشه در جهت مخالف رشد می کنند. پشته است که همیشه در حال رشد است تا به این معنا است که آن را در حال رشد است به سمت آدرس های حافظه بالاتر، و پشته در حال رشد است که در آن در حال رشد به سمت آدرس های حافظه کمتر است. بنابراین بالا است 0 و در پایین آدرس های حافظه بالا است. آنها هر دو در حال رشد، تنها در جهت مخالف است. [دانشجو] من فقط به این معنی بود که چون شما گفت که پشته قرار داده و شما را در پایین به دلیل آن به نظر می رسد بیشتر بصری است زیرا در بالای پشته پشته به شروع، پشته در بالا از خود بیش از حد، بنابراین that's - >> آره. شما هم از پشته به عنوان رو به رشد و بزرگتر فکر می کنم، اما پشته بیشتر از آن. پس پشته این است که ما را به نوعی نشان می دهد در حال رشد کردن است. اما در همه جا شما نگاه کنید در غیر این صورت رفتن به آدرس 0 در بالا نشان می دهد و بالاترین آدرس حافظه در پایین، بنابراین این دیدگاه به طور معمول خود را از حافظه است. آیا شما باید یک سوال؟ [دانشجو] آیا می توانید به ما بگویید بیشتر در مورد پشته؟ آره. من در یک ثانیه بدست آورید. اول، رفتن به چرا بازگشت و Y یک چیز بد است، در پشته شما باید یک دسته از قاب پشته که نشان دهنده از توابع شده اند که نامیده می شود. بنابراین نادیده گرفتن چیزهای قبلی، در بالای پشته خود را همیشه به تابع اصلی از آنجا که عملکرد برای اولین بار است که به نام است. و پس از آن هنگامی که شما به یک تابع دیگر، پشته به رشد کردن است. بنابراین اگر من تماس بگیرید برخی از تابع، صنایع غذایی می شود، و آن را قاب پشته خود را، آن را می توانید برخی از تابع، نوار تماس بگیرید، آن را می شود قاب پشته خود را. و نوار می تواند بازگشتی و آن را می تواند به خود تماس بگیرید. و به طوری که تماس دوم به نوار رفتن به قاب پشته خود را. و بنابراین، آنچه در این قاب پشته می رود همه از متغیرهای محلی و همه از آرگومان تابع که - هر چیز که در محل scoped به این تابع در این قاب پشته. بنابراین این بدان معناست که زمانی که من گفت: چیزی شبیه به نوار است یک تابع، من فقط رفتن به اعلام یک عدد صحیح و سپس بازگشت به یک اشاره گر به عدد صحیح است که. پس کجا Y زندگی می کنند؟ [دانشجوی] Y در نوار زندگی می کند. >> [Bowden] آره. جایی در این میدان کمی از حافظه یک مربع littler است که Y در آن است. وقتی که من بازگشت و Y، من بازگشت به یک اشاره گر به این بلوک کمی از حافظه است. اما پس از آن زمانی که بازده عملکرد، قاب پشته آن می شود ظهور پشته. و به همین دلیل است که آن را به نام پشته است. مانند ساختار پشته داده است، اگر شما می دانید چه چیزی است. و یا حتی مانند یک پشته از سینی است که همواره به عنوان مثال، اصلی است که در پایین بروید، سپس اولین تابعی که با شما تماس است که در بالا از آن، و شما نمی توانید برگشت به بخش اصلی تا زمانی که شما از تمام توابع است که به نام بازگشت شده است که در بالای آن قرار داده شده است. [دانشجو] بنابراین اگر شما انجام بازگشت به Y، که ارزش موضوع بدون اطلاع قبلی تغییر است. بله، it's - >> [دانش آموز] می تواند رونویسی. >> آره. این - اگر شما سعی می کنید و - این نیز یک نوار از نوع int * به دلیل آن را در بازگشت به یک اشاره گر، بنابراین نوع بازگشت آن * نوع int است. اگر شما سعی می کنید به استفاده از مقدار بازگشتی این تابع، آن رفتار تعریف نشده است چرا که اشاره گر اشاره به حافظه های بد است. >> [دانشجو] باشه. پس چه می شود اگر، برای مثال، شما اعلام اعضای هیات * Y = malloc (sizeof (هوشمند))؟ که بهتر است. بله. [دانشجو] ما در مورد چگونگی صحبت کردیم که چیزهایی که ما را بکشید به بن بازیافت ما آنها در واقع نه پاک، ما فقط از دست دادن اشاره گر خود را. بنابراین در این مورد ما در واقع ارزش و یا پاک کردن آن است که هنوز هم وجود دارد در حافظه؟ در اکثر موارد، آن را هنوز هم وجود دارد. اما اجازه دهید می گویند ما رخ می دهد برخی از عملکرد های دیگر، باز به تماس. باز رفتن به قاب پشته خود را در اینجا. این رفتن به جای نوشتن همه این مسائل، و پس از آن اگر شما بعدا کنید و سعی کنید با استفاده از اشاره گر است که شما قبل از رو، آن را نمی شود به همان مقدار است. رفتن به تغییر کرده فقط به خاطر اینکه شما به نام تابع باز است. [دانشجو] اما تا به حال ما، نمی خواهد ما هنوز 3 دریافت؟ [Bowden] در تمام احتمال، شما می توانید. اما شما نمی توانید بر روی آن تکیه می کنند. C فقط می گوید رفتار تعریف نشده است. [دانشجو] آه، آن هم اینکار را در مورد شما نمی کنند. باشه. بنابراین، هنگامی که شما می خواهید به بازگشت به اشاره گر، این است که malloc می آید در حال استفاده است. من نوشتن در واقع فقط بازگشت malloc (3 * sizeof (INT)). خواهیم بیش از malloc در یک ثانیه، اما این ایده از malloc از متغیرهای محلی خود را همیشه در پشته. هر چیزی که malloced می رود بر روی پشته، و آن را برای همیشه و همیشه در پشته تا زمانی که شما به صراحت این برنامه رایگان است. بنابراین این بدان معنی است که هنگامی که شما malloc چیزی، آن را به رفتن به زنده ماندن پس از گرداند. [دانشجو] از آن به زنده ماندن پس از برنامه های در حال اجرا را متوقف می کند؟ >> شماره خوب، پس از آن وجود داشته باشد تا این برنامه این است راه انجام می شود در حال اجرا است. >> بله. ما می توانیم به جزئیات چه اتفاقی می افتد هنگامی که برنامه در حال اجرا را متوقف می کند. شما ممکن است نیاز به من یادآوری است، اما یک چیز جداگانه ای به طور کامل. [دانشجو] پس malloc ایجاد یک اشاره گر است؟ >> آره. Malloc - >> [دانشجو] من فکر می کنم malloc تعیین یک بلاک از حافظه که اشاره گر می توانید استفاده کنید. [Bowden] من می خواهم که دوباره نمودار. >> [دانشجو] بنابراین این تابع کار می کند، هر چند است؟ [دانشجوی] بله، malloc تعیین یک بلوک از حافظه است که شما می توانید با استفاده از، و سپس آن را به آدرس بلوک برای اولین بار از این حافظه را بر می گرداند. [Bowden] آره. بنابراین، هنگامی که شما malloc، شما در حال گرفتن برخی از بلوک از حافظه که در حال حاضر در پشته. اگر پشته خیلی کوچک است، پس از آن پشته فقط رفتن به رشد، و آن را در این راستا رشد می کند. بنابراین می گویند که این پشته بیش از حد کوچک است. سپس آن را در مورد رشد کمی و بازگشت اشاره گر به این بلوک که فقط رشد است. هنگامی که شما چیزهای رایگان، شما در حال ساخت اتاق بیشتر در پشته، بنابراین پس از یک بعد به malloc تماس که می تواند حافظه که قبلا آزاد شده بود استفاده نمایید. نکته مهم در مورد malloc و رایگان است که آن را به شما می دهد کنترل کامل در طول عمر از بلوک های حافظه. متغیر های جهانی همیشه زنده است. متغیرهای محلی در حوزه خود زنده است. به محض این که شما در گذشته بریس فرفری، متغیرهای محلی هستند مرده است. حافظه Malloced زنده است، زمانی که شما می خواهید آن را به صورت زنده و پس از آن منتشر شده است هنگامی که آن را به شما بگویم و به بازار عرضه می شود. اینها در واقع تنها در 3 نوع از حافظه، واقعا. مدیریت حافظه اتوماتیک است که در پشته وجود دارد. چیزهایی که برای شما اتفاق می افتد به صورت خودکار. وقتی به شما می گویند نوع int X، حافظه X نوع int اختصاص داده شده است. هنگامی که X می رود از دامنه، حافظه X اصلاح شده است. سپس مدیریت حافظه پویا، که همان چیزی است که malloc است وجود دارد، است که هنگامی که شما به کنترل. شما به صورت پویا زمانی که حافظه و باید به نمی شود اختصاص داده تصمیم می گیرند. و سپس استاتیک وجود دارد، که این بدان معنی است که آن را زندگی می کند برای همیشه لطفا برای، که همان چیزی است که متغیر های جهانی می باشد. آنها همیشه در حافظه است. پرسش و پاسخ؟ [دانشجو] آیا می توانید یک بلوک تعریف می کنید و فقط با استفاده از آکولاد اما داشتن نیست که اگر بیانیه و یا در حالی که بیانیه و یا هر چیزی شبیه به آن شما می توانید یک بلوک را در یک تابع را تعریف کنیم، اما است که آکولاد بیش از حد است. [دانشجو] بنابراین شما فقط مانند یک جفت تصادفی از آکولاد نمی تواند در کد خود را داشته باشند که متغیرهای محلی؟ >> بله، شما می توانید. ما می تواند در داخل نوار داده int {دانشنامه هوشمند Y = 3؛} داشته باشد. که قرار است به حق در اینجا. اما که به طور کامل تعریف دامنه y هوشمند می باشد. پس از که بریس فرفری دوم، Y می توان استفاده نمی کنم. شما تقریبا هرگز انجام این کار، هر چند. برگشت به بخش چه اتفاقی می افتد زمانی که برنامه به پایان می رسد، نوع دروغ تصور غلط / نیم که ما به منظور فقط همه چیز را آسان تر را وجود دارد. ما به شما می گویند که هنگامی که شما به حافظه اختصاص دهد شما به اختصاص برخی از تکه از RAM را برای آن متغیر است. اما شما واقعا نه به طور مستقیم لمس RAM تا به حال در برنامه های خود. اگر شما از آن فکر می کنم، چگونه من کشید - و در واقع، اگر شما از طریق GDB شما همان چیزی را ببینید. صرف نظر از چند بار اجرای برنامه خود را و یا چه برنامه شما در حال اجرا، پشته همیشه برای شروع - شما همیشه برای دیدن متغیرهای اطراف چیزی oxbffff آدرس. معمولا در جایی در آن منطقه است. اما چگونه می توانید 2 برنامه احتمالا اشاره گر به حافظه؟ [دانشجو] برخی از طراحی دلخواه که در آن oxbfff قرار است در RAM وجود دارد. است که در واقع می تواند در مکان های مختلف با توجه به زمانی که تابع نامیده شد. آره. مدت حافظه مجازی است. این ایده که هر فرایند، هر برنامه ای که بر روی کامپیوتر شما در حال اجرا است خود را دارد - اجازه دهید فرض 32 بیت - کاملا مستقل فضای آدرس. این فضای آدرس دهی است. این به خود را دارد کاملا مستقل 4 گیگابایت برای استفاده است. بنابراین اگر شما 2 برنامه به طور همزمان، این برنامه 4 گیگابایت را به خود می بیند. این برنامه 4 گیگابایت را به خود می بیند. و آن را برای این برنامه غیر ممکن به dereference یک اشاره گر و در نهایت حافظه از این برنامه است. و چه در حافظه مجازی است، نقشه برداری از فضای آدرس فرآیندهای به چیزهای واقعی بر روی RAM. پس آن را به سیستم عامل شما می دانید که، با سلام، در زمانی که این مرد ارجاع میدهد oxbfff اشاره گر، که واقعا به معنای که او می خواهد RAM BYTE 1000، در حالی که اگر این برنامه oxbfff ارجاع میدهد، او واقعا می خواهد RAM BYTE 10،000. آنها می توانند خودسرانه دور از هم. این درست است که حتی از چیزهایی که در یک فضای آدرس فرآیندهای تک. پس چون آن را می بیند تمام 4 گیگابایت را به خود، اما اجازه دهید بگویم - [دانشجوی] هر پروسه - بیایید می گویند شما باید یک کامپیوتر با تنها 4 گیگابایت RAM است. آیا هر پروسه در کل از 4 گیگابایت؟ >> بله. اما از 4 گیگابایت آن را می بیند یک دروغ است. این فقط به آن فکر می کند این همه این حافظه به دلیل آن را نمی داند هر فرایند دیگر وجود دارد. این تنها حافظه به همان اندازه که آن را در واقع باید استفاده کنید. سیستم عامل نمی خواهید به RAM به این فرآیند اگر آن را از هر حافظه در تمام این منطقه را با استفاده از. این قصد ندارم به آن حافظه را برای آن منطقه را. اما این ایده که - من در تلاش برای فکر می کنم از - من نمی توانم فکر می کنم از قیاس است. شباهتها سخت است. یکی از مسائل مربوط به حافظه مجازی یا یکی از چیزهایی که آن را حل این است که فرایندهای باید به طور کامل از یکدیگر غافل است. و بنابراین شما می توانید هر برنامه ای نوشت که فقط ارجاع میدهد هر اشاره گر، دوست دارم فقط به نوشتن یک برنامه که می گوید * (ox1234)، بصورت غیر مرجع و آدرس حافظه 1234. اما آن را به سیستم عامل به آن چه 1234 به معنی ترجمه است. بنابراین اگر 1234 اتفاق می افتد که یک آدرس حافظه معتبر برای این فرایند، مانند آن را در پشته و یا چیزی است، سپس این مقدار از حافظه است که آدرس بازگشت تا آنجا که این روند می داند. اما اگر 1234 یک آدرس معتبر نمی باشد، مانند آن اتفاق می افتد به زمین در برخی قطعه کمی از حافظه در اینجا این است که فراتر از پشته و فراتر از پشته و شما واقعا استفاده می شود که، پس از آن که زمانی که شما می توانید چیزهایی مانند segfaults دلیل این که شما در حال لمس کردن حافظه است که شما نباید لمس کردن است. این هم درست است - یک سیستم 32 بیتی، 32 بیت معنی است که شما برای تعریف یک آدرس حافظه 32 بیت می باشد. به همین دلیل است اشاره گر 8 بایت به خاطر 32 بیت 8 بایت - یا 4 کلمه در ادامه متن. اشاره گرها 4 بایت است. بنابراین، هنگامی که شما یک اشاره گر مانند oxbfffff است که - در هر برنامه داده شده شما می توانید فقط هر اشاره گر دلخواه ساخت، در هر نقطه از ox0 به گاو نر 8 f's - ffffffff. [دانشجو] آیا شما می گویند که 4 بایت است؟ >> آره. [دانشجو] سپس هر بایت - >> [Bowden] هگزادسیمال. هگزادسیمال - 5، 6، 7، 8. پس اشاره گر شما تا همیشه در مبنای شانزده را ببینید. این فقط اشاره گر ما طبقه بندی. هر 2 رقم هگزادسیمال 1 بایت است. بنابراین قصد دارد به 8 رقم هگزادسیمال برای 4 بایت است. بنابراین هر اشاره گر بر روی یک سیستم 32 بیتی برای رفتن به 4 بایت، که بدان معنی است که در روند خود را، شما می توانید هر 4 خودسرانه بایت ساخت و یک اشاره گر از آن، که بدان معنی است که تا آنجا که آن را به عنوان آگاه، می تواند و 2 کل 32 بایت از حافظه آدرس. حتی اگر آن را واقعا نمی دسترسی به آن، حتی اگر کامپیوتر شما تنها دارای 512 مگابایت، فکر می کند آن است که حافظه زیادی است. و سیستم عامل به اندازه کافی هوشمند است که آن را تنها اختصاص آنچه شما در واقع نیاز است. این کار نه تنها بروید، آه، یک فرآیند جدید: 4 گیگابایت است. آره. >> [دانشجو] چه گاو؟ چرا که شما آن را بنویسید؟ این فقط نماد هگزادسیمال. وقتی که شما شروع به شماره با گاو نر، همه چیز های پی در پی هگزادسیمال است. [دانشجو] از شما در مورد آنچه اتفاق می افتد زمانی که برنامه به پایان می رسد توضیح شد. >> بله. چه اتفاقی می افتد زمانی که برنامه به پایان می رسد سیستم عامل است فقط پاکسازی نگاشت که آن را برای این آدرس ها است، و این از آن است. سیستم عامل هم اکنون می توانید این حافظه به یک برنامه دیگر برای استفاده به من بدهید. [دانشجو] خوب. بنابراین، هنگامی که شما تخصیص چیزی در پشته و یا متغیرهای پشته و یا جهانی و یا هر چیز، همه آنها را فقط به عنوان به زودی ناپدید می شوند به عنوان برنامه به پایان می رسد به این دلیل که سیستم عامل در حال حاضر آزاد را که حافظه را به هر فرآیند دیگر. [دانشجو] اگرچه احتمالا هنوز مقادیر نوشته شده در؟ >> آره. ارزش ها به احتمال زیاد هنوز هم وجود دارد. این فقط آن را به دشوار در آنها را دریافت کنید. این بسیار سخت تر آنها را دریافت کنید، از آن است که در یک فایل حذف شده زیرا نوع فایل حذف شده از نشسته وجود دارد برای یک مدت طولانی و هارد دیسک خیلی بزرگتر است. پس از آن رفتن به بازنویسی قسمت های مختلف حافظه قبل از آن اتفاق می افتد به بازنویسی تکه از حافظه است که که فایل استفاده می شود در. اما حافظه اصلی، RAM، شما را از طریق خیلی سریع تر چرخه، پس از آن رفتن به بسیار به سرعت در حال بازنویسی است. سوالات مطرح شده در این و یا هر چیز دیگری؟ [دانشجوی] سوال در مورد یک موضوع متفاوت است. >> درست است. آیا کسی سوال در مورد این؟ باشه. موضوع های مختلف. >> [دانشجو] باشه. من را از طریق برخی از آزمون عملی خواهد شد، و در یکی از آنها صحبت کردن در مورد sizeof شد و ارزش است که آن را برمی گرداند و یا انواع مختلف متغیر است. >> بله. و گفت که هر دو نوع int و بلند مدت هر دو بازگشت 4، به طوری که آنها هر دو 4 بایت طول هستیم. آیا تفاوت بین int و طولانی، وجود دارد و یا این همان چیزی است؟ بله، تفاوت وجود دارد. استاندارد C - شاید هم من دارم رفتن به یک ظرف غذا تا. استاندارد C است فقط آنچه C این است که، اسناد رسمی C. دوست این همان چیزی است که آن را می گوید. بنابراین استاندارد C فقط می گوید که یک کاراکتر برای همیشه و همیشه خواهد بود 1 بایت است. همه چیز بعد از آن - کوتاه است که همیشه فقط به عنوان بزرگتر یا مساوی به یک کاراکتر تعریف شده است. این ممکن است به شدت بیشتر از، اما مثبت نیست. بین المللی است که فقط به عنوان بزرگتر یا مساوی به کوتاه تعریف شده است. و بلند است که فقط به عنوان بزرگتر یا مساوی به یک int تعریف شده است. و طولانی مدت است بزرگتر یا مساوی به طولانی است. بنابراین تنها چیزی که استاندارد C تعریف نظم نسبی از همه چیز است. مقدار واقعی حافظه است که همه چیز را تا به طور کلی برای پیاده سازی، اما آن را به خوبی در این نقطه تعریف می شود. >> [دانشجو] باشه. بنابراین شلوارک تقریبا همیشه رفتن به 2 بایت است. نوع داده int هستند تقریبا همیشه به 4 بایت است. موقعیت خرید پیش میآید طول تقریبا همیشه به 8 بایت است. و مشتاق، در مورد اینکه آیا شما با استفاده از 32 بیتی یا یک سیستم 64 بیتی دارد. بنابراین طولانی است مربوط به نوع سیستم. اگر شما با استفاده از یک سیستم 32 بیتی مانند دستگاه، آن را به 4 بایت است. اگر شما با استفاده از 64 بیتی مانند بسیاری از رایانه های اخیر، آن را به 8 بایت است. نوع داده int هستند تقریبا همیشه 4 بایت در این نقطه است. موقعیت خرید پیش میآید طول تقریبا همیشه 8 بایت است. در گذشته، نوع داده int استفاده می شود تنها به 2 بایت است. اما توجه کنید که این به طور کامل ارضا تمام این روابط بیش از و برابر. تا زمانی کاملا اجازه داده می شود به همان اندازه به عنوان یک عدد صحیح، و آن را نیز اجازه داده می شود به همان اندازه به عنوان طولانی مدت است. و این فقط اتفاق می افتد که در 99.999٪ از سیستم، آن را در حال رفتن به برابر یا بین المللی و یا طولانی مدت است. این فقط بر روی 32 بیتی یا 64 بیتی بستگی دارد. >> [دانشجو] باشه. در شناور، چگونه است که نقطه اعشار تعیین شده در قوانین و مقررات از بیت؟ مانند دودویی؟ >> آره. شما لازم نیست بدانند که برای CS50. شما حتی نمی یاد بگیرند که در 61. شما را نمی آموزند که واقعا در هر دوره است. این فقط یک نمایش است. من را فراموش کرده ام سهمیه کمی دقیق. این ایده از نقطه شناور این است که شما به اختصاص یک شماره خاص از بیت برای نشان دادن - در واقع، همه چیز در نماد علمی است. بنابراین شما تخصیص یک شماره خاص از بیت برای نشان دادن شماره خود، مانند 1.2345. من می توانم یک عدد را با رقم بیش از 5 نمایندگی هرگز. سپس شما نیز اختصاص یک شماره خاص از بیت ها به طوری که این امر منجر به مانند شما تنها می توانید به یک شماره خاص، می خواهم که بزرگترین نمایی شما می توانید، و شما تنها می توانید به یک نماینده خاص بروید، دوست دارم که کوچکترین نمایی شما می توانید. من را به خاطر نمی بیت راه دقیق به تمام این ارزش ها اختصاص داده شده، اما تعداد معینی از بیت اختصاص داده شده، به 1.2345 یکی دیگر از تعداد مشخصی بیت اختصاص داده شده، به توان و آن را تنها راه ممکن برای نشان دادن نمایی از یک اندازه خاص است. [دانش آموز] و دو برابر؟ است که مانند شناور طولانی اضافی؟ >> آره. این همان چیزی که به عنوان شناور به جز در حال حاضر شما در حال استفاده از 8 بایت به جای آن از 4 بایت است. حالا شما قادر خواهید بود به استفاده از 9 رقم یا 10 رقم و این خواهد بود که قادر به رفتن تا 300 به جای 100. >> [دانشجو] باشه. و شناور نیز 4 بایت است. >> بله. خوب، دوباره، آن را احتمالا بستگی دارد به طور کلی در اجرای عمومی، اما شناور 4 بایت هستند، دو برابر 8. دو برابر نامیده می شوند دو برابر است زیرا آنها دو برابر اندازه شناور است. [دانشجو] خوب. و وجود دارد دو برابر دو برابر است؟ >> وجود ندارد. من فکر می کنم - >> [دانشجو] مانند موقعیت خرید پیش میآید بلند؟ >> آره. گمان نمی کنم. بله. [دانشجو در آزمون سال گذشته بود یک سوال در مورد تابع اصلی وجود دارد نیاز به بخشی از برنامه های خود را. پاسخ این بود که آن را ندارد بخشی از برنامه های خود را به. در چه وضعیت؟ این چیزی است که من تو را دیدم. [Bowden] به نظر می رسد - >> [دانشجو] وضعیت چیست؟ آیا مشکل دارید؟ >> [دانشجوی] آره، من قطعا می توانید آن را بالا بکشد. این کار می شود، از لحاظ فنی، اما اساسا از آن برای رفتن به. [دانشجو] من یکی در سال های مختلف را دیدم. مانند درست یا غلط بود: معتبر - >> اوه، یک فایل C.؟ [دانشجو] هر فایل C باید - [هر دو زبان در یک بار - ناخوانا] باشه. به طوری که برنامه جداگانه. یک فایل C فقط نیاز به توابع شامل است. شما می توانید یک فایل را به کد ماشین، باینری، هر آنچه که کامپایل، بدون این که اجرایی نشده است. اجرایی معتبر باید یک تابع اصلی داشته باشد. شما می توانید از 100 توابع در 1 فایل اما هیچ اصلی ارسال و پس از آن را به باینری کامپایل، پس از آن تو می نویسم یکی دیگر از فایل است که تنها اصلی است اما در آن خواستار یک دسته از این توابع در این فایل باینری در اینجا. و تا زمانی که شما در حال اجرایی، این چیزی است که لینکر می کند است که آن را ترکیبی از این 2 فایل های باینری را در یک فایل اجرایی می باشد. بنابراین یک فایل C لازم نیست که یک تابع اصلی در تمام. و در پایگاه های بزرگ کد شما هزاران نفر از فایل های C و 1 فایل اصلی را ببینید. بیشتر است؟ [دانشجو] یک سؤال دیگر وجود دارد. گفت: ساخت این است که یک کامپایلر است. درست یا غلط؟ و پاسخ غلط بود، و فهمیدم که چرا آن را مانند صدای جرنگ جرنگ نیست. اما چه چیزی ما تماس بگیرید اگر این طور نیست؟ را اساسا فقط - من می توانید ببینید که دقیقا همان چیزی است که آن را. اما این فقط دستورات را اجرا می کند. را تشکیل می دهند. من می توانم از این بالا بکشید. آره. اوه، آره. را نیز ندارد که. این ماده می گوید هدف از ابزار را به طور خودکار تعیین که قطعه از یک برنامه بزرگ نیاز به کامپایل مجدد و صدور دستورات به کامپایل مجدد آنها. شما می توانید فایل هایی که کاملا بزرگ است. اطمینان به نظر می رسد در زمان تمبر از فایل ها و مانند قبل از ما گفت، شما می توانید فایل ها را کامپایل، و آن را تا زمانی که شما به لینکر که آنها با هم به یک فایل اجرایی قرار داده است. بنابراین اگر شما 10 فایل های مختلف و شما می توانید تغییرات تا 1، از آنها، پس از آن چه ایجاد شده است برای انجام این کار فقط کامپایل است که 1 فایل و پس از آن همه چیز با هم relink. اما آن را بسیار دمپر از آن است. آن تا به شما به طور کامل تعریف که این چیزی است که باید آن را انجام. آن را به طور پیش فرض است که توانایی به رسمیت شناختن این زمان چیزهای مهر، اما شما می توانید یک فایل را به انجام هر چیزی نوشتن. شما می توانید ارسال نامه را در فایل به طوری که زمانی که شما تایپ آن را فقط سی دی را به شاخه دیگری. قرار گرفت و برای بار دوم من گرفتن نا امید شد، چرا که من همه چیز رویه در داخل از لوازم من و پس از آن PDF از مک من ها را ببینید. بنابراین من به یاب و من می توانم آیا، اتصال به سرور، و سرور من برای اتصال لوازم خانگی من است و پس از آن من باز کردن PDF که می شود توسط لاتکس وارد شده است. اما من گرفتن نا امید بود زیرا هر زمان تنها من نیاز به به روز کردن PDF، من تا به حال آن را کپی کنید به یک پوشه خاص است که می تواند دسترسی به و آن را آزار دهنده است. بنابراین به جای من یک فایل ساخت، که شما باید برای تعریف چگونگی آن را می سازد همه چیز را نوشت. چگونه شما را در ایجاد این PDF لاتکس است. درست مثل هر فایل ایجاد دیگر - یا من حدس می زنم شما از فایل دیده می کنند، اما ما در این دستگاه که یک فایل ایجاد جهانی است که می گوید، اگر شما در حال کامپایل یک فایل C، استفاده از صدای جرنگ جرنگ. و بنابراین در اینجا در فایل ایجاد من است که من را من می گویم، این فایل شما می خواهید به با PDF لاتکس کامپایل. و پس از آن لاتکس PDF که انجام گردآوری شده است. را کامپایل نیست. این فقط در حال اجرا این دستورات در دنباله من مشخص است. پس از آن اجرا می شود لاتکس PDF، آن را به شاخه ای را که می خواهید آن را به کپی به کپی، آن سی دی به دایرکتوری و چیزهای دیگر را می کند، اما همه آن کند تشخیص تغییرات فایل، و اگر تغییر، سپس آن را به دستورات آن است که قرار است به اجرا اجرا هنگامی که تغییرات فایل. >> [دانشجو] باشه. من نمی دانم که در آن فایل ایجاد جهانی برای من آن را به اتمام. سوال دیگر؟ هر چیزی از گذشته آزمونها؟ هر چیز اشاره گر؟ چیزهایی هستند که ظریف با اشاره گرها مانند وجود دارد - من نخواهد بود قادر به پیدا کردن یک سوال مسابقه بر روی آن - اما درست مانند این نوع از چیزی است. اطمینان حاصل کنید که شما را در درک که زمانی که من می گویم هوشمند * X * Y - این دقیقا هر چیزی در اینجا نیست، من حدس می زنم. اما مانند * X * Y، هستند کسانی که 2 متغیر است که بر روی پشته هستند. وقتی که من می گویم X = malloc (sizeof (INT))، x است که هنوز هم یک متغیر را بر روی پشته، malloc برخی از بلوک در پشته است، و ما در حال داشتن نقطه X به پشته. بنابراین چیزی در نقاط پشته پشته. هر زمان که شما malloc هر چیزی، شما به ناچار در نگهداری آن را داخل یک اشاره گر است. به طوری که اشاره گر را بر روی پشته، بلوک malloced در پشته. بسیاری از مردم به اشتباه گرفته و می گویند از نوع int * x = malloc X در پشته است. شماره X اشاره به پشته می باشد. X خود را بر روی پشته، مگر اینکه به هر دلیلی شما X یک متغیر جهانی، که در این حالت اتفاق می افتد که در منطقه دیگری از حافظه است. بنابراین برای نگه داشتن مسیر، این نمودار جعبه و فلش بسیار رایج برای مسابقه است. یا اگر آن را در مسابقه 0 نیست، اما در مسابقه 1. شما باید همه از این می دانم که گام در تدوین از آنجایی که شما تا به حال برای پاسخ به سوال در مورد کسانی است. بله. [دانشجو] آیا ما بیش از آن مراحل - >> مطمئنا. قبل از مراحل و تدوین پیش پردازش، تدوین، مونتاژ، و ارتباط است. پیش پردازش. چه کاری انجام دهید؟ این ساده ترین مرحله است - خب، نه مثل - این بدان معنا نیست که باید آن را واضح و آشکار باشد، اما این ساده ترین مرحله است. شما بچه ها می توانند خود را اجرا می کنند. آره. [دانشجو] نگاهی به آنچه شما را در خود داشته باشد شامل مثل این و آن را کپی و پس از آن نیز تعریف می کند. برای چیزهایی همانند # include به نظر می رسد و # تعریف، و آن را فقط کپی و چسب آنچه که در واقع متوسط. بنابراین، هنگامی که به شما می گویند # شامل cs50.h، پردازنده کپی کردن و چسباندن cs50.h به آن خط است. هنگامی که به شما می گویند: تعریف X به 4، پیش پردازنده می رود از طریق این برنامه کل و جایگزین همه موارد از X با 4. بنابراین پیش پردازنده می گیرد یک فایل C معتبر و خروجی یک فایل معتبر C که در آن همه چیز را کپی و جا به جا شده است. بنابراین در حال حاضر تدوین است. چه کاری انجام دهید؟ [دانشجو] آن را از C به باینری می رود. [Bowden] این همه راه را به باینری نیست. [دانشجو] به کد ماشین؟ >> کد ماشین نیست. [دانشجوی] مجمع؟ >> مجمع. آن را به مجلس می رود قبل از آن می رود تمام راه را به کد C، و بسیاری از زبان ها چیزی شبیه به این. انتخاب هر زبان سطح بالا است، و اگر شما در حال رفتن به آن را کامپایل، این احتمال وجود دارد که در مراحل تدوین است. اول رفتن به کامپایل پایتون به C، سپس آن را به کامپایل C به مجمع، و پس از آن مجمع به باینری ترجمه شده است. بنابراین تدوین است که رفتن به آن را از C به مجمع. کلمه تدوین معمولا به معنای آوردن آن از یک سطح بالاتر به یک زبان برنامه نویسی سطح پایین تر. بنابراین در این مرحله تنها در تلفیقی که در آن شما را با یک زبان سطح بالا شروع است و در نهایت در یک زبان سطح پایین است، و به همین دلیل است که مرحله تدوین است. [دانشجو] در طول تدوین، اجازه دهید بگویم که شما انجام داده ایم # شامل cs50.h. به کامپایلر کامپایل مجدد cs50.h، مانند توابع که در آن وجود دارد، و ترجمه به کد اسمبلی به عنوان خوب، و یا آن را کپی کنید و آن چیزی است که پیش مونتاژ شده است؟ cs50.h خیلی خیلی هرگز تا پایان در مجمع است. چیزهای مانند نمونه تابع و همه چیز فقط برای شما مراقب باشید. این تضمین می کند که کامپایلر می تواند چیزهایی مانند شما در حال فراخوانی توابع چک انواع بازگشت راست و استدلال راست و مسائل است. بنابراین cs50.h خواهد شد را در فایل preprocessed، و سپس هنگامی که آن را تدوین اساسا دور انداخته و پس از آن باعث می شود اطمینان حاصل کنید که همه چیز به درستی است که به نام. اما توابع تعریف شده در کتابخانه CS50، که جدا از cs50.h، کسانی که نمی شود به طور جداگانه وارد شده. که در واقع پایین خواهد آمد در مرحله ارتباط است، بنابراین ما در یک ثانیه بدست آورید. اما در ابتدا، آنچه که مونتاژ؟ [دانشجوی] مجمع به باینری؟ >> آره. مونتاژ. ما را صدا نمی آن تدوین به دلیل مجمع است که تقریبا یک ترجمه خالص دودویی. منطق بسیار کوچک در رفتن از مجلس به باینری وجود دارد. این درست مثل دنبال کردن یک جدول، آه، ما باید این دستور؛ که مربوط به باینری 01،110. و به این ترتیب فایل هایی که مونتاژ به طور کلی خروجی فایل های O. و فایل های O همان چیزی است که ما می گفتند قبل از، چگونه یک فایل لازم نیست که به یک تابع اصلی. هر فایل را می توان تا زمانی آن را به عنوان یک فایل C معتبر به یک فایل O وارد شده است. این را می توان به ای وارد شده است. در حال حاضر، ارتباط آن چیزی است که در واقع به ارمغان می آورد یک دسته از فایل ها O به ارمغان می آورد و آنها را به یک فایل اجرایی است. و به این ترتیب ارتباط می کند این است که شما می توانید از کتابخانه CS50 به عنوان یک فایل O فکر می کنم. این یک فایل باینری در حال حاضر وارد شده است. و بنابراین، هنگامی که فایل خود را، hello.c خود را، که خواستار GetString شما کامپایل، hello.c می شود به hello.o وارد شده، hello.o است که در حال حاضر در دودویی. آن استفاده می کند GetString، پس از آن نیاز به رفتن به cs50.o، و لینکر آنها را با هم smooshes و GetString را در این فایل کپی بیرون می آید و با اجرایی است که تمام توابع به آن نیاز دارد. بنابراین cs50.o است که در واقع یک فایل O، اما آن را به اندازه کافی نزدیک است که هیچ تفاوت اساسی وجود دارد. بنابراین ارتباط فقط یک دسته از فایل ها را با هم به ارمغان می آورد که به طور جداگانه شامل تمام توابع، نیاز به استفاده از و ایجاد اجرایی است که در واقع اجرا خواهد شد. و به طوری که آنچه که ما می گفتند قبل از که در آن شما می توانید 1000. فایل های C، همه آنها را به شما کامپایل. فایل های O، که احتمالا مدتی طول خواهد کشید، و سپس شما تغییر 1. فایل C است. شما فقط نیاز به کامپایل مجدد که 1 فایل C و پس از آن همه چیز relink دیگری، لینک کنید همه چیز با هم. [دانشجو] هنگامی که ما در حال ارتباط ما ارسال lcs50؟ آره، پس lcs50. که سیگنال پرچم به لینکر که شما باید ارتباط را در آن کتابخانه است. پرسش و پاسخ؟ آیا ما بیش از دودویی به غیر از آن است که 5 ثانیه در سخنرانی اول رفته است؟ گمان نمی کنم. شما باید از سیستم عامل های بزرگ که ما رفته است می دانم، و شما باید قادر باشد که، اگر ما به شما یک تابع، شما باید قادر به گفتن آن بزرگ O، تقریبا. یا خوب، بزرگ O خشن است. بنابراین اگر شما برای حلقه حلقه بیش به همان تعداد از همه چیز تو در تو، برای مثال، int من، > [دانشجوی] N مربع. >> این امر منجر به N مربع است. اگر شما سه گانه را تو در تو، این امر منجر به N نبات. به طوری که مرتب سازی بر اساس چیزی که شما باید قادر باشد که به این نکته اشاره بلافاصله. شما باید بدانید که مرتب سازی بر درج و مرتب سازی حبابی و ادغام مرتب کردن و همه کسانی. آن را آسان تر به درک چرا آنها کسانی هستند N مربع و n log n است و همه از آن چرا که من فکر می کنم در مسابقه وجود دارد یک سال که ما اساسا به شما داد اجرای مرتب سازی بر حباب و گفت: "زمان در حال اجرا از این تابع چیست؟" بنابراین اگر شما آن را تشخیص عنوان مرتب سازی بر اساس حباب، و سپس شما می توانید بلافاصله N مربع می گویند. اما اگر شما فقط به آن نگاه کنید، شما حتی نمی نیاز به مرتب سازی بر حباب آن به درک؛ شما می توانید فقط این است که انجام این کار و این می گویند. این است که نفر مربع است. [دانشجو] آیا نمونه های دشوار شما می توانید با، مانند یک ایده مشابه از بدانند؟ من فکر نمی کنم ما می خواهیم به شما هیچکدام از نمونه های سخت به من بدهید. حباب مرتب کردن بر اساس چیزی که در مورد سخت است که ما را به و حتی، تا زمانی که شما را در درک که شما تکرار بیش از آرایه برای هر عنصر در آرایه، که به چیزی است که نفر مربع است. پرسش ها، به طور کلی مانند حق در اینجا در حال حاضر وجود دارد - آه. فقط روز دیگر، داگ ادعا کرد، "من اختراع یک الگوریتم است که می تواند یک آرایه مرتب سازی بر اساس "از تعداد N در O (log n است) زمان!" پس چگونه ما می دانیم که غیر ممکن است؟ [پاسخ دانش آموز نامفهوم] >> آره. حداقل، شما باید به لمس هر عنصر در آرایه، پس از آن غیر ممکن است برای مرتب کردن یک آرایه - اگر همه چیز است به منظور نامرتب، پس از آن شما برای رفتن به لمس کردن همه چیز را در آرایه، پس از آن غیر ممکن است که آن را در کمتر از O از N. [دانشجو] شما به ما نشان داد که به عنوان مثال قادر به انجام آن در O از N اگر شما با استفاده از مقدار زیادی از حافظه است. >> آره. و that's - من فراموش that's - آیا مرتب سازی بر اساس شمارش؟ سلام. این یک الگوریتم مرتب سازی عدد صحیح است. من دنبال نام خاصی برای این بود که من نمی توانستم به یاد داشته باشید در هفته گذشته است. آره. این نوع از انواع است که می تواند همه چیز را در بزرگ O از N انجام است. اما محدودیت وجود دارد، مثل شما فقط می توانید با استفاده از اعداد صحیح به یک شماره خاص است. به علاوه اگر شما در حال تلاش برای مرتب کردن that's چیزی - اگر آرایه خود را 012 -12، 151، 4 میلیون نفر است، سپس آن عنصر واحد به طور کامل خراب مرتب سازی کل است. پرسش و پاسخ؟ [دانشجو] اگر شما از یک تابع بازگشتی و فقط باعث می شود که تماس های بازگشتی در بیانیه ای بازگشت، که دم بازگشتی، و به طوری که نه استفاده از حافظه بیشتر در زمان اجرا یا حداقل استفاده از حافظه های قابل مقایسه به عنوان یک تکرار شونده راه حل؟ [Bowden] بله. به احتمال زیاد تا حدودی کندتر باشد، اما نه واقعا. دم بازگشتی خوب است. به دنبال دوباره در قاب پشته، اجازه دهید می گویند ما باید اصلی و ما باید نوار هوشمند (از نوع int x) و یا چیزی است. این تابع بازگشتی کامل نیست، اما نوار بازگشت (X - 1). پس بدیهی است، این ناقص است. شما نیاز به موارد و مسائل پایه. اما این ایده در اینجا این است که این دم بازگشتی، معنی که وقتی نوار تماس های اصلی آن را به قاب پشته آن است. در این قاب پشته وجود دارد که بلوک کمی از حافظه که مربوط به آرگومان x است. و بنابراین، اجازه دهید می گویند اصلی این اتفاق می افتد به نوار تماس (100)؛ پس X در حال رفتن به شروع کردن به عنوان 100. اگر کامپایلر به رسمیت می شناسد که این است که یک تابع بازگشتی دم، سپس وقتی که نوار باعث می شود تماس بازگشتی خود را به نوار، به جای ساخت یک قاب پشته جدید، است که که در آن پشته شروع می شود تا حد زیادی در حال رشد، در نهایت آن را به پشته اجرا شود و پس از آن segfaults شما می توانید زیرا حافظه شروع می شود برخورد. بنابراین به جای ساخت قاب پشته خود را، می تواند به درک، با سلام، من واقعا هرگز نیاز به دوباره به این قاب پشته، بنابراین به جای من فقط این استدلال با 99 و جایگزین سپس شروع به نوار بیش از همه. و سپس آن را دوباره آن را انجام دهد و آن را به نوار بازگشت برسد (X - 1)، و به جای ساخت یک قاب پشته جدید، آن را فقط به بحث کنونی خود را با 98 جایگزین و پس از آن به ابتدای نوار پرش. این عملیات، جایگزینی است که مقدار 1 را بر روی پشته و پریدن بازگشت به آغاز، بسیار کارآمد است. بنابراین نه تنها این است که استفاده از حافظه به عنوان یک تابع جداگانه است که تکرار شونده زیرا شما تنها با استفاده از 1 پشته قاب، اما شما در حال جنبه های منفی رنج می برند نه نیاز به فراخوانی توابع. فراخوانی توابع می توانند تا حدودی گران است چرا که آن را برای انجام تمام این تنظیمات و tearDown و همه این مسائل است. پس این بازگشت دم خوب است. [دانشجوی] چرا از آن مراحل جدید ایجاد کنید؟ از آنجا که آن را متوجه آن نیاز ندارد. تماس را در نوار تماس بازگشتی بازگشت. پس از آن نیازی به انجام هر کاری با مقدار بازگشتی. این فقط می خواهد که فورا آن را بازگشت. پس از آن فقط به جای استدلال خاص خود را دارد و بیش از شروع. و همچنین، اگر شما از نسخه دم بازگشتی نداشته باشند، سپس شما می توانید تمام این میله که در آن در زمانی که این نوار را برمی گرداند برای بازگشت به ارزش های خود را به این یکی، پس از آن که نوار بلافاصله برمی گرداند و آن را می گرداند ارزش خود را به این یکی، و سپس آن را فقط رفتن برای برگرداندن و بازگشت ارزش خود را به این یکی. بنابراین شما در حال صرفه جویی در ظاهر تمام این چیزها را از پشته از آنجا که مقدار بازگشتی برای رفتن به گذشت تمام راه برگشت تا به هر حال. پس چرا نه تنها جایگزین استدلال خود را با این استدلال به روز شده و شروع به بیش از؟ اگر تابع دم بازگشتی نیست، اگر شما چیزی شبیه به - [دانشجو] اگر نوار (x + 1). >> آره. بنابراین اگر شما آن را در وضعیت قرار داده است، پس از آن شما در حال انجام چیزی با ارزش بازگشت. یا حتی اگر شما فقط بازگشت 2 * نوار (x - 1). بنابراین در حال حاضر نوار (X - 1) نیاز به منظور بازگشت به آن برای محاسبه 2 بار که ارزش، بنابراین در حال حاضر آن را نشانی از نیاز خود را در قاب پشته جداگانه، و در حال حاضر، مهم نیست چقدر سخت شما سعی می کنید، شما نیاز به رفتن به - این دم نه بازگشتی است. [دانشجو] آیا من سعی می کنم بازگشت را به بازگشت دنباله هدف - [Bowden] در یک دنیای ایده آل، اما در CS50 شما ندارد. به منظور بدست آوردن بازگشت دم، به طور کلی، شما راه اندازی یک آرگومان اضافی که در آن نوار نوع int X به Y را و y مربوط به نهایی چیزی که شما می خواهید به بازگشت. بنابراین پس از این کار شما در حال رفتن به نوار (X - 1) 2 * Y است. به طوری که فقط یک سطح بالا چگونه شما تبدیل همه چیز به دم بازگشتی. اما این استدلال اضافی - و سپس در پایان هنگامی که شما در رسیدن به حالت پایه خود را، شما فقط Y بازگشت چون شما جمع آوری شده است، تمام مدت مقدار بازگشتی که شما می خواهید. شما از نوع آن را انجام می دهند تکراری اما با استفاده از تماس های بازگشتی است. پرسش و پاسخ؟ [دانش آموز] شاید در مورد ریاضی اشاره گر، مانند هنگام استفاده از رشته ها است. >> مطمئنا. ریاضی اشاره گر است. هنگام استفاده از رشته ها از آن آسان است، چرا که رشته ها ستاره کاراکتر، کاراکتر برای همیشه و همیشه تنها یک بایت، و ریاضی اشاره گر معادل به حساب منظم در هنگامی که شما در حال برخورد با رشته است. بیایید فقط کاراکتر * S = "سلام" می گویند. بنابراین ما باید یک بلوک در حافظه است. این نیاز به 6 بایت آنجا که شما همیشه نیاز به نابودگر تهی. و char * s به نقطه شروع این آرایه است. بنابراین نکات وجود دارد. در حال حاضر، این است که اساسا هر آرایه چگونه کار می کند، صرف نظر از اینکه آن را بازگشت malloc یا اینکه آیا آن را بر روی پشته بود. هر آرایه اساسا یک اشاره گر به شروع آرایه، و پس از آن هر گونه عملیات آرایه، هر نمایه سازی، فقط به آن آرایه خاصی افست. بنابراین، وقتی که من می گویند چیزی شبیه به [3]؛ این است که رفتن به و شمارش 3 کاراکتر وارد بنابراین [3]، ما باید 0، 1، 2، 3، بنابراین [3] برای اشاره به این ل. [دانشجو] و ما می توانیم همان مقدار با انجام S + 3 و سپس ستاره پرانتز برسد؟ بله. این است که معادل * (+ 3)؛ و این است که برای همیشه و همیشه معادل آن بدون توجه به آنچه که شما انجام می دهند. شما هرگز نیاز به استفاده از نحو براکت. شما همیشه می توانید * (+ 3) نحو استفاده کنید. مردم تمایل دارند به مانند نحو براکت، هر چند. [دانشجو] بنابراین، همه آرایه ها در واقع فقط به اشاره گر. است که تفاوت اندکی وجود دارد وقتی که من می گویند اعضای هیات X [4]؛ >> [دانشجو] که ایجاد حافظه؟ [Bowden] است که رفتن به 4 نوع داده int در پشته، به طوری که 16 بایت به طور کلی است. رفتن به 16 کلمه در ادامه متن بر روی پشته. X ذخیره شده است به جایی نمی. این فقط یک نماد با اشاره به آغاز از چیزی است. از آنجا که شما در داخل این تابع آرایه اعلام کرد آنچه که کامپایلر به انجام همه موارد متغیر x جایگزین که در آن اتفاق افتاده است را انتخاب کنید برای قرار دادن این 16 بایت است. این می تواند که با کاراکتر * را انجام ندهید زیرا اشاره گر واقعی است. سپس به چیزهای دیگر آن آزاد است. X ثابت است. شما نمی توانید آن را به یک آرایه های مختلف نقطه. >> [دانشجو] باشه. اما این ایده، این نمایه سازی، همان است که صرف نظر از اینکه آن را در یک آرایه سنتی یا اگر آن را در یک اشاره گر به چیزی و یا اگر آن را به یک اشاره گر به یک آرایه malloced است. و در واقع، آن است که معادل است که همان چیزی. در واقع فقط ترجمه آنچه در داخل براکت و چه از براکت سمت چپ، اضافه می کند آنها را با هم، و ارجاع میدهد. بنابراین این فقط به عنوان به عنوان معتبر * (+ 3) یا S [3]. [دانشجو] آیا می توانم اشاره گر با اشاره به آرایه های 2 بعدی به شما داشته باشد؟ آن سخت تر است. به طور سنتی، نه. آرایه 2 بعدی است فقط یک آرایه 1 بعدی با برخی از نحو مناسب زیرا وقتی که من می گویند اعضای هیات X [3] [3]، این است که واقعا فقط 1 مجموعه ای با 9 ارزش است. و تا زمانی که من شاخص، کامپایلر می داند منظورم چیست. اگر من می گویم X [1] [2]، می داند که من می خواهم برای رفتن به سطر دوم، پس از آن رفتن به صفحه 3 نخست و سپس آن را می خواهد نکته دوم که در آن، پس از آن با رفتن به این یکی. اما این هنوز فقط یک آرایه تک بعدی است. و بنابراین اگر من می خواستم یک اشاره گر به آرایه ای که به او واگذار، من می خواهم بگویم از نوع int * p = X. نوع X - این نوع خشن گفت: از X را از آن فقط یک نماد است و آن را در یک متغیر واقعی نیست، اما این تنها * نوع int است. X فقط یک اشاره گر به شروع این است. >> [دانشجو] باشه. و بنابراین من نمی قادر خواهد بود برای دسترسی به [1] [2]. من فکر می کنم نحو خاص برای تعریف یک اشاره گر وجود دارد، چیزی مسخره مانند نوع int (* P [- چیزی کاملا مضحک من حتی نمی دانند. اما یک نحو برای تعریف اشاره گرها مانند با پرانتز و همه چیز وجود دارد. حتی ممکن است به شما اجازه انجام این کار است. من می توانم به عقب نگاه چیزی که من حقیقت را بگو. من برای آن نگاه کنید بعد از آن، اگر به نحو برای نقطه وجود دارد. اما شما آن را هرگز. و حتی به نحو کهنه است به طوری که اگر شما از آن استفاده کنید، مردم خواهد بود گیج است. آرایه های چند بعدی بسیار نادر هستند به عنوان آن است. شما بسیار - خوب، اگر شما در حال انجام کارهایی ماتریس آن را نمی خواهید به نادر، اما در C شما به ندرت می شود با استفاده از آرایه های چند بعدی. آره. >> [دانشجو] بیایید می گویند شما باید یک آرایه واقعا طولانی است. بنابراین در حافظه مجازی، به نظر می رسد به همه پشت سر هم، مانند عناصر درست در کنار یکدیگر، اما در حافظه فیزیکی، آن را ممکن است برای آن که این تقسیم کردن؟ >> بله. چگونه با این نسخهها کار مجازی حافظه آن است که تنها جدا - واحد تخصیص یک صفحه، که تمایل به 4 کیلوبایت است، و بنابراین، هنگامی که یک فرایند می گوید، با سلام، من می خواهم به استفاده از این حافظه، سیستم عامل آن را به 4 کیلوبایت است که بلوک های کمی از حافظه را تخصیص. حتی اگر شما تنها یک بایت کمی تنها در تمام بلوک از حافظه استفاده کنید، سیستم عامل آن را به 4 کامل کیلوبایت. بنابراین این بدان معنی است من می توانستم - بیایید می گویند این است که پشته من. این پشته می تواند از هم جدا شوند. پشته من می تواند مگابایت و مگابایت. پشته من می تواند بزرگ باشد. اما پشته خود را به صفحات خاص تقسیم می شود، که اگر ما در اینجا نگاه کنید اجازه دهید می گویند این است که RAM ماست، اگر من دارای 2 گیگابایت RAM، 0 آدرس واقعی مانند 0 بایت از RAM من است، و این 2 گیگابایت تمام راه را در اینجا می باشد. پس این صفحه ممکن است به این بلوک در اینجا مطابقت داشته باشد. این صفحه ممکن است به این بلوک در اینجا مطابقت داشته باشد. این یکی ممکن است به این یکی در اینجا مطابقت دارد. بنابراین سیستم عامل رایگان است برای اختصاص حافظه فیزیکی به هر صفحه ای فردی را خودسرانه. و این بدان معنی است که اگر این مرز اتفاق می افتد را به گشاد گشاد راه رفتن یک آرایه، آرایه ای اتفاق می افتد از این به چپ و راست به این منظور از یک صفحه، پس از آن که آرایه در حافظه فیزیکی تقسیم می شود. و پس از آن زمانی که شما ترک این برنامه، وقتی که این فرایند به پایان می رسد، این نگاشت دریافت پاک می شود و سپس آن را برای استفاده از این بلوک های کوچک برای چیزهای دیگر. بیشتر است؟ [دانشجو] ریاضی اشاره گر. >> اوه آره. رشته آسان تر بود، اما به دنبال چیزی شبیه به نوع داده int، بنابراین به نوع int X [4]؛ آیا این یک آرایه یا اینکه آیا این یک اشاره گر به یک آرایه از 4 عدد صحیح malloced، آن را به همان شیوه به درمان می شود. [دانشجو] آرایه در پشته هستند؟ [Bowden] آرایه ها در پشته. >> [دانشجو] آه. [Bowden] این نوع از آرایه تمایل دارد در پشته مگر اینکه شما آن را اعلام کرد - نادیده گرفتن متغیر های جهانی است. متغیر های جهانی استفاده نمی کند. در داخل یک تابع من می گویم اعضای هیات X [4]؛ رفتن به ایجاد یک بلوک 4 عدد صحیح را بر روی پشته برای این آرایه است. اما این malloc (4 * sizeof (هوشمند))؛ رفتن به پشته. اما بعد از این مرحله من می تواند x و P در خیلی راه همان استفاده کنید، غیر از استثنا من گفت: قبل از اینکه در مورد شما می توانید P جابهجا. با مشخصات فنی، اندازه آنها تا حدودی متفاوت است، اما این کاملا بی ربط است. شما در واقع هرگز به استفاده از اندازه آنها است. P من می توانم بگویم P [3] = 2؛ یا X [3] = 2؛ شما می توانید آنها را دقیقا در همان راه استفاده کنید. پس حسابی اشاره گر کن - بله. [دانشجو] آیا شما باید به انجام * P در صورتی که دارای براکت؟ براکت dereference ضمنی است. >> درست است. در واقع، آنچه که شما در حال گفت: با می توانید آرایه های چند بعدی شما می توانید با اشاره گر، چیزی شبیه به آنچه که شما می توانید انجام دهید این است، بیایید می گویند، اعضای هیات ** PP = malloc (sizeof (هوشمند) * 5)؛ من فقط آن را از اول بنویسید. من که یکی را نمی خواهم. باشه. چیزی که من در اینجا این است - که باید PP های [i]. بنابراین PP، یک اشاره گر به اشاره گر است. شما در حال mallocing PP به نقطه را به یک آرایه از 5 ستاره از نوع int است. بنابراین در حافظه شما در صفحات پشته رفتن به نقطه را به یک آرایه از 5 بلوک است که همه خود اشاره گر. و پس از آن زمانی که من malloc را در اینجا، من malloc است که هر یک از آن اشاره گرها فردی باید نقطه به یک بلوک جداگانه از 4 کلمه در ادامه متن بر روی پشته. بنابراین این نقاط تا 4 بایت است. و این یکی از نقاط مختلف به 4 بایت است. و همه آنها را به خود 4 بایت است. این به من راه انجام کارها چند بعدی است. من می توانم PP [3] [4]، اما در حال حاضر این است که همان چیزی که به عنوان آرایه های چند بعدی می گویند چرا که آرایه های چند بعدی آن را ترجمه شده [3] [4] به یک افست در آرایه X است. این P ارجاع میدهد، دسترسی به شاخص سوم، و سپس ارجاع میدهد که و دسترسی - 4 نامعتبر - شاخص دوم است. در حالی که زمانی که ما تا به حال از INT X [3] [4] قبل از به عنوان یک آرایه چند بعدی و هنگامی که قلاب شما به دو برابر آن را واقعا تنها dereference تنها، شما تنها یک اشاره گر را دنبال و پس از آن جبران، این است که واقعا منابع 2D. شما به دنبال 2 اشاره گر جداگانه. بنابراین این امر به لحاظ تکنیکی نیز اجازه می دهد تا شما را به آرایه های چند بعدی که در آن هر یک از آرایه های فردی در اندازه های مختلف است. بنابراین من فکر می کنم دندانه دار آرایه های چند بعدی همان چیزی است که آن را به نام از آنجا که اولین چیزی که واقعا می تواند به چیزی است که دارای 10 عنصر اشاره، دومین چیزی که می تواند به چیزی است که 100 عنصر. [دانشجو] آیا محدودیتی وجود دارد به تعدادی از اشاره گرها شما می توانید با اشاره به اشاره گر دیگر؟ >> شماره شما می توانید نوع int ***** P. بازگشت به محاسباتی اشاره گر - >> [دانشجو] آه. >> آره. [دانشجو] اگر من از نوع int *** P و سپس من غیر مرجع و من می گویم * P برابر این مقدار است، آن را تنها به 1 درجه از غیر مرجع؟ >> بله. پس اگر من می خواهم برای دسترسی به چیزی که اشاره گر گذشته است با اشاره به در - سپس شما P ***. >> درست است. بنابراین این نقاط P تا 1، بلوک، امتیاز خود را به دیگری بلوک، امتیاز خود را به دیگری بلوک. اگر شما * p = چیز دیگری، و سپس شما در حال تغییر در این در حال حاضر به یک بلوک های مختلف. >> درست است. [Bowden] و اگر این malloced، و سپس شما در حال حاضر به بیرون درز حافظه مگر اینکه شما اتفاق می افتد را به منابع مختلف از این از شما نمی تواند به عقب بر گردیم به کسانی که آنهایی که شما فقط به دور انداخت. ریاضی اشاره گر است. اعضای هیات X [4]؛ رفتن به تخصیص یک آرایه از 4 عدد صحیح که در آن X رفتن به نقطه به ابتدای آرایه. بنابراین، هنگامی که من می گویم چیزی شبیه به X [1]، من می خواهم آن را به معنی رفتن به دومین عدد صحیح در آرایه، خواهد بود که این یکی. اما واقعا، که 4 بایت را به آرایه از آنجا که این عدد صحیح طول می کشد تا 4 بایت است. بنابراین افست، از مجموع 1 واقعا به معنای جبران، از مجموع 1 بار اندازه از هر نوع از آرایه است. این آرایه ای از اعداد صحیح است، پس از آن می داند که به انجام 1 بار اندازه بین المللی زمانی که آن را می خواهد به جبران است. نحو دیگر. به یاد داشته باشید این است که معادل * (x + 1)؛ وقتی که من می گویند اشاره گر + 1، آنچه را که بازده است آدرس که اشاره گر ذخیره سازی به علاوه 1 بار اندازه از نوع اشاره گر است. بنابراین اگر x = ox100، آنگاه x + 1 = ox104. و شما می توانید از این سوء استفاده می گویند چیزی مثل کاراکتر * c = (کاراکتر) ایکس؛ و در حال حاضر C است برای رفتن به آدرس همان X است. ج به برابر با ox100، اما C + 1 خواهد بود برابر با ox101 از آنجا که حسابی اشاره گر بستگی به نوع اشاره گر است که شما اضافه کردن به. بنابراین C + 1، آن را در C به نظر می رسد، آن را در یک اشاره گر کاراکتر، به طوری که آن را برای اضافه کردن 1 بار اندازه کاراکتر، است که همیشه رفتن به 1 است، بنابراین شما می توانید 101، در حالی که اگر من x، که هنوز هم 100، x + 1 خواهد بود 104. [دانشجو] آیا می توانم به شما استفاده از C + + به منظور پیشبرد اشاره گر خود را با 1؟ بله، شما می توانید. شما می توانید که با X کار نمی کند چرا که X فقط یک نماد است، آن را به یک ثابت است، شما می توانید X را تغییر دهید. اما C اتفاق می افتد فقط یک اشاره گر، و بنابراین C + + کاملا معتبر است و آن را توسط 1 افزایش است. اگر C فقط یک نوع int *، و سپس C + + خواهد بود 104. + + ریاضی اشاره گر فقط به عنوان C + 1 ریاضی اشاره گر را انجام داده اند. این است که در واقع بسیاری از چیزهایی مانند مرتب کردن بر اساس ادغام - به جای ایجاد کپی از همه چیز، شما می توانید به جای عبور - خواهم اگر من می خواستم به تصویب این نیمی از آرایه - اجازه را به پاک کردن برخی از این. بیایید می گویند من می خواستم به تصویب این طرف از آرایه به یک تابع است. چه من که به تابع منتقل می شود؟ اگر من عبور x، من در عبور از این آدرس. اما من می خواهم به تصویب این آدرس خاص است. پس چه باید منتقل کنم؟ [دانشجوی] اشاره گر + 2؟ [Bowden] بنابراین X + 2. بله. که رفتن به این آدرس می باشد. شما همچنین می خواهید که اغلب آن را به عنوان X [2] و سپس آدرس آن است. بنابراین شما نیاز دارید را به آدرس آن را به خاطر براکت dereference ضمنی است. X [2] اشاره به ارزش است که در این جعبه، و سپس شما می خواهید آدرس آن جعبه، بنابراین شما می گویند و X [2]. به طوری که چگونگی چیزی در ادغام مرتب کردن بر اساس جایی که شما می خواهید به تصویب بیش از نیمی از لیست را به چیزی شما واقعا فقط عبور و X [2]، و در حال حاضر تا آنجا که به عنوان تماس بازگشتی نگران است، آرایه جدید من شروع می شود وجود دارد. سوالات در آخرین لحظه. [دانشجو] اگر ما یک علامت قرار داده است - آنچه که به نام؟ >> ستاره چقدر است؟ [دانشجو] ستاره. >> مشخصات فنی، اپراتور dereference، اما - >> [دانشجو] Dereference. اگر ما یک ستاره و یا یک علامت قرار داده است، چه اتفاقی می افتد اگر من فقط می گویند Y = X و X یک اشاره گر است؟ نوع Y به چه صورت است؟ >> [دانشجو] من فقط می گویند اشاره گر آن 2. بنابراین اگر شما فقط می گویند Y = X، در حال حاضر نقطه X و Y به یک چیز واحد است. >> [دانشجو] نقطه به یک چیز واحد است. و اگر x یک اشاره گر از نوع int است؟ >> این شکایت به دلیل این که شما می توانید اشاره گر را مشخص نمی کند. [دانشجو] خوب. به یاد داشته باشید که اشاره گر، حتی اگر آنها را در قرعه کشی به صورت فلش، واقعا تمام فروشگاه - هوشمند * X - واقعا همه X است که ذخیره سازی چیزی شبیه به ox100 است، که ما اتفاق می افتد به عنوان اشاره به بلوک های ذخیره شده در 100 نمایندگی. بنابراین، هنگامی که من می گویم هوشمند * Y = X، من فقط کپی ox100 به Y، که ما فقط رفتن به عنوان Y نمایندگی، همچنین با اشاره به ox100. و اگر من می گویم من بین المللی = (هوشمند) X، پس از آن من در حال رفتن به مغازه هر ارزش از ox100 است در داخل آن، اما در حال حاضر آن را به عنوان یک عدد صحیح به جای اشاره گر تفسیر می شود. اما شما نیاز به بازیگران و یا دیگری آن شکایت دارند. [دانشجو] پس منظورت بازیگران - آیا برای رفتن به ریخته گری بین المللی بین المللی یا ریخته گری X از Y؟ [Bowden] چیست؟ [دانشجو] خوب. پس از این پرانتز وجود دارد رفتن به X یا آی وجود دارد؟ [Bowden] یا. x و y هم معادل هستند. >> [دانشجو] باشه. از آنجا که آنها هر دو اشاره گر است. >> آره. [دانشجو] پس از آن در 100 هگزادسیمال را در فرم صحیح ذخیره؟ >> [Bowden] آره. اما ارزش هر آنچه که به آن اشاره نمی شود. [Bowden] آره. >> [دانشجو] پس فقط آدرس در فرم صحیح است. باشه. [Bowden] اگر شما می خواهید برای برخی از این دلیل عجیب و غریب، شما منحصرا می تواند در مقابله با اشاره گر و مقابله با اعداد صحیح هرگز و فقط برای مثال، int * x = 0 باشد. سپس شما در حال رفتن به واقعا اشتباه یک بار حسابی اشاره گر شروع می شود اتفاق می افتد. بنابراین اعداد که آنها را ذخیره می کنند بی معنی است. به این که چقدر شما را تا پایان تفسیر آنها. بنابراین من برای کپی ox100 از * نوع int به نوع int، و من را به او واگذار - you're احتمالا رفتن به فریاد می زدند: در برای ریخته گری نیست - من را به او واگذار چیزی شبیه به (هوشمند) ox1234 به این نوع int * خودسرانه است. بنابراین ox123 است به همان اندازه معتبر یک آدرس حافظه است و Y است. و سالانه اتفاق می افتد به بازگشت این چیزی است که بسیار ox123. [دانشجوی] است که می تواند واقعا سرد راه برای رفتن از مبنای شانزده به شکل دهدهی، می خواهم در صورتی که دارای یک اشاره گر و شما آن را به عنوان یک int بازیگران است؟ [Bowden] شما واقعا فقط می تواند با استفاده از مثل printf نسخه قابل چاپ. اجازه دهید بگویم که اعضای هیات Y = 100 است. بنابراین printf (٪ D \ n - به عنوان شما در حال حاضر باید بدانید - نسخه قابل چاپ است که به عنوان یک عدد صحیح، x٪ است. ما فقط آن را به عنوان مبنای شانزده نسخه قابل چاپ. بنابراین یک اشاره گر است که به عنوان مبنای شانزده ذخیره می شود، و یک عدد صحیح است که به عنوان اعشار ذخیره می شود. همه چیز همان است باینری ذخیره می شوند. مسئله این است که ما تمایل به نشان دادن اشاره گر به عنوان مبنای شانزده چرا که ما از همه چیز در این بلوک 4-BYTE فکر می کنم، و آدرس های حافظه تمایل دارند آشنا می شود. ما مثل، اگر آن را با BF شروع می شود، پس از آن اتفاق می افتد بر روی پشته. پس از آن تنها تفسیر ما از اشاره گرها به عنوان مبنای شانزده است. باشه. هر گونه سوالات تاریخ و زمان آخرین؟ من در اینجا خواهم بود برای کمی پس از اگر شما هر چیز دیگری. و این که در پایان آن است. [دانشجو] عالیست! [تشویق حضار] [CS50.TV]