زبان برنامه نویسی سی/علائم و عملگرهای دیگر و اولویت‌ها: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
خط ۲۰:
عملگر '''پرانتز و آکولاد''' : عملگر پرانتز به صورت جفت باز و بسته در مقابل یک شناسه باعث می‌شود تا شناسه به عنوان تابع تعریف شود که سپس باید بعد از پرانتز بسته یک جفت آکولاد به صورت باز و بسته نوشته شوند که بدنه تابع را تشکیل می‌دهد . ضمناً می‌توان تابع را اعلان نمود ( prototype ) سپس تعریف کرد و هر جا لازم شد احضار و یا همان فراخوانی نمود که باز هم با کمک عملگر پرانتز امکان پذیر است ( رجوع کنید به فصل تابع )
<br><br>
عملگر '''سمی کالن''' : عملگر ; که نام آن سِمی کالُن ( semi colon ) است پس از هر حکم باعث به اجرا گذاشته شدن آن توسط کامپایلر می‌شود . هر حکم می‌تواند اعلان و یا تعریف متغیرهای پایه ، ترکیبی و یا اعلان و فراخوانی تابع باشد ( که تابع ممکن است یک تابع کتابخانه‌ای باشد ) و البته برخی دستورها مثل continue یا return . مثال : ;float g
<br><br>
عملگر '''نقطه و اشاره‌گر به عضو''' : عملگر « . » یا همان دات و یا نقطه ، اگر پس از شناسه ی نمونه ی یک ساختمان و یا اجتماع بیاید که عملگر نقطه ، پیش از نام یکی از اعضای آن ساختمان یا اجتماع است ، دسترسی به آن شی ( عضو ساختمان یا اجتماع ) را فراهم می‌کند . همچنین عملگر <- باعث می‌شود تا با نوشتن نام یک نمونه اشاره‌گر به ساختمان و یا اجتماع پیش از عملگر و نوشتن عضوی از آن ساختمان یا اجتماع ، پس از عملگر ، نمونه اشاره‌گر ما به عضو اشاره شده دسترسی پیدا کند . دقت کنید که در نوشتن هیچ کدام از نام نمونه و یا نام نمونه اشاره‌گر و همچنین عضو ساختمان یا اجتماع نباید فاصله‌ای بگذارید ( رجوع کنید به موضوع ساختمان و اجتماع و اشاره‌گر )
<br><br>
عملگر '''اشاره و آدرس دهی''' : عملگر * که نام آن استریسک یا همان ستاره است اگر پس از کلیدواژه‌های سازنده داده‌ها بیاید ، داده را به عنوان اشاره‌گر تعریف می‌کند . سپس برای مقدار دهی آن باید از عملگر آدرس دهی یعنی & که نام امپرسند است ، استفاده نمود تا با قرار دادن شناسه یک داده دیگر در مقابل آن ، اشاره‌گر به آن داده دیگر اشاره نماید . سپس برای دسترسی به آن داده ، دوباره باید از عملگر استریسک اما این بار بدون نوشتن کلیدواژه‌های ایجاد کننده داده‌ها استفاده نمود ( رجوع کنید به موضوع اشاره‌گر )
خط ۷۹:
;int a = 6 یا ;float y = 53.84795
 
در تمامی مقداردهی‌ها عملوند سمت چپ باید یک شناسه باشد ولی عملوند سمت راست می‌تواند یک مقدار عددی یا حرفی ، شناسه‌ای که مقدار دارد و یا مقداری را باز می‌گرداند ( تابع ) و یا یک ماکرو باشد . بدین ترتیب مقدار و موجودی عملوند سمت راست در عملوند سمت چپ که یک شناسه است قرار می‌گیرد . اما علاوه بر عملوندعملگر مقداردهی ساده ، عملوندهایعملگرهای مقداردهی ترکیبی نیز وجود دارند که شامل :
 
{{چپ‌چین}}
خط ۹۴:
{{پایان چپ‌چین}}
 
می‌شودمی‌شوند . عملگرهای مقداردهی ترکیبی با عملگرهای منطقی و بیتی و یا حسابی به همراه عملگر مقداردهی ساده بدین گونه عمل را بر روی عملوند راست و چپ اعمال می‌کند ( عمل عملگر را انجام می‌دهند ) و نتیجه را در عملوند سمت چپ ، ذخیره می‌کنند . مثلاً ;a += 5 هر مقداری که a داشته باشد را با 5 جمع می‌کند و حاصل را در a ذخیره می‌کند . اگر a در مثال بالا مقدار 4 می‌داشت بعد از حکم بالا مقدار 9 را می‌یافت . یا مثلاً در مورد عملگر =- ابتدا عملوند سمت راست از عملوند سمت چپ کم می‌شود و سپس حاصل به دست آمده ، در عملوند سمت چپ ذخیره می‌شود ؛ در مورد عملگرهای دیگر نیز عملیات به همین شکل انجام می‌شود ؛ یعنی =* عملوند سمت چپ را در عملوند سمت راست ، ضرب می‌کند و مقدار حاصل را در عملوند سمت چپ ذخیره می‌کند و =/ عملوند سمت راستچپ را بر عملوند سمت چپراست ، تقسیم می‌کند و مقدار حاصل را در عملوند سمت چپ ذخیره می‌کند . به همین ترتیب =% عملوند سمت چپ را بر عملوند سمت راست ، تقسیم می‌کند و باقیمانده را در عملوند سمت چپ ذخیره می‌کند ، =& عملوند سمت راست را با عمل « و بیتی » بر روی عملوند سمت چپ اعمال می‌کند و مقدار حاصل را در عملوند سمت چپ ذخیره می‌کند ؛ به همین شکل =^ و =| به ترتیب عملیات « زور بیتی » و « یا بیتی » را انجام می‌دهند . موارد بالا با توجه به اولویتشان از یکدیگر جدا شده‌اند که آخرین اولویت در عملگرهای مقدار دهی متعلق به =>> و =<< یعنی به ترتیب مقدار دهی انتقال به چپ بیتی و مقدار دهی انتقال به راست بیتی می‌باشند که اولی عملیات انتقال به چپ را به اندازه عملوند سمت راست بر روی عملوند سمت چپ انجام می‌دهد و حاصل را عملوند سمت چپ ذخیره می‌کند و دومی عملیات انتقال به راست را به اندازه عملوند سمت راست بر روی عملوند سمت چپ انجام می‌دهد و حاصل را در عملوند سمت چپ ذخیره می‌کند
 
'''دقت کنید :''' عملگرهای مقداردهی ترکیبی فقط بر روی اعداد عمل می‌کنند و هر کدام ، قوانین عملگر ترکیب شده را در مورد عملوندهای خود انتظار دارند و اگر جز این باشد یا کامپایلر خطا می‌گیرد یا برنامه شما دارای باگ ( Bug ) خواهد بود
خط ۱۱۰:
همان طور که از علم ریاضی به یاد دارید ، عمل ضرب و تقسیم بر عمل جمع و تفریق ، اولویت دارند و اگر از هم جدا نشده باشند هر کدام که در سمت چپ‌تر قرار داشته باشد زودتر مورد ارزیابی قرار می‌گیرد . در مثال بالا با کمک پرانتزها کل عبارت را به چند زیر عبارت تقسیم کرده‌ایم که اگر عبارت مقدار ذخیره شده در یک float باشد ، مقدار بازگردانده شده 30.375 خواهد بود چرا که ابتدا 7 * 3 و 5 + 2 مورد ارزیابی قرار می‌گیرند که حاصل اولی 21 و حاصل دومی 7 است که در هم ضرب می‌شوند و عدد 147 به دست می‌آید که سپس تقسیم بر 8 می‌شود که 18.375 به دست خواهد آمد که جمع می‌شود با 6 * 2 ( که می‌شود 12 ) و در نهایت عدد 30.375 به دست می‌آید . اما اگر از پرانتزها استفاده نمی‌کردیم پاسخ ما 54.625 می‌شد
 
بنابراین « اولویت » یا Precedence به دیرتر یا زودتر لحاظ شدن یک عنصر زبان C می‌گویند . بالاترین اولویت در یک برنامه C با یادداشت‌ها (Comments) می‌باشد که هر آنچه بعد از دو اسلش / به صورت // در آن خط قرار گرفته باشد یا هر آنچه بین */ و /* قرار گرفته باشد نادیده گرفته خواهد شد . اولویت بعدی با پیش‌پردازنده‌ها Preprocessors که با علامت شارپ (Sharp) # آغاز می‌شوند واست که زودتر از عنصرهای دیگر سازنده متن برنامه C مورد ارزیابی و لحاظ شدن قرار می‌گیرند . سپس توابع و حکم‌ها در اولویت‌ها هستند که در آنها ممکن است بخش‌هایی از عملوندهایی به همراه عملگرهای بازگو شده در این فصل ، استفاده شده باشند که به آنها عبارت می‌گوئیم . عبارت‌ها می‌توانند ترکیبی باشند و یا توسط پرانتزها به چند یا چندین زیر عبارت تقسیم شده باشند که در هر زیر عبارت نیز کامپایلر در نهایت باید با توجه به اولویت عملگرها ؛ زیر عبارت‌ها و در نهایت کل عبارت را ارزیابی نماید
 
در یک عبارت و یا حتی زیر عبارت ، اولویت‌ها بدین ترتیب می‌باشند ( که اگر چند عملگر اولویت یکسانی داشته باشند ، آنکه در سمت چپ‌تر قرار دارد زودتر مورد ارزیابی قرار خواهد گرفت ) :
خط ۱۲۲:
۴ − عملگر sizeof ، عملگر اشاره‌گر و آدرس دهی ( * و & ) ، افزایش و کاهش پیش از شناسه ( a++ و a-- ) ، نه منطقی (!) ، نه بیتی (~)
 
۵ − پرانتزهای کست‌کردن (int(a))
 
۶ − ضرب ، تقسیم و باقی‌مانده ( * و / و % )
خط ۱۵۴:
==عملگر sizeof==
 
عملگر sizeof که از اسم آن نیز پیداست ، اندازه و حجم اشغال شده توسط داده‌ای که به عنوان عملوند به آن ارجاع داده می‌شود را در مبنای دهدهی و واحد بایت (Byte) باز می‌گرداند . دقت کنید که sizeof نمی‌تواند اندازه اشغال شده توسط تابع‌ها ، bit-field ها و یا داده‌های ناقص و ناتمام (incomplete types) را بازگرداند ( علیرغم اینکه داده هستند ) ؛ پیش از این به انواع داده ناقص و ناتمام اشاره نمودیم که شامل داده‌های پوچ (void) ، آرایه‌هایی با تعداد عنصرهای نامعین و ساختمان (structure) و یا اجتماعی (union) که داده‌های تعریف نشده دارند و یا در خود ، ساختمان یا اجتماعی دارند که داده‌های تعریف نشده دارند می‌شود
 
عملگر sizeof را به چند توع می‌توان به کار برد :
خط ۱۶۲:
۲ − نام یک شناسه را که جز شناسه تابع و یا bit-field و یا داده‌ای که ناقص و ناتمام است در مقابل sizeof می‌نویسید : ;sizeof a
 
۳ − یک عبارت را داخل یک جفت پرانتز باز و بسته در مقابل sizeof می‌نویسید ؛ دقت کنید که در این فرایند ، عبارت ، خروجی نمی‌دهد بلکه فقط در همین حد ارزیابی می‌شود که نوع داده نهایی چه خواهد بود و اندازه آن نوع داده را sizeof باز می‌گرداند مثلاً می‌نویسید :