در #C ما میتوانیم با استفاده از تبدیل ضمنی (خودکار) و یا تبدیل صریح (میتوانیم نحوه تبدیل را مشخص کنیم)، یک نوع داده ای را به نوع داده ای دیگر تبدیل کنیم.
این مقاله، سرفصلی از دوره آموزشی زیر میباشد:
- راه اندازی محیط توسعه
- Data Type ها، Declaration ها و تعریف متغیرها در #C
- عملگرها در #c
- تبدیل نوع های داده ای
- ورودی و خروجی در #c
- کار با رشته ها
- شرطها در #c
- حلقه ها (While، Do-While، For)
- مدیریت خطاها
- Access Modifier ها
- متدها
- کلمات کلیدی Ref و Out
- بازگشت و متدهای بازگشتی
- آرایه ها (آرایه های تک بعدی و چند بعدی)
- کار با فایلها، StreamWriter و StreamReader
- کار با فایلها، File و Directory
اگر می خواهید محتویات کامل این دوره را ببینید ، می توانید بر روی لینک مبانی #c کلیک کنید.
حال اجازه دهید بیشتر در مورد این موضوع صحبت کنیم.
در این مقاله، ما قصد داریم موضوعات زیر را پوشش دهیم:
تبدیل ضمنی
خیلی از داده های مختلف با استفاده از انواع داده ای مختلف تفسیر میشوند. برای مثال، عدد 74 میتواند به عنوان یک integer بلکه همچنین به عنوان یک double تفسیر شود(74.0). دو حالت وجود دارد که تبدیل ضمنی در انها اعمال میشود.
اولین مورد زمانیست که ما یک expression را محاسبه میکنیم. کامپایلر به طور خودکار نوع های داده ای که ما در آن expression استفاده میکنیم را به همدیگر وقف میدهد:
1 2 3 4 5 6 7 8 9 |
class Program { static void Main(string[] args) { double b = 12.45; int x = 10; b = b + x; } } |
در کد بالا، متغیر b از نوع double است و متغیر x از نوع int. در عبارت b + x، کامپایلر به طور ضمنی، x را از int به double تبدیل میکند و سپس نتیجه مورد نظر را به b اختصاص میدهد.
دومین حالت برای یک تبدیل زمانیست که کامپایلر نتیجه را در یک متغیر ذخیره میکند:
در این مثال ما میبینیم که هر دو متغیر y و x از نوع int هستند اما نتیجه از نوع double است.
حالا به این مثال توجه کنید:
1 2 3 4 |
int x = 21; int y = 5 double b = x/y; |
نظرتان چیست؟ چه مقداری در متغیر b ذخیره میشود؟
پاسخ: “نتیجه 4.2” صحیح نیست. البته سوالی که اینجا مطرح میشود: “اما چرا”؟
کامپایلر سمت راست expression را اول محاسبه میکند و تنها نتیجه مورد نظر را به double تبدیل میکند. بنابراین سمت راست expression یعنی x/y شامل اعداد integer است، بنابراین نتیجه نیز یک integer است که در این مثال نتیجه 4 میباشد (مقدار کوتاه میشود). بعد از این محاسبه، کامپایلر نتیجه را به داخل یک double تبدیل میکند و مقدار را به داخل متغیر b اختصاص میدهد:
اگر بخواهیم، میتوانیم با استفاده از تبدیل صریح بر روی متغیر x و یا y، این مشکل را برطرف کنیم.
تبدیل صریح
برای تبدیل صریح، ما باید یک کد اضافی را برای تبدیل یک نوع داده ای به نوع داده ای دیگر بنویسیم. ما دو شیوه متفاوت داریم، استفاده از یک عملگر cast و یا استفاده از کلاس Convert
.
حال به مثال زیر نگاه کنید:
همانطور که در این مثال میبینید کامپایلر از یک تبدیل نامعتبر شکایت میکند. چیزی که ما اینجا نادیده گرفته ایم استفاده از عملگر cast است. بنابراین باید به این صورت از آن استفاده کنیم:
با استفاده از تبدیل cast (که اینجا از نوع int است)، ما میتوانیم با خیال آسوده، نوع های داده ای خود را cast کنیم و کامپایلر آن را تایید میکند. اما چیزی که ما اینجا میبینیم آن نتیجه ای که مد نظر ما است نمیباشد. اما نتیجه درست است. درک این نکته خیلی مهم است که زمانیکه ما، یک نوع با یک دامنه مقدار بزرگتر را به یک نوع با دامنه مقدار کوچکتر تبدیل میکنیم، عملگر cast در این حالت میتواند داده ها را کوچکتر نماید. دقیقا مانند کاری که با double در مثال انجام دادیم و آن را به int تبدیل کردیم.
حالا ما میخواهیم در مثالی که در قسمت تبدیل ضمنی انجام داده بودیم، عملگر cast را برای گرفتن نتیجه درست اعمال کنیم:
1 2 3 4 5 6 7 8 9 10 |
class Program { static void Main(string[] args) { int x = 21; int y = 5; double b = (double)x / y; } } |
نتیجه اینجا 4.2 خواهد بود.
استفاده از کلاس Convert
همانطور که در ابتدا گفته بودیم، ما میتوانیم از کلاس Convert به همراه متدهای static آن، برای تبدیل صریح یک نوع داده ای پایه به نوع داده ای پایه دیگر استفاده کنیم:
نتیجه گیری
بسیار عالی.
حال ما تبدیل نوع های داده ای و نحوه رفتار تبدیل ضمنی و صریح در #Cرا یاد گرفتیم.
در مقاله بعدی، ما قصد داریم در مورد ساختار خطی در #C صحبت کنیم.