پرش به مطلب اصلی

عملگرها و عبارات


• قراردادهای نمادین

عملکرد برخی از عملگرها به انواع خاص عملوندها بستگی دارد. بنابراین، عملوندها به این صورت نشان داده می‌شوند:

عملگرهاکاربرد
eهر عبارت؛
vهر عبارتی که می‌توان به آن مقدار اختصاص داد (عبارات "lvalue")؛
aیک آرایه؛
fیک تابع؛
sیک نماد —که می‌تواند یک متغیر، یک ثابت یا یک تابع باشد.

• عبارات

یک عبارت شامل یک یا چند عملوند با یک عملگر است. عملوند می‌تواند یک متغیر، یک ثابت یا عبارت دیگری باشد. یک عبارت که با یک نقطه‌ویرگول دنبال می‌شود، یک دستور است.

لیست: مثال‌هایی از عبارات


v++
f(a1, a2)
v = (ia1 * ia2) / ia3

• عملیات حسابی

علامتتوضیحات
+e1 + e2
نتیجه جمع e1 و e2
-e1 - e2
نتیجه تفریق e1 و e2
-e
نتیجه نفی حسابی a (مکمل دو).
*e1 * e2
نتیجه ضرب e1 و e2.
/e1 / e2
نتیجه تقسیم e1 بر e2. نتیجه به نزدیک‌ترین مقدار صحیح که کمتر یا مساوی خارج قسمت است گرد می‌شود. هر دو مقدار منفی و مثبت به سمت پایین گرد می‌شوند، یعنی به سمت −∞.
%e1 % e2
نتیجه مدولوس (باقیمانده تقسیم) e1 بر e2. مدولوس همیشه یک مقدار مثبت است.
++v++
v را 1 واحد افزایش می‌دهد؛ نتیجه عبارت، مقدار v قبل از افزایش است.
++v
v را 1 واحد افزایش می‌دهد؛ نتیجه عبارت، مقدار v پس از افزایش است.
--v--
v را 1 واحد کاهش می‌دهد؛ نتیجه عبارت، مقدار v قبل از کاهش است.
--v
v را 1 واحد کاهش می‌دهد؛ نتیجه عبارت، مقدار v پس از کاهش است.
نکات:عملگر یکانی + در pawn تعریف نشده است
عملگرهای ++ و -- عملوند را تغییر می‌دهند. عملوند باید یک lvalue باشد.

• دستکاری بیت

علامتتوضیحات
~~e
نتیجه مکمل یک e است.
>>e1 >> e2
نتیجه شیفت حسابی به راست e1 به اندازه e2 بیت است. عملیات شیفت signed است: چپ‌ترین بیت e1 به بیت‌های خالی در نتیجه کپی می‌شود.
>>>e1 >>> e2
نتیجه شیفت منطقی به راست e1 به اندازه e2 بیت است. عملیات شیفت unsigned است: بیت‌های خالی نتیجه با صفر پر می‌شوند.
<<e1 << e2
نتیجه مقدار e1 شیفت داده شده به چپ به اندازه e2 بیت است؛ بیت‌های سمت راست به صفر تنظیم می‌شوند. تفاوتی بین شیفت حسابی و منطقی به چپ وجود ندارد
&e1 & e2
نتیجه "and" منطقی بیت به بیت e1 و e2 است.
|e1 | e2
نتیجه "or" منطقی بیت به بیت e1 و e2 است.
^e1 ^ e2
نتیجه "exclusive or" بیت به بیت e1 و e2 است.

• انتساب

نتیجه یک عبارت انتساب، مقدار عملوند سمت چپ پس از انتساب است. عملوند سمت چپ نمی‌تواند tag داشته باشد.

علامتتوضیحات
=v = e
مقدار e را به متغیر v اختصاص می‌دهد.
اگر "v" یک آرایه باشد، باید اندازه صریح داشته باشد و "e" باید یک آرایه با همان اندازه باشد؛ "e" ممکن است یک رشته یا یک آرایه لیترال باشد.
نکتهعملگرهای زیر یک انتساب را با یک عملیات حسابی یا بیتی ترکیب می‌کنند؛ نتیجه عبارت، مقدار عملوند سمت چپ پس از عملیات حسابی یا بیتی است.
+=v += e
v را با a افزایش می‌دهد.
-=v -= e
v را با e کاهش می‌دهد
*=v *= e
v را در e ضرب می‌کند
/=v /= e
v را بر e تقسیم می‌کند.
%=v %= e
باقیمانده تقسیم v بر e را به v اختصاص می‌دهد.
>>=v >>= e
v را به صورت حسابی به اندازه e بیت به راست شیفت می‌دهد.
>>>=v >>>= e
v را به صورت منطقی به اندازه e بیت به راست شیفت می‌دهد.
<<=v <<= e
v را به اندازه e بیت به چپ شیفت می‌دهد.
&=v &= e
یک "and" بیتی به v و e اعمال می‌کند و نتیجه را به v اختصاص می‌دهد.
|=v |= e
یک "or" بیتی به v و e اعمال می‌کند و نتیجه را به v اختصاص می‌دهد.
^=v ^= e
یک "exclusive or" بیتی به v و e اعمال می‌کند و نتیجه را به v اختصاص می‌دهد.

• رابطه‌ای

یک "false" منطقی با یک مقدار صحیح 0 نشان داده می‌شود؛ یک "true" منطقی با هر مقداری غیر از 0 نشان داده می‌شود. نتایج مقدار عبارات رابطه‌ای یا 0 یا 1 هستند، و tag آنها به "bool:" تنظیم می‌شود.

علامتتوضیحات
==e1 == e2
اگر e1 برابر با e2 باشد، نتیجه یک "true" منطقی است.
!=e1 != e2
اگر e1 با e2 متفاوت باشد، نتیجه یک "true" منطقی است.
نکته:عملگرهای زیر ممکن است "زنجیره‌ای" شوند، مانند عبارت "e1 <= e2 <= e3"، با این معنی که نتیجه "1" است اگر همه مقایسه‌های فردی برقرار باشند و "0" در غیر این صورت.
<e1 < e2
اگر e1 کوچکتر از e2 باشد، نتیجه یک "true" منطقی است.
<=e1 <= e2
اگر e1 کوچکتر یا مساوی e2 باشد، نتیجه یک "true" منطقی است.
>e1 > e2
اگر e1 بزرگتر از e2 باشد، نتیجه یک "true" منطقی است.
>=e1 >= e2
اگر e1 بزرگتر یا مساوی e2 باشد، نتیجه یک "true" منطقی است.

• بولی

یک "false" منطقی با یک مقدار صحیح 0 نشان داده می‌شود؛ یک "true" منطقی با هر مقداری غیر از 0 نشان داده می‌شود. نتایج مقدار عبارات بولی یا 0 یا 1 هستند، و tag آنها به "bool" تنظیم می‌شود.

علامتتوضیحات
!!e
اگر e از نظر منطقی "false" بود، نتیجه یک "true" منطقی است.
|e1 | e2
اگر e1 یا e2 (یا هر دو) از نظر منطقی "true" باشند، نتیجه یک "true" منطقی است. عبارت e2 فقط در صورتی ارزیابی می‌شود که e1 از نظر منطقی "false" باشد.
&&e1 && e2
اگر هم e1 و هم e2 از نظر منطقی "true" باشند، نتیجه یک "true" منطقی است.
عبارت e2 فقط در صورتی ارزیابی می‌شود که e1 از نظر منطقی "true" باشد.

• متفرقه

علامتتوضیحات
[]a[e]
شاخص آرایه: نتیجه cell e از آرایه a است.
{}a{e}
شاخص آرایه: نتیجه کاراکتر e از آرایه "packed" a است.
()f(e1,e2,...eN)
نتیجه مقداری است که توسط تابع f برگردانده می‌شود. تابع با آرگومان‌های e1، e2، ... eN فراخوانی می‌شود. ترتیب ارزیابی آرگومان‌ها تعریف نشده است (یک پیاده‌سازی ممکن است انتخاب کند که آرگومان‌های تابع را به ترتیب معکوس ارزیابی کند).
? :e1 ? e2 : e3
بسته به مقدار e1، نتیجه یا e2 یا e3 است. عبارت شرطی یک عبارت مرکب با یک عملگر دو قسمتی، "?" و ":" است. اگر e1 از نظر منطقی "true" باشد، عبارت e2 ارزیابی می‌شود، اگر e1 از نظر منطقی "false" باشد، e3 ارزیابی می‌شود.
:tagname: e
override تگ؛ مقدار عبارت e تغییر نمی‌کند، اما تگ آن تغییر می‌کند. برای اطلاعات بیشتر صفحه 68 را ببینید.
,e1, e2
نتیجه e2 است، e1 قبل از e2 ارزیابی می‌شود. اگر در لیست‌های آرگومان تابع یا یک عبارت شرطی استفاده شود، عبارت کاما باید در پرانتز محصور شود.
defineddefined s
اگر نماد تعریف شده باشد، نتیجه مقدار 1 است. نماد ممکن است یک ثابت (صفحه 98)، یا یک متغیر سراسری یا محلی باشد.
تگ این عبارت bool: است.
sizeofsizeof s
نتیجه اندازه متغیر مشخص شده بر حسب "عناصر" است. برای متغیرهای ساده و برای آرایه‌هایی با یک بعد، یک عنصر یک cell است. برای آرایه‌های چند بعدی، نتیجه تعداد عناصر آرایه در آن بعد است —[] را به نام آرایه اضافه کنید تا یک بعد پایین‌تر/جزئی‌تر را نشان دهید. اگر اندازه یک متغیر نامشخص باشد، نتیجه صفر است.
هنگام استفاده در یک مقدار پیش‌فرض برای یک آرگومان تابع، عبارت در نقطه فراخوانی تابع ارزیابی می‌شود، نه در تعریف تابع.
statestate s
که در آن "s" نام یک state است که به صورت اختیاری با نام اتوماتون پیشوند شده است، این عملگر اگر اتوماتون در state مشخص شده باشد نتیجه مقدار 1 و در غیر این صورت 0 است.
تگ این عبارت bool: است.
tagoftagof s
نتیجه یک عدد منحصر به فرد است که نشان‌دهنده تگ متغیر، ثابت، نتیجه تابع یا برچسب تگ است.
هنگام استفاده در یک مقدار پیش‌فرض برای یک آرگومان تابع، عبارت در نقطه فراخوانی تابع ارزیابی می‌شود، نه در تعریف تابع.
chare char
نتیجه تعداد cell هایی است که برای نگهداری یک آرایه packed از e کاراکتر لازم است.

• اولویت عملگر

جدول زیر عملگرها را با اولویت یکسان گروه‌بندی می‌کند، شروع با گروه عملگر با بالاترین اولویت در بالای جدول.

اگر ترتیب ارزیابی عبارت به صراحت توسط پرانتزها مشخص نشده باشد، توسط قوانین انجمنی تعیین می‌شود. به عنوان مثال: ab/c معادل با (ab)/c است به دلیل انجمن چپ به راست، و a=b=c معادل با a=(b=c) است.

علامتتوضیحاتانجمن
()فراخوانی تابعچپ به راست
[]شاخص آرایه (cell)
شاخص آرایه (کاراکتر)
!not منطقیراست به چپ
~مکمل یک
-مکمل دو
++افزایش
--کاهش
:override تگ
charتبدیل تعداد کاراکترهای packed به cell ها
definedوضعیت تعریف نماد
sizeofاندازه نماد در "عناصر"
stateشرط اتوماتون/state
tagofعدد منحصر به فرد برای تگ
*ضربچپ به راست
/تقسیم
%مدولوس
+جمعچپ به راست
-تفریق
>>شیفت به راستچپ به راست
>>>شیفت منطقی به راست
<<شیفت به چپ
&and بیتیچپ به راست
^exclusive or بیتیچپ به راست
|or بیتیچپ به راست
<کوچکتر ازچپ به راست
<=کوچکتر یا مساوی با
>بزرگتر از
>=بزرگتر یا مساوی با
==برابریچپ به راست
!=نابرابری
&&and منطقیچپ به راست
||or منطقیچپ به راست
? :شرطیراست به چپ
=انتسابراست به چپ
*= /= %= += -= >>= >>>= <<= &= ^= |=انتساب ترکیبی
,کاماچپ به راست

نام‌های تگ: 68

مثال: 77

همچنین صفحه 114 را برای مشخص‌کننده‌های state ببینید


برگشت به فهرست