درود بر شما خیلی خوش اومدید به #قدم_اول از سری آموزش سی پلاس پلاس، در قسمت قبل، این دوره آموزشی رو معرفی کردم و نکاتی رو که برای استفاده هر چه بهتر از این دوره نیاز دارید متذکر شدم، پس اگر هنوز اون رو ندیدید لطفا اول قسمت 0 رو ببینید و بعد به این قسمت برگردید.
و اما بریم که شروع کنیم در این قسمت قراره یکمی با زبان های برنامه نویسی آشنا بشیم و خب قراره یکم دید واضح تری نسبت به موضوع پیدا کنیم تا در آینده بتونیم منطق پشت هر تیکه کد رو بهتر درک کنیم پس حتی اگر برنامه نویس هم هستید سعی کنید این مطلب رو دقیق مطالعه کنید. در این پست من مطالب سایت learncpp.com رو بعلاوه چندین سایت دیگه، ترجمه کردم تا مطالب خیلی دقیق تر و واضح تر در ذهن شما شکل بگیره از طرفی سعی کردم اون قسمت هایی که نیاز هست بیشتر توضیح داده بشه رو از زبان خودم بیشتر توضیح بدم 💗.
خب دیگه بریم که شروع کنیم.
مفاهیم پایه و ترمینالوژی برنامه نویسی
کامپیوتر های مدرن به طرز خارق العاده ای سریع هستند و همینطور هم دارند سریع تر میشوند. با این حال، یه سری محدودیت هم دارند : برای مثال اونا به صورت طبیعی (منظورش کامپیوتر های عادی ای هست که ما امروز استفاده میکنیم همون pc ها) فقط یه مجموعه محدود از دستورات (Commands) رو میفهمند و دقیقا باید بهشون بگیم که چیکار کن تا یه کاری رو واسمون انجام بدن.
یک برنامه کامپیوتری (که عموما بهش اپلیکیشن (Application) هم گفته میشه) یک سری مجموعه از دستورالعمل هایی هست که کامپیوتر میتونه اجرا کنه تا یک سری کار بخصوص رو برای ما انجام بده.
از فرهان : « نکته خیلی مهم اینجاست حتما یادتون باشه که دستورالعمل (Instructions) با دستور (Command) فرق میکنه! در واقع دستور یا همون Command (نحوه خواندن : کا مَند ، و فشار کلمه رو روی مَ بگذارید) در زبان های برنامه نویسی مفهوم خاصی دارند و بر میگردن به یک سری کلمه یا عبارت خاص که عملیات خاصی رو برای ما انجام میدن برای مثال در کد زیر ما داریم از دستور ECHO در ویندوز استفاده میکنیم که در محیط CMD یک متن رو برای ما چاپ کند :
:: این کد رو کپی کنید و در محیط سی ام دی ویندوز پیست کنید تا ببینید که چه اتفاقی می افتد
ECHO "I'm Farhan"
در این مثال کلمه ECHO یک دستور هست چرا که ما با یک کلمه تونستیم به کامپیوتر بفهمانیم و بگیم که جمله : "I'm Farhan" روی صفحه چاپ کن . اما در مقابل دستورالعمل ها چی هستند؟ زمانی که از کلمه دستور العمل در متون انگلیسی ای که در مورد زبان های برنامه نویسی هست استفاده میشه قضیه بر میگرده به نحوه پردازش کد ها توسط کامپیوتر ، همونطور که چند خط قبل گفتم کامپیوتر ها یک سری محدودیت دارند که یکی از اون ها اینه که باید دقیقا بهشون بگی چیکار کن و ما این کار رو با دستورات یا همون command ها میکنیم اما وقتی که این دستورات رو نوشتیم حالا باید کامپیوتر این دستورات رو پردازش کنه ما به مجموعه ای از دستورات که به صورت مرحله به مرحله به کامپیوتر میگه که چیکار کن ، میگیم دستورالعمل ! به مثال زیر توجه کنید :
تصور کنید که میخواید به یک کامپیوتر بگید که یک مربع بکشه ! خب برای این کار باید به صورت مرحله به مرحله دستوراتی رو به کامپیوتر بدیم تا کامپیوتر اون ها رو پردازش کنه و این کار رو برای ما بکنه برای این کار به زبان فارسی باید به این شکل عمل کنیم :
نکته اعدادی که در تصویر میبینید شماره مرحله هایی هست که در بلوک کد زیر براتون نوشتم. و نقطه قرمز همان نقطه A هست.
1 - شروع برنامه
2- از نقطه A شروع کن
3- به اندازه 5 سانتی متر به سمت راست برو و نود درجه به پایین بچرخ
4- به اندازه 5 سانتی متر به سمت پایین برو و نود درجه به چپ بچرخ
5- به اندازه 5 سانتی متر به سمت چپ برو و نود درجه به بالا بچرخ
6- به اندازه 5 سانتی متر به سمت بالا برو
7- پایان برنامه
خب وقتی کامپیوتر این کد رو دریافت میکنه شروع به پردازش میکنه به این صورت که از مرحله 1 تا 7 رو به ترتیب انجام میده ما به این مجموعه کد که به صورت مرحله به مرحله توسط کامپیوتر پردازش میشه میگیم دستورالعمل (Instructions) و به به کلماتی مثل بچرخ و برو که در واقع دستور خاصی رو به کامپیوتر میدن میگیم دستور (Command) . امیدوارم فهمیده باشید (این بخش جزو مقاله آموزشی سایت learncpp.com نبود ولی دوست داشتم واستون بازش کنم!) »
اما خب برگردیم به بحث اصلیمون داشتیم در مورد برنامه های کامپیوتری میگفتیم که بهش اپلیکیشن هم میگیم و گفتیم که این برنامه های کامپیوتری در واقع یه مشت کد هستند که توسط کامپیوتر میتونن اجرا بشند ، تا یه سری کار رو برای ما انجام بدن. حالا ما به روند ساخت یک برنامه میگیم برنامه نویسی (Programming) ، برنامه نویس ها معمولا برنامه ها رو با تولید کد منبع شون (Source Code) میسازند (که به اختصار بهش میگیم کد (Code)) . کد منبع (Source Code) ها لیستی از دستوراتی هستند که برنامه نویس در یک یا چند فایل متنی نوشته اند. به عبارتی یک برنامه نویس با ایجاد یک کد منبع که پر از دستور و دستور العمل هست ، یک برنامه کامپیوتری یا اپلیکیشن رو میسازه.
اما بریم سراغ سخت افزار ، عموما وقتی در هنگام برنامه نویسی از سخت افزار صحبت میکنیم منظورمون سخت افزار درونی (Internal Hardware) هستش اما قبل از این که درمورد سخت افزار درونی صحبت کنیم بیاید تا ببینیم که سخت افزار چی هست : به مجموعه ای از بخش های فیزیکی ای که یک کامپیوتر رو میسازند و برنامه ها رو اجرا میکنند سخت افزار (Hardware) میگیم ، مثلا همین مانیتوری که دارید باهاش این صفحه رو نگاه میکنید یک سخت افزار هست . حالا سخت افزار دو نوع هست یکی درونی یکی خارجی ، خارجی مثل USB (فلش) و داخلی مثل RAM و CPU .
حالا زمانی که یک برنامه کامپیوتری روی مموری (حافظه) یک کامپیوتر بالا میاد و سخت افزار اون کامپیوتر ، دستورالعمل های اون برنامه رو به صورت آبشاری (یعنی از خط های بالا به پایین - دقیقا همون مرحله به مرحله) اجرا میکنه، میگیم که برنامه در حال اجراست که در زبان انگلیسی از دو لفظ (Running) و (Executing) استفاده میشه .
آشنایی با زبان ماشین
مغز کامپیوتر که بهش میگیم CPU نمیتونه کد های ++C یا Python یا حتی Java رو به صورت مستقیم درک کنه ، اون مجموعه ی محدودی از دستورالعمل ها رو که یک CPU میتونه به صورت مستقیم درک کنه رو بهش میگیم کد ماشین (Machine Code) یا زبان ماشین (Machine Language) یا این که به طور کلی بهش میگیم یک اینستراکشن سِت (Instruction Set).
خب بریم که یک مثال از زبان ماشین ببینیم :
10110000 01100001
اون قدیم مدیما وقتی کامپیوتر ها تازه اختراع شده بودند ، برنامه نویس ها مجبور بودند که برنامه هاشون رو مستقیما به این زبان 👆 (زبان ماشین) بنویسند که به شدت سخت و زمان بر بود حالا این که چطوری این 0 و 1 ها به وجود اومدند و سازمان دهی شدند رو توی این مقدمه نمیشه گفت چون از بحث این فصلِ مقدمه خارجه ولی دوتا چیز جالب هست که بهتره بدونیم ؛ یک این که در زبان ماشین همونطور که در مثال بالا دیدید هر دستور العمل متشکل از دنباله ای از 0 و 1 ها هست که به هرکدوم از این 0 یا 1 ها میگیم ارقام دودویی (Binary Digits) یا به اختصار ، بیت (binary digits = bit).
در کامپیوتر های مختلف تعداد بیت هایی که میتونن یک دستور (Command) بسازند متفاوته (منظورم اینه که تعداد 0 و 1 هایی که پشت هم میان تا به کامپیوتر یه دستور بدن متفاوته) مثلا بعضی از CPU ها فقط دستور العمل هایی رو پردازش میکنند که تا 32 بیت طول داشته باشند (یعنی 32 تا 0 یا 1 پشت سر هم باشند) این در حالی هست که بعضی از CPU های دیگه مثل خانواده X86 (که احتمالا شما هم از همون ها استفاده میکنید) دستورالعمل هایی رو میتونن پردازش کنند که طول متفاوتی دارند .
دومی این که ، هر مجموعه از ارقام دودویی توسط CPU به یک دستور برای انجام یک کار خاص تفسیر میشه . و اون کار خاص میتونه هر چیزی باشه مثلا این که بگیم : این دوتا عدد رو با مقایسه کن یا این عدد رو در فلان قسمت از مموری قرار بده . با این حال دستورالعمل هایی که واسه یک نوع CPU می نوشتیم رو نمیتونستیم روی یک کامپیوتر دیگه با نوع CPU متفاوت استفاده کنیم اونم به این دلیل که هر نوع CPU مجموعه دستورالعمل های مختص خودش رو درک میکنه . این به این معناست که عموما برنامه ها قابل حمل (Portable) نبودند (یعنی نمیشد راحت یک برنامه مثل نوت پد رو که الان روی همه کامپیوتر ها با هر نوع سخت افزاری وجود داره رو روی یک کامپیوتر نوشت و به راحتی روی باقی کامپیوتر ها نصب کرد چون هر CPU از دستورالعمل ها درک خاصی داره و عموما یک استاندارد کلی وجود نداشت که بتونیم یک برنامه بنویسیم و همه جا و روی هر کامپیوتری که دوست داریم استفادش کنیم و مجبور بودیم برای هر کامپیوتر از نو برنامه رو بسازیم)
آشنایی با زبان اسمبلی
خب از اونجایی که درک کردن و فهمیدن زبان ماشین برای ما آدما خیلی سخت هست، دانشمند ها زبان اسمبلی رو اختراع کردن ، توی این زبان هر دستورالعمل به جای مجموعه ای از اعدادِ 0 و 1 به صورت یک حرف کوتاه شده مشخض شده و این که میشه از اعدادی به غیر از 0 و 1 و همینطور اسم ها و کارکتر هایی به غیر از 0 و 1 استفاده کرد .
مثلا بیاید همون مثالی که بالا برای زبان ماشین زدیم رو با زبان اسمبلی بنویسیم :
mov al, 061h
با این اوصاف اسمبلی به نسبت زبان ماشین راحت تر خونده و نوشته میشه با این حال CPU ها نمیتونند به طور مستقیم زبان اسمبلی رو درک کنند. پس برای این که کامپیوتر بتونه یک برنامه که به زبان اسمبلی نوشته شده رو اجرا کنه باید اول کد این برنامه رو به زبان ماشین ترجمه کنیم و ما این کار رو به وسیله یه برنامه انجام میدیم که بهش میگیم اسمبلر (Assembler) . برنامه هایی که به زبان اسمبلی نوشته میشوند انتظار میره که خیلی سریع باشند (ازفرهان : دلیلی که از کلمه انتظار میره استفاده شده به این خاطره که اگر کدتون رو بد نوشته باشید و غیر استاندارد باشه مهم نیست که به چه زبانی اون رو نوشتید پس خیلی مهمه که استاندارد نوشتن و خوب نوشتن رو از همین اول کار یاد بگیرید.) و این که از زبان اسمبلی هنوز هم استفاده میشه مخصوصا جاهایی که سریع بودن برنامه یک خواسته قطعی باشه!
با همه این تفاسیر اسمبلی هنوز هم یه سری جنبه منفی داره ،اول این که هنوز برای این که یه سری کار ساده انجام بدیم باید کلی دستورالعمل بنویسیم . در حالی که هر تیکه از کد یک برنامه رو میتونیم بفهمیم ولی فهمیدن کل یک برنامه با خوندن کد هاش وقتی که به زبان اسمبلی باشه واقعا کار چالشی ای میتونه باشه (و بیشتر شبیه به این میمونه که سعی کنید یه جمله رو بخونید اونم به این شکل که به صورت حرف حرف بخونید مثلا جای این که بخونید سلام بخونید س ل آ م) دوم این که زبان اسمبلی هنوزم اونقدرا قابل حمل نیست ، یک برنامه که به زبان اسمبلی برای یک نوع CPU ساخته شده به احتمال زیاد روی سخت افزاری (CPU) که یک مجموعه دستورالعمل متفاوت رو درک میکنه کار نمیکنه و باید که برنامه رو کامل از نو برای CPU جدید بنویسیم یا این که به شدت ویرایشش کنیم.
از فرهان : خب تا اینجا به صورت خلاصه فهمیدیم که اون اوایل زبان ماشین بوده که خب خیلی خوانا نبوده و ما نمیتونستیم راحت بخونیمش و بنویسیمش و از طرفی هم قابل حمل نبوده یعنی اگر روی کامپیوترتون یه برنامه مینوشتید به احتمال زیاد مجبور بودید واسه هر کامپیوتر دیگه ای توی دنیا برید و از نو برنامه رو بنویسید . بعدش میان اسمبلی رو میسازن که مشکل خوانایی رو حل کنن که خب تا حدودی موفق هم بودن ولی قضیه اینجوری بوده که خب باز قابل حمل نبوده و همون مشکل رو داشته . اما حالا میخوایم بریم سر وقت باحال ترین قسمت این مقاله که میشه معرفی و آشنایی با زبان های سطح بالا 😍 . آماده ای ؟ بزن بریم!
آشنایی با زبان های سطح بالا
خب برای این که مشکلاتی از قبیل خوانایی کد و قابل حمل بودن رو اداره کنیم و حداقل کمترش کنیم زبان های جدیدی مثل سی ، سی پلاس پلاس ، پاسکال (و بعد ها هم زبان هایی مثل جاوا، پرل و جاوا اسکریپت) ساخته و توسعه داده شدند ، این زبان ها که بهشون زبان های سطح بالا (High-Level Languages) میگیم به برنامه نویس ها این اجازه رو میدادند که با خیال راحت برنامه بنویسند اونم بدون این که نگران این باشند که این برنامه بعدا قراره روی چه نوع کامپیوتری (CPU ای) اجرا بشه . (از فرهان : پس به عبارتی تا حد زیادی زبان های سطح بالا مشکل قابل حمل نبودن رو حل کرد اما بریم سراغ خوانایی زبان های سطح بالا)
خب بیاید قبل از این که ادامه بدیم همون مثالی رو که برای زبان ماشین و اسمبلی زدیم رو به زبان ++C که یک زبان سطح بالاست رو بنویسیم :
a = 97;
(از فرهان : خب فکر میکنم الان فهمیدید که منظورم از خوانایی چی هست چون حداقل الان میتونیم بگیم که حرف a برابر 97 هست ولی توی مثال های قبلی واقعا خیلی سخت میشد که همچین چیزی رو بفهمیم [ باید بگم که این = علامت توی برنامه نویسی مساوی نیست بلکه علامت اختصاص دادنه که بعدا در موردش حرف میزنیم فقط اینجا دارم این رو میگم که بدونیم بحثمون از این که میگفتیم فلان زبان خوانا نیست یا درکش برای انسان سخته و اینا چی هست ].)
برنامه هایی که به زبان های سطح بالا نوشته میشوند مثل برنامه های اسمبلی برای اجرا شدن نیاز دارند تا به فرمتی ترجمه بشوند که کامپیوتر میتونه درک کنه و به طور کلی دو راه واسه این کار هست : 1 - کامپایل کردن با استفاده از کامپایلر -2- تفسیر کردن با استفاده از مفسر
کامپایلر (Compiler) برنامه ای هست که کد منبع یک برنامه رو میخونه و یک فایل (برنامه) ایجاد میکنه که میتونه به صورت مستقل قابل اجرا باشه (Stand-alone executable program) ! وقتی که کدتون تبدیل به یک فایل قابل اجرا شد، دیگه برای اجرای برنامه نیازی به کامپایلر ندارید اون اوایل، کامپایلر های اولیه سرعت بسیار کمی داشتند و همینطور در آخر، برنامه ای با کد های غیر بهینه ایجاد میکردند. با این حال، در طول این سال ها کامپایلر ها خیلی بهتر شدند، هم سرعتشون بالا رفته و هم این که کد های بهینه ای تولید میکنند، و در خیلی از جاها حتی کارشون از کاری که آدم ها توی زبان اسمبلی انجام میدادند بهتره !
اما بریم سراغ فرایند کامپایل کردن یعنی همون کاری که یک کامپایلر میکنه ، خب بیاید یه مثال ساده از کاری که یک کامپایلر میکنه ببینیم :
از اونجایی که عموما کد هایی که به زبان ++C مینویسیم رو کامپایل میکنیم پس یه کوچولو جلوتر (توی درس های بعدی) در مورد کامپایلر ها بیشتر حرف میزنیم .
اما بریم سراغ مفسر و عملیات تفسیر کردن :
به برنامه ای میگیم مفسر (Interpreter) که بدون این که نیاز باشه، که یک فایل مستقل قابل اجرا بسازه، همینجور دستورالعمل های توی یک کد رو مستقیما میخونه و اجرا می کنه. مفسر ها معمولا منعطف تر از کامپایلر ها هستند اما کارآمدیشون به هنگام اجرای برنامه ها کمتر از کامپایلر ها هست اونم به این خاطر که شما برای اجرای برنامتون هر بار نیاز به یک مفسر دارید این درحالیه که در فرآیند کامپایل کردن شما فقط یک بار یک برنامه رو کامپایل میکنید و بعدش به راحتی میتونید بدون نیاز به کامپایلر اجراش کنید .
بریم یه عکس هم از فرایند تفسیر کردن ببینیم :
سعی کنید نِرد باشید و بیشتر بدانید :
میتونید اینجا یک مقایسه خیلی خوب از معایب و مزایای کامپایلر ها و مفسر ها ببینید .
خیلی از زبان ها هم میتونند کامپایل بشن و هم تفسیر اما با این حال به طور سنتی میدونیم که زبان هایی مثل C++ , C و pascal کامپایلی هستند و کامپایل میشن این در حالی هست که زبان های اسکریپتی مثل جاوا اسکریپت ، پرل تفسیر میشن. برخی از زبان ها مثل جاوا هم از ترکیب هر دو استفاده میکنند و هم به نوعی کامپایل و هم تفسیر میشن.
زبان های سطح بالا ویژگی های مطلوب زیادی دارند :
1 - به راحتی خونده و نوشته میشن اونم به این خاطر که دستوراتی که در این زبان ها وجود دارند به زبان طبیعی نزدیک تر هستند (از فرهان : زبان طبیعی یعنی زبانی که انسان صحبت میکنه مثل فارسی ، انگلیسی ، آلمانی و ...).
2- در زبان های سطح بالا به نسبت زبان های سطح پایین برای انجام یک کار یکسان دستورالعمل های کمتری نیاز هست که بنویسیم. و این باعث میشه که کد برنامه ها خیلی کوتاه بشن و راحت تر بشه فهمیدشون . مثلا توی ++C به راحتی میشه همچین کاری رو توی یک خط کرد :
a = b * 2 + 5;
در حالی که توی زبان اسمبلی ممکنه که 5 یا 6 تا خط دستورالعمل نیاز باشه . (از فرهان : توی سایت learncpp.com مثالی از این که همین مثال بالا رو اگر بخوایم به اسمبلی بنویسیم چه شکلی میشه ننوشته ولی من میخوام واستون این مثال رو بزنم تا درک بهتری داشته باشید پس همین مثال بالا رو با اسمبلی ببینید تا پشماتون بریزه 😂)
b:
.zero 4
a:
.zero 4
__static_initialization_and_destruction_0(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
cmp DWORD PTR [rbp-4], 1
jne .L3
cmp DWORD PTR [rbp-8], 65535
jne .L3
mov eax, DWORD PTR b[rip]
add eax, 10
mov DWORD PTR a[rip], eax
.L3:
nop
pop rbp
ret
_GLOBAL__sub_I_b:
push rbp
mov rbp, rsp
mov esi, 65535
mov edi, 1
call __static_initialization_and_destruction_0(int, int)
pop rbp
ret
😂 فکر کنم بعد از این مثال واقعا موهبت داشتن چیزی مثل زبان های سطح بالا رو درک کرده باشید و همینطور فکر میکنم باید John Backus رو به عنوان سازنده اولین زبان سطح بالا (FORTRAN) توی این قضیه پرستید 👍
3 - قابل حمل بودن : برنامه هایی که به زبان های سطح بالا نوشته شدند رو به راحتی میتونیم روی سیستم های دیگه با CPU متفاوت استفاده کنیم و نیاز نیست از دوباره برنامه رو بنویسیم (تهش فقط نیازه که برنامه رو یه بار از نو کامپایل کنیم که اصلا کار سختی نیست فقط کافیه یه دکمه بزنیم و بوم بعدش راحت میتونیم برنامه رو استفاده کنیم) پس برنامه ها رو میتونیم به راحتی روی سیستم های متفاوت کامپایل (یا تفسیر) کنیم برای مثال :
به طور کلی بحث قابل حمل بودن زبان های برنامه نویسی سطح بالا دوتا استثنا داره : یک این که خیلی از سیستم عامل ها مثل سیستم عامل ویندوز دارای یه سری کد های از قبل ساخته شده هستند که ما میتونیم ازشون در ساخت برنامه برای اون سیستم عامل خاص استفاده کنیم تا کارمون ساده تر بشه . اما به دلیل این که دیگه این برنامه قابل حمل نیست و مثلا نمیشه روی یک سیستم عامل لینوکسی نصبش کرد ، ما در این دوره آموزشی از این کد های از قبل ساخته شده استفاده نمیکنیم . (به این کد ها در زبان انگلیسی میگن : platform-specific)
برخی از کامپایلر ها هم از یک سری افزونه استفاده میکنند که بهش میگیم Compiler-Specific که اگر در هنگام کامپایل کردن ازشون استفاده کنیم دیگه نمیتونیم برناممون رو با کامپایلر های دیگه که از اون افزونه ها استفاده نمیکنند کامپایل کنیم و نیاز داریم تا کد برنامه رو ویرایش کنیم ، که حالا جلو تر وقتی یه کامپایلر با هم نصب کردیم در مورد این ها حرف میزنیم .
قوانین (RULES)، بهترین شیوه ها (BEST PRACTICES) و اخطار ها (WARNINGS)
همینطور که در طول این دوره آموزشی با هم جلو میریم من نکات خیلی مهمی رو براتون بیان میکنم که توی سه دسته بندی ای که این زیر میبینید قرار میگیرند :
قوانین (RULES)
قوانین دستورالعمل هایی هستند که باید حتما حتما مطابق زبان انجام بدیم و اصولا عدم رعایت حتی یک قانون به طور کلی میتونه باعث این بشه که برنامتون کار نکنه!
بهترین شیوه هایی که بهتره ازشون استفاده کنید (BEST PRACTICES)
در این قسمت بهترین شیوه ها (Best Practices) رو بهتون میگم. بهترین شیوه ها چیز هایی هستند که بهتره انجام بدیم به این دلیل که این روش انجام کار ها عموما به صورت یک استاندارد در نظر گرفته میشه یا این که بسیار توصیه میشه. و یا این که خیلی ها دارند به یک شکل خاص یک کاری رو انجام میدند حالا اگر شما از یک روش دیگه استفاده کنید (به عبارتی از روشی استفاده کردید که بقیه انتظارشو نداشتند) و یا این که به نسبت باقی روش ها روش بهتر یا خفن تری هست.
اخطار ها (Warnings)
در قسمت اخطار ها نکاتی رو بهتون میگم که نباید انجام بدید. به این دلیل که به طور کلی منجر به نتایج غیر منتظره میشه .
تبریک میگم و ازتون ممنونم که به آخر این مقاله اومدید ، من فرهان هستم و خیلی خیلی خیلی خوشبختم😍😍، مرسی که هستید و امیدوارم لذت برده باشید ! لینکی که اول هر مقاله هست بخش پادکست اون مقالست ، سعی کردم که برای هر مقاله یک پادکست داشته باشیم تا بتونید موضوعات رو بهتر درک کنید و این کار رو به این خاطر میکنم که مشکلی در خواندن درست مقالات نداشته باشید ، این مقاله آموزشی، ترجمه ی دومین درس فصل صفرم سایت learncpp.com هستش که لینک این مطلب رو براتون میزارم : برای رفتن به منبع این مقاله کلیک کنید
خوشحال میشم نظرتون رو در مورد ترجمه بدونم و این که این اولین تجربه ی ترجمه من هست 💗 و این که تا درودی دیگر بدرود.
-فرهان