زبان برنامه نویسی سی/علائم و عملگرهای دیگر و اولویتها: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
بدون خلاصۀ ویرایش |
بدون خلاصۀ ویرایش |
||
خط ۱۴۷:
==عملگر sizeof==
عملگر sizeof که از اسم آن نیز پیداست ، اندازه و حجم اشغال شده توسط دادهای که به عنوان عملوند به آن ارجاع داده میشود را در مبنای دهدهی و واحد بایت (Byte) باز میگرداند . دقت کنید که sizeof نمیتواند اندازه اشغال شده توسط تابعها ، bit-field ها و یا دادههای ناقص و ناتمام (incomplete types) را بازگرداند ( علیرغم اینکه داده هستند ) ؛ پیش از این به انواع داده ناقص و ناتمام اشاره نمودیم که شامل دادههای پوچ (void) ، آرایههایی با تعداد عنصرهای نامعین و ساختمان (structure) و یا اجتماعی که دادههای تعریف نشده دارند و یا در خود ساختمان یا اجتماعی دارند که دادههای تعریف نشده دارند
عملگر sizeof را به چند توع میتوان به کار برد :
۱ − نام نوع داده را داخل یک جفت پرانتز باز و بسته در مقابل sizeof مینویسید : ;sizeof (float)
۲ − نام یک شناسه را که جز شناسه تابع و یا bit-field و یا داده ناقص و ناتمام است در مقابل sizeof مینویسید : ;sizeof a
۳ − یک عبارت را داخل یک جفت پرانتز در مقابل sizeof مینویسید ؛ دقت کنید که در این فرایند ، عبارت خروجی نمیدهد بلکه فقط در همین حد ارزیابی میشود که نوع داده نهایی چه خواهد بود و اندازه آن نوع داده را sizeof باز میگرداند مثلاً مینویسید :
{{چپچین}}
<source lang="C#">
int a = 5, b = 0;
double h = 59.85647;
b = sizeof(a+b)
</source>
{{پایان چپچین}}
در مثال بالا یک متغیر صحیح که ۴ بایت دارد با یک متغیر اعشاری با دقت دوبرابر که ۱۰ بایت دارد جمع شده است ، مهم نیست که نتیجه چه میشود ، چون طی تبدیل double از int بزرگتر است sizeof مقدار اشغال شده توسط double را باز میگرداند ( یعنی عدد ۱۰ )
در دادههای ترکیبی مثل ساختمان ، sizeof اندازه اشغال شده توسط کل ساختمان را که شامل فضاهای خالی اضافه نیز میشود ، باز میگرداند . مقدار بازگردانده شده توسط sizeof یک عدد صحیح بدون علامت است که در اکثر کامپایلرها از نوع داده size_t که در فایل سرآیند stddef تعریف شده است میباشد . اینکه size_t چه نوع دادهای دارد توسط استاندارد تعریف نشده است اما در اکثر کامپایلرها صحیح بدون علامت unsigned int و یا بلند بدون علامت unsigned long int است
با کمک عملگر sizeof شما میتوانید پی ببرید که در هر سیستم ، اندازه اشغال شده توسط هر نوع داده چه قدر است ؛ اندازه اشغال شده توسط ساختمان یا اجتماع شما چه قدر است و با آرایهای که اندیس آن را ننوشتهاید اما آن را با مقداردهی تعریف کردهاید ( مثلاً یک رشته ) ، چند عنصر دارد . بدین ترتیب شما خواهید دانست که چه قدر باید حافظه کامپیوتر را مصرف کنید . مثال :
{{چپچین}}
<source lang="C#">
#include <stddef.h>
#include <stdio.h>
static const int values[] = { 1, 2, 48, 681 };
#define ARRAYSIZE(x) (sizeof x/sizeof x[0])
int main (int argc, char *argv[])
{
size_t i;
for (i = 0; i < ARRAYSIZE(values); i++)
{
printf("%d\n", values[i]);
}
return 0;
}
</source>
{{پایان چپچین}}
در مثال بالا فایل سرآیند stddef که سرنام standard definitions میباشد را به علت اینکه میخواستیم در برنامه از نوع داده size_t استفاده کنیم و البته stdio که سرنام standard Input/Output میباشد را جهت استفاده از تابع کتابخانهای printf که سرنام print formatted میباشد توسط پیشپردازنده include ضمیمه برنامه خود نمودیم . ابتدا یک آرایه صحیح ثابت مختص فایل برنامه فعلی با نام values تعریف نمودیم که چهار عنصر دارد . سپس با کمک پیشپردازنده define یک تابع با نام ARRAYSIZE تعریف نمودیم که یک پارامتر دارد با نام x که این x اندازه x است تقسیم اندازه یکی از عنصرهای x که تعریف کردهایم اولی باشد ( یعنی عنصر اول که میشود اندیس 0 ) سپس در تابع main که تابع اصلی برنامه است یک متغیر از نوع داده size_t با نام i تعریف نمودهایم که یک صحیح بدون علامت است . حالا از i که مقدار آن 0 باشد تا زمانی که تابع ARRAYSIZE آرگومان values را میپذیرد و مقدار 0 ندارد ، i یک واحد یک واحد افزایش مییابد و در هر دفعه بلوک خود را به اجرا میگذارد که این بلوک چاپ مقدار عنصرهای آرایه values میباشد که در خروجی خطدستوری نمایش داده خواهد شد
[[رده:زبان برنامه نویسی سی]]
|